CHAPTER 11 인스턴스 생성 및 소멸
__11.1 인스턴스 생성
스위프트의 이니셜라이저는 반환 값이 없습니다.
클래스의 지정 이니셜라이저는 익스텐션에서 구현해줄 수 없습니다.
구조체와 클래스의 인스턴스는 처음 생성할 때 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초깃값을 할당해야 합니다.
초기화 후에 값이 확정되지 않은 저장 프로퍼티는 존재할 수 없습니다.
초기화와 프로퍼티 감시자
이니셜라이저를 통해 초깃값을 할당하거나, 프로퍼티 기본값을 통해 처음의 저장 프로퍼티가 초기화될 때는 프로퍼티 감시자 메서드가 호출되지 않습니다.
구조체와 클래스의 인스턴스는 처음 생성할 때 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초깃값을 할당해야 합니다.
초기화 후에 값이 확정되지 않은 저장 프로퍼티는 존재할 수 없습니다.
초기화와 프로퍼티 감시자
이니셜라이저를 통해 초깃값을 할당하거나, 프로퍼티 기본값을 통해 처음의 저장 프로퍼티가 초기화될 때는 프로퍼티 감시자 메서드가 호출되지 않습니다.
11.1.2 이니셜라이저 매개변수
11.1.3 옵셔널 프로퍼티 타입
인스턴스가 사용되는 동안에 값을 꼭 갖지 않아도 되는 저장 프로퍼티가 있다면 해당 프로퍼티를 옵셔널로 선언
초기화 과정에서 값을 지정해주기 어려운 경우 저장 프로퍼티를 옵셔널로 선언
인스턴스가 사용되는 동안에 값을 꼭 갖지 않아도 되는 저장 프로퍼티가 있다면 해당 프로퍼티를 옵셔널로 선언
초기화 과정에서 값을 지정해주기 어려운 경우 저장 프로퍼티를 옵셔널로 선언
11.1.4 상수 프로퍼티
상수 프로퍼티와 상속
클래스 인스턴스의 상수 프로퍼티는 프로퍼티가 정의된 클래스에서만 초기화할 수 있습니다. 해당 클래스를 상속받은 자식클래스의 이니셜라이저에서는 부모클래스의 상수 프로퍼티 값을 초기화할 수 없습니다.
상수 프로퍼티와 상속
클래스 인스턴스의 상수 프로퍼티는 프로퍼티가 정의된 클래스에서만 초기화할 수 있습니다. 해당 클래스를 상속받은 자식클래스의 이니셜라이저에서는 부모클래스의 상수 프로퍼티 값을 초기화할 수 없습니다.
11.1.5 기본 이니셜라이저와 멤버와이즈 이니셜라이저
기본 이니셜라이저는 저장 프로퍼티의 기본값이 모두 지정되어 있고, 동시에 사용자정의 이니셜라이저가 정의되어 있지 않은 상태에서 제공
구조체는 사용자정의 이니셜라이저를 구현하지 않으면 프로퍼티의 이름으로 매개변수를 갖는 이니셜라이저인 멤버와이즈 이니셜라이저를 기본으로 제공
클래스는 멤버와이즈 이니셜라이저를 지원하지 않습니다.
기본 이니셜라이저는 저장 프로퍼티의 기본값이 모두 지정되어 있고, 동시에 사용자정의 이니셜라이저가 정의되어 있지 않은 상태에서 제공
구조체는 사용자정의 이니셜라이저를 구현하지 않으면 프로퍼티의 이름으로 매개변수를 갖는 이니셜라이저인 멤버와이즈 이니셜라이저를 기본으로 제공
클래스는 멤버와이즈 이니셜라이저를 지원하지 않습니다.
11.1.6 초기화 위임
값 타입에서 이니셜라이저가 다른 이니셜라이저를 호출하려면 self.init을 사용
초기화 위임을 하려면 최소 두 개 이상의 사용자정의 이니셜라이저를 정의해야 합니다.
기본 이니셜라이저를 지키고 싶다면
사용자정의 이니셜라이저를 정의할 때도 기본 이니셜라이저나 멤버와이즈 이니셜라이저를 사용하고 싶다면 익스텐션을 사용하여 사용자정의 이니셜라이저를 구현하면 됩니다.
초기화 위임 방법을 사용하면 코드를 중복으로 쓰지 않고도 효율적으로 여러 case의 이니셜라이저를 만들 수 있습니다.
값 타입에서 이니셜라이저가 다른 이니셜라이저를 호출하려면 self.init을 사용
초기화 위임을 하려면 최소 두 개 이상의 사용자정의 이니셜라이저를 정의해야 합니다.
기본 이니셜라이저를 지키고 싶다면
사용자정의 이니셜라이저를 정의할 때도 기본 이니셜라이저나 멤버와이즈 이니셜라이저를 사용하고 싶다면 익스텐션을 사용하여 사용자정의 이니셜라이저를 구현하면 됩니다.
초기화 위임 방법을 사용하면 코드를 중복으로 쓰지 않고도 효율적으로 여러 case의 이니셜라이저를 만들 수 있습니다.
11.1.7 실패 가능한 이니셜라이저
실패했을 때 nil을 반환해주므로 반환 타입이 옵셔널로 지정
init? 키워드를 사용
이니셜라이저의 매개변수
실패하지 않는 이니셜라이저와 실패 가능한 이니셜라이저를 같은 이름과 같은 매개변수 타입을 갖도록 정의할 수 없습니다.
초기화를 실패했을 때는 return nil을, 반대로 초기화에 성공했을 때는 return을 적어 초기화의 성공과 실패를 표현할 뿐, 실제 값을 반환하지는 않습니다.
실패가능한 이니셜라이저를 사용하면 잘못된 전달인자를 전달받았을 때 초기화하지 않을 수 있습니다.
실패했을 때 nil을 반환해주므로 반환 타입이 옵셔널로 지정
init? 키워드를 사용
이니셜라이저의 매개변수
실패하지 않는 이니셜라이저와 실패 가능한 이니셜라이저를 같은 이름과 같은 매개변수 타입을 갖도록 정의할 수 없습니다.
초기화를 실패했을 때는 return nil을, 반대로 초기화에 성공했을 때는 return을 적어 초기화의 성공과 실패를 표현할 뿐, 실제 값을 반환하지는 않습니다.
실패가능한 이니셜라이저를 사용하면 잘못된 전달인자를 전달받았을 때 초기화하지 않을 수 있습니다.
11.1.8 함수를 사용한 프로퍼티 기본값 설정
클로저가 실행되는 시점은 초기화할 때 인스턴스의 다른 프로퍼티 값이 설정되기 전이라는 것도 꼭 명심
클로저 내부에서는 인스턴스의 다른 프로퍼티를 사용하여 연산할 수는 없다
클로저 뒤에 소괄호가 붙어 클로저를 실행한 결과값은 프로퍼티의 기본값이 됩니다. 만약 소괄호가 없다면 프로퍼티의 기본값은 클로저 그 자체가 됩니다.
클로저가 실행되는 시점은 초기화할 때 인스턴스의 다른 프로퍼티 값이 설정되기 전이라는 것도 꼭 명심
클로저 내부에서는 인스턴스의 다른 프로퍼티를 사용하여 연산할 수는 없다
클로저 뒤에 소괄호가 붙어 클로저를 실행한 결과값은 프로퍼티의 기본값이 됩니다. 만약 소괄호가 없다면 프로퍼티의 기본값은 클로저 그 자체가 됩니다.
__11.2 인스턴스 소멸
디이니셜라이저는 클래스의 인스턴스에만 구현할 수 있습니다.
클래스에는 디이니셜라이저를 단 하나만 구현할 수 있습니다.
인스턴스의 모든 프로퍼티에 접근할 수 있으며 (큰 의미는 없을 수도 있지만) 프로퍼티의 값을 변경할 수도 있습니다.
디이니셜라이저를 잘 활용하면 메모리 관리 측면 외에도 프로그래머가 설계한 로직에 따라 인스턴스가 메모리에서 해제되기 직전에 적절한 작업을 하도록 할 수 있을 것
참고
야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019
댓글