ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - Required Initializer
    Programming/Swift 2021. 12. 18. 11:31

     

     

    안녕하세요 BeePeach입니다 :)

     

    오늘은 Required Initializer (필수 생성자)에 대해서 공부해보려고 합니다.

    Required라는 의미는 요구된다. 필수의 라는 뜻을 가지고 있습니다.

    Required init은 의미대로 반드시 구현해야 하는 init을 의미합니다.

     

    프로퍼티에 default value가 없다면 반드시 init이 필요한 거 아니야??

    근데 왜 필수 생성자가 필요하지?? 라는 의문이 들 수 있는데요!

    Required init은 class에서만 사용됩니다. 그리고 required은 subclass에서 반드시 구현을 해야 한다는 의미입니다.

     

    그리고 subclass에서 superclass의 init을 다시 구현하는 것을 overriding이라 하며 override 키워드를 적어줘야 했죠??

    하지만 required init은 재정의 할 때 override 키워드를 사용하지 않고 다른 키워드를 사용합니다.

     

     

     


     

    Required Initializer Syntax

     

     

    문법은 아주 간단합니다. Subclass에서 반드시 구현하고 싶은 initializer앞에 required 키워드를 적어주면 됩니다.

    그럼 한번 SomeClass를 상속받는 SomeSubClass를 구현해보겠습니다.

     

     

    으음 구현했는데 설명과 뭔가가 좀 다른 거 같습니다.

    required init은 반드시 subclass에서 구현을 해야 한다고 했는데 구현하지 않았는데 에러가 발생하지 않습니다.

     

    그 이유는 init()을 상속받았기 때문입니다.

    생성자 상속에서 공부했던 내용에 의하면 새롭게 정의된 stored property가 없고 designated init을 구현하지 않으면 모든 designated init이 상속된다고 공부를 했었죠??

    그래서 required init()을 상속받은 겁니다. 우리는 코드로 작성하지 않았지만 이미 SomeSubClass는 init()을 구현한 것과 다름없죠!

    이렇게 만약 required init을 상속받았다면 다시 구현하지 않아도 됩니다.

     

    그럼 한 번 상속을 못 받도록 만들어보겠습니다.

     

     

    depth라는 프로퍼티를 추가하고 init(depth:)를 추가했지만 이제는 더 이상 required init()을 상속받지 못하기 때문에 init()을 구현해야 할 한다는 에러가 발생하는 것을 확인할 수 있습니다.

    그럼 이 에러를 한번 고쳐보도록 하겠습니다. 

     

     

    여기서 주의할 점은 override 키워드 대신 required 키워드를 사용했다는 점입니다.

    이렇게 구현하고 나니 에러가 사라진 것을 확인할 수 있습니다.

     

     


     

    상속 체인 중간에 required를 추가하고 싶다면??

     

    만약에 Base class부터 required를 사용하지 않고 상속 체인 중간부터 required init을 정의하고 싶다면 어떻게 할까요?

    그냥 중간부터 required를 붙여주면 될까요?? 한번 해보겠습니다.

     

     

    이 코드는 SomeClass에서 init()이 required가 아닙니다.

    그리고 SomeSubClass부터 required init으로 하고 싶어서 required 키워드를 추가시켰습니다.

    그랬더니 이런 에러가 발생합니다.

     

    이유는 간단합니다. Superclass인 SomeClass에서 정의된 init()을 우리가 subClass인 SomeSubClass에서 재정의 하는 것과 다름없습니다. 그렇기 때문에 override 키워드도 추가를 시켜야 합니다.

     

     

    Line 14를 보면 required 뒤에 override 키워드를 같이 추가시켰습니다.

    그러고 나서 다음 subclass에서는 이전과 마찬가지로 required만 붙여주면 됩니다.

     

     


     

    참고자료

     

    https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

     

    Initialization — The Swift Programming Language (Swift 5.6)

    Initialization Initialization is the process of preparing an instance of a class, structure, or enumeration for use. This process involves setting an initial value for each stored property on that instance and performing any other setup or initialization t

    docs.swift.org

     

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

     

     

    728x90

    'Programming > Swift' 카테고리의 다른 글

    Swift - Extension  (0) 2021.12.20
    Swift - Deinitializer  (0) 2021.12.19
    Swift - Failable InitialIzer  (0) 2021.12.17
    Swift - Initializer - Inheritance, Overriding  (0) 2021.12.11
    Swift - Initializer - Two Phase Initialization  (1) 2021.12.06
Designed by Tistory.