티스토리 뷰

카테고리 없음

Swift - 재정의와 생성자

최초의 펭귄 2018. 6. 4. 15:30

안녕하세요. 오늘은 Swift의 클래스 상속에서 가장 중요한 부분인 재정의와 생성자에 대해 정리하는 시간을 갖도록 하겠습니다.

재정의 (override)

자식클래스는 부모클래스의 특성을 자신만의 기능으로 재정의가 가능합니다.
특히 자식 클래스는 부모클래스의 프로퍼티를 재정의 할 수 있습니다.
(여기서 프로퍼티를 재정의한다는 것은 프로퍼티 접근자, 설정자, 감시자를 재정의 하는 것입니다.)
부모클래스에서 읽기 전용 프로퍼티라도 읽고 쓰기가 가능한 프로퍼티로 재정의해줄 수 있습니다.
하지만 읽기 쓰기가 모두 가능한 프로퍼티를 읽기 전용으로 재정의 할 수는 없습니다.

또한 프로퍼티 감사자도 재정의가 가능한데
부모클래스의 저장 프로퍼티는 물론 연산 프로퍼티에도 감시자를 정의해줄 수 있습니다.

다만 읽기 전용 연산 프로퍼티나 상수 저장 프로퍼티는 프로퍼티 감시자를 재정의할 수 없습니다.

또한 프로퍼티 감시자와 프로퍼티 접근자를 재정의할 수 는 없습니다.

재정의 방지

자신을 상속받는 자식클래스에서 프로퍼티나 메서드를 재정의를 방지하고 싶다면
final 키워드를 사용합니다.
또한 더 이상 상속하지 못하도록 만들고 싶다면 class 앞에 final을 붙여줍니다.

지정, 편의 생성자

지정 생성자는 주요 생성자입니다. 필요에 따라 부모 생성자를 호출 할 수 있으며
자신의 모든 프로퍼티를 초기화하여야 합니다.

만약 부모클래스의 생성자가 모든 프로퍼티를 초기화한다면
자손클래스는 지정 생성자를 가지지 않을 수도 있습니다.

편의 생성자는 초기화를 도와주는 서브 생성자입니다.
편의 생성자는 무조건 지정 생성자를 자신 내부에서 호출하여야 합니다.

그렇기에 편의 생성자는 특정 목적을 위해 매개 변수를 고정하여
설계자가 설계한대로 초기화를 하고 싶을 때 사용합니다.
(기본값을 설정하는 방법도 있을 것 같습니다.)

2단계 초기화

Swift의 클래스는 2단계에 거처 초기화를 합니다.

1단계에서는 자신의 프로퍼티의 모든 값을 할당합니다.
모든 저장 프로퍼티의 초기 상태가 결정합니다.

2단계에서는 저장 프로퍼티들이 커스터마이즈 될 기회를 얻습니다.

2단계 초기화를 통해 초기화되기 전에 프로퍼티 값에 접근하는 것을 막아
초기화를 안전하게 할 수 있도록 만듭니다.

Swift는 4가지 안전확인을 진행합니다.

  1. 자식클래스가 부모의 생성자를 호출하기 전에 자신의 프로퍼티를 모두 초기화 하였는지 확인합니다.
  2. 자식클래스의 생성자는 부모의 생성자를 호출한 후 부모의 프로퍼티의 값을 할당할 수 있습니다.

  3. 편의 생성자는 프로퍼티에 값을 할당하기 전에 지정 생성자를 호출하여야 합니다.

  4. 초기화 1단계를 거치기전까지는 인스턴스 메서드, 프로퍼티를 호출할 수 없으며
    self키워드도 사용할 수 없습니다.

생성자 재정의

부모 생성자와 똑같은 매개변수(매개변수 이름과 매개변수 타입이 같은)를 받는 생성자를
자식 클래스에서 구현하기 위해서는 생성자를 재정의하여야 합니다.
override를 붙여주어 재정의할 수 있으며 부모 편의 생성자는 override를 붙여줄 필요가 없습니다.

생성자 자동 상속

만약 자식클래스에서 프로퍼티 기본값을 모두 제공한다고 하였을때
자식클래스에서 별도의 지정 생성자를를 구현하지 않는다면 부모의 지정 생성자가 자동 상속됩니다.
만약 부모의 지정 생성자를 모두 재정의 하였다면 부모의 편의 생성자가 자동으로 상속됩니다.

요구 생성자

만약 자식이 부모클래스를 상속하였을 때 자신의 생성자의 재정의를 강제하도록 만들 수 있습니다.
required라는 키워드를 통해 자식클래스가 부모 클래스의 생성자의 재정의를 강제하게 만듭니다.

마치며

오늘은 상속의 핵심인 재정의와 생성자에 대해 알아보는 시간을 가졌습니다.
윗 글에 대한 질문은 하단의 댓글로 남겨주세요.

감사합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday