상속
- 클래스는 메서드나 프로퍼티 등을 다른 클래스로부터 상속받을 수 있습니다.
- Super/Sub Class로 구분된다
- Swift의 Struct는 상속을 받을 수 없다
- Java에서의 상속의 개념과 같다
메서드 재정의
//func aa() 라는 메소드를 재정의
override func aa(){
//...
}
프로퍼티 재정의
- 부모로부터 상속받은 인스턴스 프로퍼티나 타입 프로퍼티를 재정의할 수 있다
- 프로퍼티를 재정의하는 것은 프로퍼티 자체가 아니라, Getter/Setter/감시자 등을 재정의 하는 것을 의미함
- 부모 클래스에서 읽기전용이었어도 자식 클래스에서는 R/W 로 재정의 가능
- B.U.T. R/W -> 읽기전용은 불가능
프로퍼티 감시자 재정의
- willSet / didSet 도 재정의 가능 -> 연산/저장 프로퍼티 가능
- B.U.T. 상수 저장 / 읽기 연산 전용 프로퍼티는 재정의할 수 없다
-> 상수 저장 프로퍼티나 읽기 전용 연산 프로퍼티는 값을 설정할 수 없으므로!
서브스크립트도 재정의가 가능하다
재정의 방지
- 부모 클래스를 상속받는 자식클래스에서 몇몇 특성을 재정의할 수 없도록 제한하기 위함
- final 키워드를 사용 (final var, final func, final class func ....)
클래스의 이니셜라이저 - 상속과 재정의
- 값 타입의 init 은 구분할 필요가 없지만 class에서는 지정/편의 init으로 구분된다
지정/편의 Init
지정 init
- 클래스의 주요 이니셜라이저
- 필요에 따라 부모클래스의 init을 호출할 수 있으며, class의 모든 프로퍼티를 초기화해야하는 임무를 맡음
- 클래스당 하나 이상 정의됨 -> 지정하지 않으면 기본 지정 init 사용
- if) 부모 클래스의 지정 init이 자식 클래스의 지정 init 역할이 가능하다면, 자식 클래스에서 지정 init 새성하지 않아도 됨
편의 init
- 초기화를 손쉽게 도와주는 역할
- 자신의 내부에서 지정 init을 호출함
- 지정 init의 매개변수가 많아, 외부에서 일일이 전달하기 어렵거나, 특정 목적에 사용하기 위해 사용
지정/편의 init 관계(클래스의 초기화 위임)
- 자식의 지정 init은 부모의 지정 init을 반드시 호출해야 함
- 편의 init은 자신을 정의한 클래스의 다른 init(편의/지정)을 반드시 호출
- 편의 init은 궁극적으로 지정 init을 반드시 호출
2단계 초기화
- 스위프트 컴파일러는 2단계 초기화를 오류없이 처리하기 위해 4가지 안전확인을 실행한다
- 자식의 지정 init이 부모의 init을 호출하기 전에 자신의 프로퍼티 모두 초기화 확인
- 자식의 지정 init은 상속받은 프로퍼티에 값을 할당하기 전에 반드시 부모의 init을 호출
- 편의 init은 자신의 프로퍼티를 포함하여, 어떤 프로퍼티라도 값을 할당하기 전에 다른 init을 호출
- 초기화 1단계를 마치기 전까지는 init은 인스턴스 메서드를 호출 불가
- 또, 인스턴스 프로퍼티의 값을 읽을 수도 없음
- self 프로퍼티를 자신의 인스턴스를 나타내는 값으로 활용 불가
- 클래스의 인스턴스는 초기화 1단계를 마치기전까지는 유효하지 않다
- 1단계를 거쳤을 때 비로소 유효한 인스턴스가 됨
- 1단계
- 클래스가 지정/편의 init을 호출
- 클래스의 새로운 인스턴스를 위한 메모리가 할당 -> 아직 초기화되지 않은 상태
- 지정 init은 클래스에 정의된 모든 저장 프로퍼티에 값이 있는지 확인
- 지정 init은 부모의 init이 같은 동작을 행할 수 있도록 초기화를 양도
- 부모는 상속 체인을 따라 최상위 클래스에 도달할 때까지 이 작업을 반복
- 최상위 클래스에 도달했을 때, 모든 저장 프로퍼티에 값이 있다고 확인하면 인스턴스의 메모리가 초기화
- 2단계
- 최상위 클래스로부터 최하위 클래스까지 상속 체인을 따라 내려오면서 지정 init들이 인스턴스를 제각각 정의
- 이 단계에서는 self를 통해 프로퍼티 값을 수정 가능
- 인스턴스 메서드를 호출 가능
- 마지막으로 각각의 편의 init을 통해 self. 를 통한 사용자 정의 작업을 진행 가능
- 최상위 클래스로부터 최하위 클래스까지 상속 체인을 따라 내려오면서 지정 init들이 인스턴스를 제각각 정의
'Swift' 카테고리의 다른 글
[Swift] Nested JSON Decode (0) | 2021.03.16 |
---|---|
[Swift] Codable-CodingKey 을 이용해 JSON 파싱하기 (0) | 2021.01.25 |
[Swift] 서브스크립트 - 스위프트 언어 및 문법(12) - feat.야곰's Swift Programming (0) | 2021.01.18 |
[Swift] 모나드 - 스위프트 언어 및 문법(11) - feat.야곰's Swift Programming (0) | 2021.01.18 |
[Swift] 고차함수 - 스위프트 언어 및 문법(10) - feat.야곰's Swift Programming (0) | 2021.01.18 |