BOID

[swift] 미소유 옵셔널 참조와 암시적 추출 옵셔널 프로퍼티 - HoonIOS 본문

swift 시작기

[swift] 미소유 옵셔널 참조와 암시적 추출 옵셔널 프로퍼티 - HoonIOS

HoonIOS 2021. 4. 1. 11:20

안녕하세요 HoonIOS입니다. :)

저번에는 ARC의 참조 종류와 참조 누수를 방지하기 위한 약한 참조, 미소유 참조, 옵셔널 참조에 대해 알아보았습니다.

https://boidevelop.tistory.com/30

 

[swift] 강한참조, 강한참조 순환, 약한참조, 미소유참조- HoonIOS

안녕하세요 HoonIOS입니다. :) 저번 시간에는 ARC의 개념에 대해 간단히 포스팅했습니다. 이번에는 ARC의 참조 관계의 종류에 대해 포스팅을 하겠습니다. ARC와 강한참조의 관계 - 강한참조란 인스턴

boidevelop.tistory.com

 

이번에는 미소유 옵셔널 참조, 미소유 참조와 암시적 추출 옵셔널 프로퍼티의 관계에 대해 알아보겠습니다.

 

미소유 옵셔널 참조

- 클래스를 참조하는 옵셔널을 미소유로 표기할 수 있습니다.
- 미소유 옵셔널 참조는 항상 유효한 객체를 가리키거나 그렇지 않다면 nil을 할당해 주도록 직접 신경을 써야 합니다.

- 아래 예시를 한번 살펴보겠습니다.

- Department 클래스는 Subject을 배열에 담아 배열에 있는 요소들과 강한 참조를 하고 있습니다, 즉 Department 클래스가 Subject들을 소유하고 있는 형태입니다.

- 또 initialize에서 self.

- 옵셔널이 아닌 미소유 참조와 같이 nextSubject가 항상 올바른 해제되지 않고 올바른 Subject 인스턴스를 참조하도록 신경을 써야 합니다.

- 위 예제에 있는 department.subjects = [intro, intermediate, advanced]는 각각의 인스턴스를 Department클래스의 subjects 배열에 넣어 참조를 하고 있는데, 만약 이 배열에서 한 과목을 제거하고 싶다면 해당 인스턴스의 nextSubject참조를 제거해야 합니다.
( 그렇지 않으면 참조하려고 할 때 오류가 발생을 합니다.)

* 참조

- 미소유 옵셔널 참조는 옵셔널의 값인 클래스 인스턴스를 강한참조 하지 않기 때문에, 옵셔널 클래스의 인스턴스가 메모리에서 해제될때 ARC에 의해 보호받지 못합니다.
( 미소유 참조랑 동일한 동작을 하지만 미소유 옵셔널 참조는 nil이 될수 있습니다. )

미소유 참조와 암시적 추출 옵셔널 프로퍼티

- 서로 참조해야 하는 프로퍼티에 값이 꼭 있어야 하면서도 한번 초기화되면 그 이후에 nil을 할당할 수 없는 조건을 갖추어야 할 경우 어떤 게 필요할까요?

 

* 암시적 추출 옵셔널이란?

- nil을 할당해줄 수 있는 옵셔널이 아닌 변수나 상수를 사용할때 사용을 합니다.
- 타입 뒤에 느낌표를 사용하면 암시적 추출 옵셔널을 사용할수 있습니다.

 

- 아래 예시를 한번 봐보겠습니다.

- 위 코드에서는 Company 클래스의 ceo프로퍼티가 암시적 추출 옵셔널이 됩니다. 

- Company 클래스의 initalize문을 통해 초기화를 할 때 CEO 클래스의 인스턴스가 생성되면서 ceo 프로퍼티에 할당되어야 하고, Company 클래스 인스턴스가 존재하는 한 ceo프로퍼티에는 꼭 CEO인스턴스가 존재해야 하는 상황입니다.

( Company이니셜 라이저 안에 CEO 이니셜 라이저가 실행되기 때문입니다. )

- CEO의 initalize문도 보면은 초기화할 때 Company 클래스의 인스턴스가 있는 경우에만 초기화를 할수 있습니다.

 

- 따라서 Company 클래스의 ceo 프로퍼티에 암시적 추출 옵셔널을 사용한 이유는, Company 타입의 인스턴스를 초기화 할 때 Company 이니셜라이저 안에 있는 CEO 타입의 인스턴스를 생성하는 과정에서 자기 자신을 참조하도록 보내줘야 하기 때문입니다.

- 그렇다면 ceo 프로퍼티를 암시적 추출 옵셔널을 사용하지 않았다면 어떻게 됐을까요?
Company클래스의 초기화를 시작하려고 할때 Company클래스 초기화가 끝난 후에야 그제야 ceo에 초기화 값을 넣어주는 코드를 호출했을 것입니다.

 

지금까지 미소유 옵셔널 참조와 미소유 참조와 암시적 추출 옵셔널 프로퍼티에 대해 포스팅을 해봤습니다. 

 

다음 포스팅에는 이제 인스턴스끼리의 강한 참조 말고도 클로저가 인스턴스의 프로퍼티일 때도 순환 참조가 발생하는데요, 이것에 대해 알아보겠습니다.

 

반응형
Comments