티스토리 뷰

반응형

 


Unowned References and Implicitly Unwrapped Optional Properties
미소유 참조, 암시적 언래핑 옵셔널 프로퍼티들

이전 포스팅에서 언급 된 강한순환참조 문제의 해결이 필요했던 다양한 보편적 시나리오들은 weak, unowned 참조에대한 활용예시를 보여주었습니다.

Person, Apartment 예시를 다룬 포스팅에서는 nil이 되는 것이 허용 된 두 프로퍼티에서의 상황을 보여주었습니다. 이는 약한참조를 통해 해결될 수 있는 최상의 시나리오 였습니다.

Customer와 CreditCard 예시를 다룬 포스팅에서는 단 하나의 프로퍼티가 nil 처리가 될 경우 강한순환참조가 발생할 수 있는 상황(Customer 인스턴스의 멤버, card 프로퍼티에서 Customer 인스턴스 자기자신을 다시 참조함으로서 발생가능한 강한순환 참조)을 보여주었습니다.


그러나 이번에는 두개의 프로퍼티들이 항상 반드시 값을 가지고 있고, 한번 초기화가 완료되면 절대 nil이 되지 않는 경우입니다.
해당 시나리오에서는 강제 언래핑(!) 옵셔널 변수를 갖는 클래스 인스턴스에 미소유 참조(unowned reference)를 사용할 경우 유용합니다.
 이 경우 일단 초기화가 끝나면 순환참조를 피하는 동시에 옵셔널 언래핑(옵셔널 바인딩이나 옵셔널 벗기기 등)을 할 필요 없이 직접적으로 값 접근이 가능해집니다. 이번 세션에서는 이러한 관계를 설명하는 방법에 대해서 다뤄보겠습니다.

아래의 예시는 Country, City 두 개의 클래스들 정의하고 있으며, 각각의 클래스는 멤버로 서로의 클래스 인스턴스를 저장하고 있습니다.
 해당 데이터 모델을 보면, 모든 countrycapitalCity를 반드시 항상 가지고 있어야 합니다. (capitalCity: City!) 그리고 모든 city들은 항상 country를 소유해야 합니다. 이를 표현하기 위해, Country 클래스는 capitalCity 프로퍼티를 갖고 있으며, City 클래스는 country 프로퍼티를 갖고 있습니다.


두 개의 클래스 간의 상호의존성을 설정하기 위해 City 클래스는 Country인스턴스를, Country 클래스는 City 인스턴스를 생성자를 통해 받고 있습니다.

City에 대한 생성자는 Country 생성자 내에서 호출됩니다. 그러나, Country에 대한 생성자는 새로운 Country 인스턴스가 완전히 초기화 될때까지 self 를 City 생성자로 전달하지 않습니다.

이러한 이유는 Two-Phase Initialization 에서 설명하고 있습니다.

 

이러한 요구사항에 대응하기 위해, Country 내의 capitalCity 프로퍼티를 암시적 언래핑 '!' 옵셔널 변수로 선언하며 이를 표현하기 위해 해당 프로퍼티의 타입 뒤에 '!' 를 붙여줍니다. (City!) 이는 즉, capitalCity: City! 프로퍼티는 다른 optional 변수들 처러 nil을 기본 값으로 갖지만 옵셔널을 벗길 필요 없이 접근 될 수 있음을 의미합니다.
 이에 대한 자세한 내용은 Implicity Unwrapped Optionals 를 참조하시면 됩니다.

capitalCity는 기본값으로 nil을 갖고 있기 때문에, 새로운 Country 인스턴스는 생성자 호출 후 name 프로퍼티가 설정 되자마자 capitalCity 또한 완벽하게 초기화 되어져야 합니다.
 이 의미는 즉, Country 생성자는 name 프로퍼티가 설정 되자마자 암시적으로 self 프로퍼티를 참조하고 전달할 수 있음을 의미합니다. Country 생성자는 Country 생성자가 capitalCity 프로퍼티에서 설정될 때 self(자기자신)을 City 생성자의 하나의 매개변수로서 전달할 수 있습니다.

 

이 모든 것은 즉, 당신이 강한참조순환을 만들지 않으면서 단일 선언으로서 Country, City 인스턴스들을 만들 수 있음을 의미합니다. 그리고 capitalCity 프로퍼티는 옵셔널을 벗기기 위한 강제언래핑 등의 단계 없이 직접적으로 접근될 수 있습니다.


위의 예시를 볼 때, 암시적 언래핑 옵셔널(Implicitly unwrapped optional)은 two-phase class 생성자의 모든 요구사항을 충족시킴을 의미합니다. capitalCity 프로퍼티는 일단 초기화가 완료 되면 non-optional 값과 같이 접근하여 사용할 수 있게 됩니다. 여전히 강한참조순환 문제 없이 말입니다.

 

순환참조 문제는 일반적인 클래스 인스턴스 이 외에 클로져와 인스턴스간에도 발생할 수 있습니다.
 다음에는 클로저에 의핸 강한참조순환, 클로져캡쳐링(Closure Capturing) 문제에 대해서 포스팅해보겠습니다. 많은 의견 기다립니다 감사합니다. ^-^//

 

참고 문서 링크 ▼

Swift Automatic Reference Counting

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함