초기화
- 클래스, 구조체, 열거형 인스턴스를 사용하기 위한 준비 작업
- 저장 프로퍼티의 초기 값을 설정
- 초기화 작업이 완료되면 메모리에 인스턴스가 생성 된다.
- 초기화를 하는 방법에는 두 가지가 있다.
- init()을 사용한 초기화
- 저장 프로퍼티에 초기값 저장
이니셜라이저의 역할 (이니셜라이저의 대원칙)
- 스위프트는 에러에 대한 안전을 최우선시 한다.
- 빈 메모리에 접근하게 된다면 예기치 못한 에러가 발생할 수 있다.
- 타입 내부에 프로퍼티가 있다면 해당 프로퍼티에는 무조건 값이 있다는 것을 보장해야 한다.
이니셜라이저를 사용하여 초기화하기
- init() 문법의 가장 기본적인 형태는 매개 변수가 없는 형태이다.
init() {
// 이 곳에서 초기화를 구현
}
기본 값을 지정하여 초기화 하기
- 초기화의 또다른 방법으로 프로퍼티의 선언과 동시에 값을 할당하면 그 값을 초기 값으로 사용할 수 있다.
기본 값을 지정하는 것이 좋은 경우
- 항상 같은 초기 값을 가진다면 프로퍼티 선언과 동시에 초기 값을 할당하는게 좋다.
최종 결과는 동일하지만 기본 값은 프로퍼티의 초기화를 해당 선언 시점과 더 밀접하게 연결함으로써 더 짧고 명확한 이니셜라이저를 만들 수 있고, 프로퍼티의 타입을 추론할 수 있기에 코드가 짧아진다.
- 뒷부분에서 다룰 이니셜라이저 상속도 보다 쉽게 활용할 수 있다.
초기화 사용자화 하기
인자명 선언 방법
- 이니셜라이저는 메소드와 달리 괄호 앞에 식별할 수 있는 이름을 가지지 않기때문에 매개 변수명 및 타입이 이니셜러이저를 식별하는 데에 중요한 역할을 한다.
- 이니셜라이저는 초기화 인자를 주는 방법으로 사용자가 타입과 이름을 정의할 수 있다.
- 초기화 인자는 메소드와 같은 특징과 문법을 가진다.
옵셔널 타입
- 프로퍼티를 옵셔널 타입으로 선언한 경우 초기값이 없어도 되고, 나중에 추가도 가능하다.
- 초기값이 없는 경우 자동으로 nil로 초기화
상수 프로퍼티
- 이니셜라이저는 상수 프로퍼티에 값을 할당하는 것도 가능하다.
실패 가능한 이니셜라이저
- 초기화 과정 중에 실패할 가능성이 있는 이니셜라이저
- 반환 값으로 옵셔널 값을 생성
- 초기화 실패 시 nil을 반환
- 문법은 init?()
앞에서 말했듯이 이니셜라이저는 매개벼수명과 타입으로 구분하기 때무에 실패 가능한 이니셜라이저와 그렇지 않은 이니셜라이저의 형태가 다르다고 해서 같은 매개변수 타입과 이름을 사용할 수 없다.
값 유형의 이니셜라이저
이니셜라이저 위임 (Initializer Delegation)
- 이니셜라이저는 인스턴스 초기화의 일부를 수행하기 위해 다른 이니셜라이저를 호출할 수 있다.
- 코드 중복을 예방해준다.
- 값 유형과 클래스 유형에 따라 동작 방식이 다르다.
- 값 유형에서의 이니셜라이저 위임
구조체의 이니셜라이저
- 구조체는 기본적으로 제공되는 이니셜라이저가 2개가 있다.
- 멤버와이즈 이니셜라이저: 프로퍼티를 매개 변수로 가지는 이니셜라이저
- 기본 이니셜라이저: 매개 변수가 없는 이니셜라이저
- 구조체 내에서 프로퍼티가 하나라도 초기화되지 않은 경우, 초기값이 없는 속성을 매개 변수로 갖는 이니셜라이저(멤버와이즈 이니셜라이저)가 제공된다.
- 프로퍼티가 모두 초기화 되어 있는 경우 매개 변수가 없는 이니셜라이저(기본 이니셜라이저)도 제공된다.
- 다만 속성이 모두 let으로 초기화 되어 있는 경우 멤버와이즈 이니셜라이저는 제공 되지 않는다.
열거형의 이니셜라이저
- 열거형은 rawValue가 있는 경우 rawValue로부터 열거형 인스턴스를 생성할 수 있는 실패 가능한 이니셜라이저가 기본으로 제공된다.
- 열거형의 case들을 초기화 해주는 것은 가능하지만 rawValue는 변할 수 없는 값이기 때문에 초기화 해줄 수 없다.
값 유형의 이니셜라이저 익스텐션
- 값 타입을 위한 사용자 이니셜라이저를 정의하면 더 이상 기본 이니셜라이저 또는 멤버와이즈 이니셜라이저에 접근할 수 없다.
- 이러한 제약을 주는 이유는 이니셜라이저의 복잡성을 낮추고 이니셜라이저가 의도치 않게 사용되는 것을 방지하기 위함이다.
- 사용자 지정 이니셜라이저를 사용하면서 기본 또는 멤버와이즈 이니셜라이저도 사용하고 싶다면, 사용자 지정 이니셜라이저를 원래의 값 타입에 구현하지 않고, 익스테션에 구현을 하면 된다.
참고 : https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
(2편 클래스의 Initializer)
To be continued…