required (feat. Initializer 자동상속)

J.Noma·2021년 10월 31일
0

Swift : 문법

목록 보기
11/11

UIViewController의 initializer를 이를 상속하는 custom 뷰컨에서 재정의하려면 override가 아닌 required를 쓰라며 난리를 친다

이게 required 였다고..? 아니 그럼 왜 자식 class에서 이걸 구현 안해도 돌아가는거지?

우선 initializer에 대해 궁금한 사람을 위해 공식문서 투척


required initializer

사실 별건 없고 상속관계에서 모든 자식 class들에게
"subclass들아, 이런이런 파라미터 리스트를 받는 initializer는 꼭 구현하렴"이라고 말하는 것이라 할 수 있다

바로 예제를 보자

class ABC {
    var a: Int
    required init() {
        self.a = 1
    }
}

class DEF: ABC {
    var b: Int
    required init() {
        self.b = b
        super.init()
    }
}

위 예제에서 required의 목적
ABC class는 required 키워드를 통해 파라미터를 받지 않는 initializer를 자신도 구현하고 자식 class들이 꼭 구현하기를 요구하였다
그리고, 자식 class인 DEF도 구현하여 컴파일 에러가 발생하지 않았다

위 예제에서 살펴볼 수 있는 required 사용법
파라미터 리스트가 동일하므로 원래는 override 키워드를 사용해야 하지만 required 키워드를 대신 사용한다

그 외 detail은 공식문서 참고


Initializer 자동상속

required 얘기하다가 왜 갑자기 자동상속 얘기냐?

UIViewController의 initializer는 required로 선언되어 있다.
하지만, 자식 class인 custom 뷰컨에서 이를 재정의하지 않아도 컴파일 에러가 발생하지 않는다

왜 그럴까?

결론부터 말하면,

부모의 initializer를 '자동상속'하는 조건에서는 자식 class가 required initializer를 구현하지 않아도 된다
(부모의 것을 그대로 사용)

이제 자동상속 조건에 대해 알아보자

부모의 initializer를 '자동상속'하는 조건

기본적으로, initializer는 부모로부터 상속받지 않는 특징이 있다

그럼에도 '특정조건'을 맞춰주면 initializer도 자동상속된다
(이 특정조건은 의외로 매우 빈번하게 발생한다고 한다)

📌 Rule 1 : 자식 class의 initializer가 하나도 없을 때
이 경우, 부모의 initializer를 자동상속한다.
그리므로 required를 따로 구현해주지 않아도 된다

📌 Rule 2 : Convenience는 조건을 맞춰주면 자동상속될 수 있다
(이건 required와는 상관없지만, 특이해서 ^^;;)
부모의 Designated를 자식 class에서 전부 구현하면 부모의 Convenience를 자동상속하는 기능이 있다


결론

아무튼, UIViewController에서 required로 정의한 initializer를 우리의 custom 뷰컨에서 initializer를 재정의하지 않아도 되는 이유는 initializer를 하나도 만들지 않았기 때문에 자동상속이 발생해서이다

profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe

0개의 댓글