본문 바로가기
iOS/궁금증

[Swift]super.init()이 반드시 필요했던 경우

by MINT09 2023. 11. 8.

super.init()에 대해서 이것저것 찾아보다 신기한 경우를 찾았다.

class A {
    init(some: String) {
        print("a")
    }
}

 

A와 같이 매개변수가 있는 init의 경우에는, 상속을 해서 내부에 변화를 줄 때

class B: A {
    override init(some: String) {
        super.init(some: some)
        print("b")
    }
}

반드시 super.init을 불러야 한다는 에러 메세지가 떴다.

2단계 초기화에서 보면, customize된 초기화는

1. superClass와 subclass가 있을 때 subClass 초기화

2. superClass 초기화 순으로 올라간 후

3. superClass에서부터 값이 할당

되는 과정을 거친다. 이처럼 override를 하는 경우 부모 클래스의 init()이 자동으로 불리지 않기 때문에 불러주어야 한다. 

 

그.런.데!

class C {
    init() {
        print("c")
    }
}

매개변수를 사용하지 않은 경우! 이상한 일이 일어난다.

class D: C {
    override init() {
        print("d")
    }
}

?? 왜 에러 메세지가 나지 않죠?

왜 Build Success가 뜨죠??

이상하다.. 분명 override인데?

 

그래서 생각한 가설!

Swift는 자동으로 마지막에 super.init()을 불러준다. 그러나 매개변수가 있는 경우 어떤 init()을 불러야 할지 모르기 때문에 super.init()을 불러서 확인해주어야 한다.

 

참고로 어떤 순서로 부르는지는 다음 이미지와 같다.