Swift - Initialization(클래스의 2단계 초기화 및 상속)

이원석·2024년 11월 27일

Swift

목록 보기
20/38

클래스의 2단계 초기화

Swift에서 초기화는 두단계 과정을 거친다
첫 번째 단계에서 저장된 각 프로퍼티는 해당 클래스에 의해 초기값이 할당 된다.
두 번째 단계에서 해당 인스턴스를 사용할 수 있는 상태로 간주하기 전에 프로퍼티 값을 사용자 정의할 수 있는 기회가 제공 된다.
두 단계 초기화는 초기화를 안전하게 만들도록 진행한다.

1단계 초기화

1단계 초기화에선 클래스의 새로운 인스턴스를 위한 메모리가 할당되며, 이때 메모리는 초기화 전이다. 지정 초기화는 해당 클래스의 프로퍼티에 초기값이 있음을 확인하여 그 값으로 초기화 한다. 지정 초기화는 자신의 프로퍼티 값을 모두 초기화 시킨 후, 부모의 초기화 함수에 전달된다. 이 작업은 상속 고리의 최상단 부모 클래스에 도달할 때까지 계속 진행된다.
이 작업으로 인해 최상위 부모의 프로퍼티까지 모두 기본 값으로 초기화 되면 이때 비로소 instance의 메모리가 완전히 초기화 되었다고 할 수 있으며, 1단계 초기화가 완료된 것이다.
=> 내 프로퍼티를 모두 초기화 하고 super.init을 통해 부모 클래스의 초기화 까지 진행 = 1단계 초기화

  • 초기값을 갖지 않은 프로퍼티에 한해서 초기값을 지정해주고 부모 클래스의 생성자를 호출하는 과정이 초기화 1단계
  • 1단계 초기화가 끝나면 인스턴스의 메모리가 완전히 초기화 되었다고 볼 수 있음
  • 1단계 초기화가 끝나지 않았을 경우, 이미 내 생성자에서 초기화가 진행된 값은 읽어오는 것이 가능하지만 아직 초기화가 되지 않은 슈퍼 클래스의 프로퍼티는 접근할 수 없음

2단계 초기화

최상위 부모 프로퍼티의 생성자까지 모두 호출 되어 1단계 초기화가 완료된 경우, 이때부턴 지정 초기화로부터 인스턴스를 구체화 할 기회를 부여 받는다. 이단계부터 self에 접근할 수 있으며, 프로퍼티의 값 수정 및 메소드 호출 등등의 작업이 가능.
부모 클래스의 저장 프로퍼티 값을 변경할 수 있다.
=> 1단계 초기화가 완료 되었다면, 가장 마지막으로 호출됐던 상위 클래스의 남은 작업부터 차례로 아래로 실행됨

  • 부모, 조상 클래스의 저장 프로퍼티 값을 2단계 초기화 과정에서 변경 가능
  • 1단계 초기화가 끝나기전 메서드를 호출하지 못하지만, 2단계 초기화 지점에서 호출 가능

2단계 초기화 존재이유

부모의 초기화에 의해 내가 설정한 값이 덮어지는 문제를 방지하기 위해


Initializer의 상속

클래스의 Initializer는 총 두가지 조건에 의해 상속
Swift 서브 클래스는 기본적으로 슈퍼클래스 이니셜라이저를 상속받지 않음

서브 클래스에서 지정 초기화를 직접 구현하지 않았다면, 슈퍼 클래스의 모든 지정 초기화가 상속된다.

  • 생성자를 작성하지 않아도 모든 프로퍼티가 기본 값을 가질 경우, 슈퍼 클래스의 지정초기화가 모두 상속 된다. 자식에서 생성자를 정의 안해줘도 슈퍼클래스의 생성자를 상속받아서 쓸수 있다.
  • 생성자를 만들었다면 부모클래스의 생성자는 상속되지 않는다.

서브 클래스가 1번 조건에 의해 모든 지정 초기화를 상속 받거나 또는 모든 지정 초기화를 오버라이딩 했다면, 자동으로 부모의 모든 편의 초기화가 상속 된다.

class Human {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    convenience init(unknown: String) {
        self.init(name: unknown)
    }
}
 
class Sodeul: Human {
    var nickName: String
    
   override init(name: String) {
      nickName = name
       super.init(name: name)//오버라이드 할 때도 super.init호출해줘야함
    }
}

Sodeul.init(unknow: "abc")//부모 편의 초기화 사용 가능

참조
개발자 소들이

0개의 댓글