Swift - 클래스와 값 타입의 초기화 위임(initializer delegation)은 왜 다를까?


값 타입인 구조체와 열거형은 코드의 중복을 피하기 위해 이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임하는 초기화 위임을 구현할 수 있다. 하지만 클래스는 간단한 초기화 위임이 안 되는 이유는 무엇일까?


이니셜라이저에서 다른 이니셜라이저를 호출할 수 있는 것을 이니셜라이저 위임, initializer delegation이라고 한다. 값 타입(structures, enumerations)와 클래스 타입의 이니셜라이저 위임 동작이 다르다.

값 타입(structures and enumerations)는 상속을 지원하지 않아 그들 내부에서 제공하는 다른 이니셜라이저에 바로 위임할 수 있기 때문에 위임 프로세스가 상대적으로 간단하다. 하지만 클래스는 다른 클래스로부터 상속을 받을 수 있다. 이게 무슨 말이냐면 클래스는 상속받은 저장 프로퍼티들은 모두 초기화 도중에 알맞은 값으로 할당해야 함을 확실하게 할 책임이 있다는 것이다.

값 타입을 위해 커스텀 이니셜라이저를 정의하면 기본 이니셜라이저(structure일 경우 멤버 와이즈 이니셜라이저)에 접근할 수 없다. 이런 제약은 더 복잡한 이니셜라이저에서 제공되는 추가적이며 필수적인 셋업이 어쩌다 자동 이니셜라이저 중 하나를 사용하는 누군가에 의해 무시되는 상황을 예방한다.

참고

  • https://jusung.gitbook.io/the-swift-language-guide/language-guide/14-initialization
  • https://docs.swift.org/swift-book/LanguageGuide/Initialization.html