기본 이니셜라이저 상속에 대해서 질문입니다.

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • mi kim
      참가자
      • 글작성 : 8
      • 답글작성 : 7
      1,710 포인트

      클래스에서의 이니셜라이져 상속에 대해서 질문입니다.

      스크린샷 2020-12-27 오후 9.21.03

      UIView를 상속받는 클래스 Test를 만들고,

      let test = Test()

      이 코드를 사용해도 컴파일이 정상적으로 되었습니다.

      여기서 Test() 만으로 초기화 할 수 있는 이유를 모르겠습니다.

       

      제가 Test()만으로 초기화 할 수 없다고 생각한 이유는,

      1. 모든 프로퍼티가 초기화 된 Test 클래스 내에서  초기화 메서드 init() 을 정의하지 않았고,
      2. 부모클래스 UIView에 정의된 init() 메서드를 상속받을 수 있는게 아닌가 에 대해서는,

        클래스 Test에서 이미 다른 지정 초기화 메서드들(init?(coder:), init(v:), init(frame:))를 정의했기 때문에

        부모에게서 init()을 상속받을 수 없는게 아닌가 싶었습니다.

       

      혹시몰라서 플레이그라운드에서 제가 생각했을 때 동일한 상황을 만들어 테스트 해보았을 때,

      스크린샷 2020-12-27 오후 9.33.33

      위와 같이 init()을 만들어두지 않은 자식클래스 B에서, init()이 있는 부모클래스 A를 상속받고 있을 때,

      let b = B() 는 에러가 났습니다….

       

      init()을 상속받지못한?  Test에서 init()을 사용할 수 있는 이유는 뭔가요?ㅠㅠ

       

      +1
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 466
      13,960 포인트

      UIView 클래스는 상속관계를 따져 올라가면 NSObject 를 상속받았고, NSObjectNSObjectProtocol 프로토콜을 채택했습니다. 이 프로토콜에서 요구하는 요구사항 중 init() 이니셜라저가 있고, NSObject에 그 기본구현이 되어있기 때문에 그 자식 클래스에서도 init을 사용할 수 있습니다.

      0
      • mi kim
        참가자
        • 글작성 : 8
        • 답글작성 : 7
        1,710 포인트

        자식 클래스에서 지정 이니셜라이져를 정의하면 부모에서 정의된 init() 이니셜라이져를 상속받지 못해서 사용할수 없지않나요?

        클래스 Test에서는 지정 이니셜라이져를 정의해도 부모클래스 쪽의 NSObject에 있는 init()을 이용한 초기화가 되는데, 밑에 두번째 사진에서는 안되고 있어요. 제가 어떤걸 잘못알고있는걸까요..

        • 이 답변은 mi kim에 의해 2 weeks, 6 days 전에 수정됐습니다.
        0
        • 야곰
          키 마스터
          • 글작성 : 37
          • 답글작성 : 466
          13,960 포인트

          제가 좀 착각을 했습니다. 위에 기본구현때문이라는 것은 틀린 설명인것 같아요. UIViewNSObject를 상속받았고, NSObject를 상속받은 클래스는 Objective-C 언어의 특성도 공유합니다.
          아마도 NSObjectProtocolNSObject 상속 영향으로 Objective-C 언어의 특성을 사용하는게 아닐까 하는데요, Objective-C에선 이니셜라이저 상속에 특별한 제한조건이 없습니다. 그래서 그냥 상속이 가능합니다. NSObject에 구현된 init을 스위프트의 이니셜라이저로 인식하지 않는것 같기도 하고요.
          저도 더 찾아봐야겠네요.

          init을 사용하지 못하게 하려면

          class A: UIView {
              private init() {
                  super.init(frame: .zero)
              }
          }
          

          해주면 됩니다.

          • 이 답변은 야곰에 의해 2 weeks, 5 days 전에 수정됐습니다.
          +2
1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 260-27-00477
통신판매업 신고번호 : 제 2020-충북청주-0663 호
고객센터 : 카카오톡채널 @yagom