오늘의 Swift 상식 (Initializer 2편. 클래스의 Initializer)

장국진
4 min readMay 24, 2019

--

클래스의 이니셜라이저

  • 클래스가 부모 클래스에서 상속한 모든 속성을 포함하여 모든 클래스의 저장 속성은 초기화 하는 동안 초기 값을 지정해줘야 한다.
  • 스위프트는 모든 저장 프로퍼티가 초기 값을 가지는 데에 편리하도록 클래스 유형에 대해 두 가지 이니셜라이저를 정의 한다.

지정 이니셜라이저(Designated Initializer)

  1. 클래스의 모든 저장 프로퍼티를 초기화 한다.
  2. 부모 클래스의 이니셜라이저를 호출할 수 있다.
  3. 클래스 내부에는 반드시 한 개 이상의 지정 이니셜라이저가 있어야 한다.
init(매개 변수) {
// 구현부
}

편의 이니셜라이저(Convenience Initializer)

  1. 지정 이니셜라이저의 일부 매개 변수의 기본 값을 설정하여 초기화 한다.
  2. 더 적은 입력으로 초기화를 편리하게 할 수 있게 해준다.
convenience init(매개 변수) {
// 구현부
}
  • 예제

이니셜라이저 위임의 규칙

  1. 지정 이니셜라이저는 반드시 부모 클래스의 이니셜라이저를 호출해야 한다.
  2. 편의 이니셜라이저는 반드시 같은 클래스의 이니셜라이저를 호출해야 한다.
  3. 편의 이니셜라이저결과적으로 지정 이니셜라이저를 호출해야 한다.

궁극적으로 보면

  1. 지정 이니셜라이저는 항상 부모 클래스의 이니셜라이저를 호출해야 한다.
  2. 편의 이니셜라이저는 항상 같은 클래스의 이니셜라이저를 호출한다.

2단계 초기화

  1. 자식 및 부모 클래스의 모든 저장 속성에 초기 값을 지정한다.
  2. 자식 및 부모 클래스의 저장 속성 값을 변경한다. 이 시점부터 메소드 및 연산 속성을 사용하여 초기화를 진행한다.
  • 부모 클래스를 호출하기 전 자식 클래스의 프로퍼티를 초기화 하여야 한다.
  • 부모 클래스에 있는 프로퍼티에 따로 값을 할당하기 위해선 부모 클래스를 먼저 호출해야 한다.
  • 단, 자식 클래스의 프로퍼티가 초기화 된 경우 자식 클래스의 프로퍼티에 값을 할당하는 구문은 뒤에 동작하여도 된다.

이니셜라이저 상속

  • 스위프트는 기본적으로 자식 클래스에서 부모 클래스의 이니셜라이저를 상속하지 않는다.
  • 무분별하게 상속돼 복잡해지면서 자식 클래스를 잘못 초기화히는 상황을 막기 위함이다.
  • 다만 특정 조건을 만족하면 이니셜라이저를 상속한다.

이니셜라이저 상속하기 위한 조건

  • 자식 클래스가 지정 이니셜라이저를 정의하지 않은 경우 지정 이니셜라이저를 상속 받는다.
  • 자식 클래스가 부모 클래스의 지정 이니셜라이저를 모두 구현(상속 또는 오버라이드)한 경우 편의 이니셜라이저를 상속 받는다.

필수 이니셜라이저 (Required Initializer)

  • 모든 자식 클래스에서 반드시 구현해야 하는 이니셜라이저
  • required 키워드를 붙여 사용 가능하고 자식 클래스에서 구현할 때에도 required 키워드를 붙여야 한다.
  • required는 오버라이드를 기본으로 포함하고 있다.

클로저를 활용한 이니셜라이저

  • 기본 값 설정이 단순히 값을 할당하는 것이 아닌 다소 복잡한 계산을 필요로 한다면 클로저나 함수를 이용해 값을 초기화하는데 이용할 수 있다.
  • 클로저가 끝난 뒤에 괄호’()’를 붙여 속성이 클로저 자체가 아닌 연산의 결과를 가지도록 할 수 있다.
  • 연산 프로퍼티와 다른 점은 연산 프로퍼티는 변수를 참조할 때마다 호출되지만 클로저를 활용한 이니셜라이저는 한번만 호출되고, 상수가 아닌 변수로 선언할 경우 값을 변경할 수도 있다.

참고 : https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

--

--