이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.



참고 자료



클래스 이니셜라이저 - 상속과 재정의 (Inheritance and Override)

  • 값 타입(Value Type - Enum, Struct,,,)의 이니셜라이저는 이니셜라이저 위임을 위해 이니셜라이저끼리 구분할 필요가 없었지만 클래스에서는 지정 이니셜라이저(Designated Initializer)와 편의 이니셜라이저(Convenience Initializer)로 역활을 구분한다.

  • 값 타입의 이니셜라이저는 상속(Inheritance)을 고려할 필요가 없었지만 클래스는 상속이 가능하므로 상속받았을 때 이니셜라이저를 어떻게 재정의하는지도 큰 관건이다.

  • 두 종류의 이니셜라이저가 존재하고 상속이라는 클래스의 특성 때문에 다양한 패턴의 이니셜라이저가 생길 수 있으며, 그에 따라 클래스를 디자인할 때 더 많은 고민이 필요하다.



지정 이니셜라이저와 편의 이니셜라이저 (Designated Initializer and Convenience Initializer)

  • 지정 이니셜라이저(Designated Initializer)는 클래스의 주요 이니셜라이저이다.

  • 지정 이니셜라이저는 필요에 따라 부모클래스의 이니셜라이저를 호출할 수 있으며, 이니셜라이저가 정의된 클래스의 모든 프로퍼티를 초기화해야 하는 임무를 갖고 있다.

  • 지정 이니셜라이저는 클래스의 이니셜라이저 중 기둥과 같은 역활을 하므로 클래스에 하나 이상 정의한다.

    • 물론 여러 개를 정의 할 수는 있지만 편의 이니셜라이저(Convenience Initializer)에 비하면 적은 수이다.
  • 모든 클래스는 하나 이상의 지정 이니셜라이저를 갖는다.

  • 만약 조상클래스에서 지정 이니셜라이저가 자손클래스의 지정 이니셜라이저 역활을 충분히 할 수 있다면, 자손클래스는 지정 이니셜라이저를 갖지 않을 수도 있다.

    • 아마도 이런 경우는 조상클래스로부터 물려받은 프로퍼티를 제외하고 옵셔널 저장 프로퍼티 외에 다른 저장 프로퍼티가 없을 가능성이 크다.
  • 편의 이니셜라이저(Convenience Initializer)는 초기화를 좀 더 손쉽게 도와주는 역활을 한다.

  • 편의 이니셜라이저는 지정 이니셜라이저를 자신 내부에서 호출한다.

  • 지정 이니셜라이저의 매개변수가 많아 외부에서 일일이 전달인자를 전달하기 어렵거나 특정 목적에 사용하기 위해 편의 이니셜라이저를 설계할 수도 있다.

    • 예를 들어 특정 목적으로 인스턴스를 생성할 때 일부 프로퍼티는 클래스 설계자가 의도한 대로 초깃값을 지정해줘야 한다.

      • 지정 이니셜라이저를 사용하면 인스턴스를 생성할 때마다 전달인자로 초깃값을 전달해야 하지만 편의 이니셜라이저를 사용하면 항상 같은 값으로 초기화가 가능하다.
  • 편의 이니셜라이저는 필수 요소가 아니다. 다만 클래스 설계자의 의도대로 외부에서 사용하길 원하거나 인스턴스 생성 코드를 작성하는 수고를 덜 때 유용하게 사용할 수 있다.

init(매개변수들) {
    초기화 구문
}
  • 지정 이니셜라이저는 값 타입 이니셜라이저를 정의할 때와 같은 형식으로 정의할 수 있다.
convenience init(매개변수들) {
    초기화 구문
}
  • 편의 이니셜라이저는 앞에 convenience 지정자를 init 키워드 앞에 명시해주면 된다.