기본 문법 공부(인스턴스 생성 및 소멸 - 초기화 위임, 실패 가능한 이니셜라이저)
이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.
예제 코드
참고 자료
초기화 위임 (Initializer Delegation for Value Type)
-
값 타입(Value Type)인 구조체(Structure)와 열거형(Enumeration)은 코드의 중복을 피하기 위하여
이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임하는초기화 위임(Initializer Delegation)을 간단하게 구현할 수 있다.
-
클래스는 상속을 지원
하므로 간단한초기화 위임도 할 수 없다.
-
값 타입에서 이니셜라이저가 다른 이니셜라이저를 호출
하려면self.init
을 사용한다. -
self.init은 이니셜라이저 안에서만 사용할 수 있다.
self.init을 사용한다는 것 자체가 사용자정의 이니셜라이저를 정의하고 있다는 뜻이다.
-
사용자정의 이니셜라이저를 정의하면 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 사용할 수 없다고 했다.
- 따라서
초기화 위임을 하려면 최소한 두 개 이상의 사용자정의 이니셜라이저를 정의해야 한다.
- 따라서
-
사용자정의 이니셜라이저를 정의할 때도 기본 이니셜라이저나 멤버와이즈 이니셜라이저를 사용하고 싶다면 익스텐션을 사용하여 이니셜라이저를 구현하면 된다.
Student 열거형과 초기화 위임
-
위 그림의 열거형은 두 개의 사용자정의 이니셜라이저가 있다.
-
첫 번째 사용자정의 이니셜라이저는 나이를 전달받아 나이에 맞는 학교를 case로 구분한
이니셜라이저를 초기화한다.
-
두 번째 사용자정의 이니셜라이저는 태어난 해와 현재 연도를 전달받아 나이로 계산한 후
첫 번째 이니셜라이저에 초기화를 위임한다.
-
-
이렇게 초기화 위임 방법을 사용하면 중복으로 쓰지 않고도 효율적으로 여러 case의 이니셜라이저를 만들 수 있다.
실패 가능한 이니셜라이저 (Failable Initializer)
-
이니셜라이저를 통해 인스턴스를 초기화할 수 없는 여러 가지 예외 상황이 있다.
-
대표적으로
이니셜라이저의 전달인자로 잘못된 값이나 적절치 못한 값이 전달되었을 때, 이니셜라이저는 인스턴스 초기화에 실패할 수 있다.
-
그 외에도 여러 이유로 인스턴스 초기화에 실패할 수 있다.
-
-
이니셜라이저를 정의할 때 위와 같은 실패 가능성을 염두
에 두기도 하는데, 이렇게실패 가능성을 내포한 이니셜라이저를 실패 가능한 이니셜라이저(Failable Initializer)라고 부른다.
-
실패 가능한 이니셜라이저는 클래스, 구조체, 열거형 등에서 모두 정의할 수 있다.
-
실패 가능한 이니셜라이저는 실패했을 때 nil을 반환해주므로 반환 타입이 옵셔널로 지정된다.
-
실패 가능한 이니셜라이저는 init? 키워드를 사용한다.
-
실패 가능한 이니셜라이저는 구조체와 클래스에서도 유용하지만
특히 열거형에서 유용하게 사용할 수 있다.
-
특정 case에 맞지 않는 값이 들어오면 생성에 실패할 수 있다.
-
혹은
rawValue로 초기화할 때, 잘못된 rawValue가 전달되어 들어온다면 열거형 인스턴스를 생성하지 못할 수 있다.
-
따라서
rawValue를 통한 이니셜라이저는 기본적으로 실패 가능한 이니셜라이저로 제공된다.
-
열거형의 실패 가능한 이니셜라이저 (Failable Initializer of Enumeration)
이니셜라이저의 매개변수 (Parameter of Initializer)
-
실패하지 않는 이니셜라이저와 실패 가능한 이니셜라이저를 같은 이름과 같은 매개변수 타입을 갖도록 정의 할 수 없다.
-
실패 가능한 이니셜라이저는 실제로 특정 값을 반환하지 않는다.
-
초기화를 실패했을 때는 return nil
을 반대로초기화에 성공했을 때는 return을 적어 초기화의 성공과 실패를 표현할 뿐, 실제 값을 반환하지는 않는다.