Swift.Inheritance(뒷 부분은 다시보고 정리하기)

junseole·2021년 8월 25일
0

Swift-Basic

목록 보기
11/12
post-thumbnail

스위프트 프로그래밍 3판을 보고 정리한 내용입니다.

상속이란?

기반클래스를 다른 클래스에서 물려받는것을 의미한다.

부모클래스의 메서드, 프로퍼티 등을 재정의하거나, 기반클래스의 기능이나 프로퍼티를 물려받고 자신의 기능을 추가할수 있다.

클래스 이름 뒤에 콜론을 붙이고 다른 클래스 이름을 써주면 뒤에 오는 클래스의 기능을 앞의 클래스가 상속한다는것을 의미한다.

class 클래스 이름 : 부모클래스 이름{
  //프로퍼티와 메서드들
}

재정의(override)

부모클래스부터 물려받은 특성을 그대로 사용하지 않고 자신만의 기능으로 변경하여 사용

새로운 정의 앞에 override라는 키워드를 사용

재정의할 해당 특성이 없는데 override할 경우 컴파일 오류 발생

만약 부모 버전의 메소드를 호출하고 싶다면 super 키워드로 호출이 가능하다.

프로퍼티 재정의

프로퍼티 자체가 아니라 프로퍼티의 접근자(getter),설정자(setter),프로퍼티 감시자(property observer)등을 재정의하는 것을 의미

프로퍼티 감시자 재정의

감시자도 프로퍼티의 접근자와 설정자처럼 재정의 가능하다.

조상클래스에 정의한 프로퍼티가 연산 프로퍼티인지 저장 프로퍼티인지 상관 X

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

이유 : 상수 저장 프로퍼티나 읽기 저장 프로퍼티는 값을 설정할 수 없으므로 willSet이나 didSet메서드를 사용한 프로퍼티 감시자를 원천적으로 사용할 수 없다.

프로퍼티 감시자를 재정의 해도 조상클래스에서 정의한 프로퍼티 감시자도 동작한다는 점 잊지말자!

지정 이니셜라이저와 편의 이니셜라이저

이니셜라이저가 정의된 클래스의 모든 프로퍼티를 초기화해야 하는 임무를 가지고 있다.

편의 이니셜라이저는 초기화를 좀 더 손쉽게 도와주는 역할을 한다.

지정 이니셜라이저를 사용하면 인스턴스를 생성할 때마다 전달인자로 초깃값을 전달해야 하지만 편의 이니셜라이저를 사용하면 항상 같은 값으로 초기화가 가능하다.

//지정 이니셜라이저
init(매개변수들){
  //초기화 구문
}

convenience init(매개변수들){
  //초기화 구문
}

클래스의 초기화 위임

자식 클래스의 지정 이니셜라이저는 반드시 부모 클래스의 지정 이니셜라이저를 반드시 호출한다.

편의 이니셜라이저는 자신을 정의한 클래스의 다른 이니셜라이저를 반드시 호출한다.

편의 이니셜라이저는 반드시 지정이니셜라이저를 호출해야한다.

2단계 초기화

스위프트의 클래스 초기화는 2단계를 거친다.

1단계 : 클래스에 정의한 각각의 저장 프로퍼티에 초깃값이 할당

2단계 : 저장 프로퍼티들을 사용자 정의할 기회를 얻는다.

이니셜라이저 상속 및 재정의

기본적으로 스위프트의 이니셜라이저는 부모클래스의 이니셜라이저를 상속받지 않는다.

부모클래스와 동일한 지정 이니셜라이저를 자식클래스에서 구현하려면 재정의하면 된다.

이니셜라이저 자동 상속

특정 조건에 부합하면 부모 클래스의 이니셜라이저를 자동으로 상속한다.

  1. 자식클래스에서 별도의 지정 이니셜라이저를 구현하지 않는다면 부모클래스의 지정 이니셜라이저가 자동으로 상속
  2. 부모클래스의 지정 이니셜라이저를 모두 재정의하여 부모클래스와 동일한 지정 이니셜라이저를 모두 사용할 수 있는 상황이라면 부모클래스의 편의 이니셜라이저가 모두 자동으로 상속된다.

요구 이니셜라이저

required 수식어를 클래스의 이니셜라이저 앞에 명시해주면 이 클래스를 상속받은 자식 클래스에서 반드시 해당 이니시렬라이저를 구현해야 한다.

단, 자식 클래스에서 요구 이니셜라이저를 재정의 할 때는 override 수식어 대신에 required 수식어를 사용한다.

profile
Swift와 함께 여행중입니다.

0개의 댓글