swift

Initialization (1)

kimyounggyun 2022. 11. 11. 17:23

초기화(Initialization)

인스턴스의 저장 프로퍼티는 사용하기 전에 반드시 특정 값 또는 nil로 초기화되어야 한다. 초기화(Initialization)는 클래스, 구조체, 열거형의 프로퍼티 초기 값을 설정하는 단계이다. 초기화 과정은 초기자(Initializer)를 정의해 구현할 수 있다. 

Struct Initializer

구조체의 초기자를 만드는 간단한 방법은 초기자 내부에서 저장 프로퍼티의 초기값을 지정해주는 방법으로 매개변수(parameter)가 없는 init 키워드를 사용하는 것이다. 저장 프로퍼티의 초기 값을 항상 미리 지정된 값으로 초기화한다.

만약 모든 저장 프로퍼티의 초기값이 설정되어 있고, 어떤 초기자도 정의하지 않았다면 스위프트는 모든 저장 프로퍼티를 초기값으로 초기화하는 기본 초기자(default initializer)를 제공한다. 

초기자에 init 키워드에 매개변수를 정의해 초기화를 할 수 있다. 이러한 초기자를 커스텀 초기자(custom initializer)라고 한다. 커스텀 초기자의 매개변수는 메서드의 매개변수처럼 인자 레이블(argument label)을 갖는다. 두 번째 그림처럼 인자 레이블이 지정되지 않은 경우 스위프트는 매개변수의 이름과 동일한 인자 레이블을 자동으로 만든다. 메서드와 마찬가지로 인자 레이블이 필요 없는 경우 세 번째 그림처럼 생략할 수 있다.

만약 정의되어 있는 초기자가 없다면 스위프트는 모든 저장 프로퍼티를 매개변수로 갖는 초기자를 제공한다. 이러한 초기자를 멤버 쪽 초기자(Memberwise Initializer)라고 한다. 스위프트는 디폴트 초기자와 커스텀 초기자가 있는 경우 멤버 쪽 초기자를 제공하지 않는다. 하지만 디폴트 초기자와 커스텀 초기자를 extension으로 추가하면 멤버 쪽 초기자를 사용할 수 있다.

Class Initializer

클래스의 초기자는 구조체의 초기자와 비슷하지만 스위프트는 클래스에 멤버 쪽 초기자를 지원하지 않는다. 클래스는 상속이 가능하기 때문이다. 만약 클래스에 멤버 쪽 초기자를 지원한다면 슈퍼 클래스에 저장 프로퍼티가 추가, 삭제되었을 때 서브 클래스의 모든 멤버 쪽 초기자를 수정해야 하는 가능성이 존재한다. 따라서 스위프트는 클래스 초기화 단계를 완전히 개발자 몫으로 넘기고 대신 몇 가지 초기자를 지원하여 초기화 과정을 쉽게 만든다.

Designated Initializer

지정 초기자(Designated Initializer)는 인스턴스의 모든 프로퍼티를 초기화한다. 따라서 클래스는 무조건 한 개 이상 지정 초기자가 있어야 한다. 클래스의 지정 초기자 문법은 구조체의 초기자 문법과 비슷하다.

Convenience Initializer

편리 초기자는 저장 프로퍼티에 미리 정해진 값이 있는 경우 최소한의 매개변수를 사용하여 초기화를 할 수 있도록 도와주는 초기자이다. 편리한 초기자 내부에서 지정 초기자를 호출함으로써 이루어진다. 

편리 초기자

Enum initializer

열거형의 경우 raw 값을 이용하여 열거형 변수를 초기화할 수 있다. raw 값 초기자는 실패 가능한 초기자(Failable Initializer)로 만약 열거형에 지정된 raw 값이 아닌 값으로 초기화를 하면 nil이 반환된다. 

Failable initializer

실패 가능한 초기자는 말 그대로 초기화에 실패할 수 있는 초기자이다. 초기화에 사용될 인자(argument)가 어떠한 조건에 의해 초기화에 사용될 수 없을 때 초기화를 실패하도록 할 수 있다. 일반적으로 초기자는 값을 반환하지 않는다. 하지만 실패 가능한 초기자는 nil를 반환함으로써 실패를 알린다.