1. 확장의 개념과 메모리 구조
상속 = 수직확장 ( 성격이 비슷한 타입을 새로 만들어 저장속성을 추가하거나 메서드를 변형시켜서 사용)
확장 = 수평확장 ( 현재 존재하는 타입에 메서드를 추가하여 사용 >> 메서드 형태만. 추가가능)
기존기능에 새 기능을 추가하기 위해 확장을 정의하면 확장이 정의되기 전에 생성된 경우에도 기존 인스턴스에서 새 기능 사용이 가능함
확장(extension)은 원칙적으로 재정의 불가능하지만, @objc붙이면 재정의가 가능하다.
확장의 장점 ) Int같은건 애플이 만든 구조체인데 내가 건들이진 못해도 확장을 통해서 본인 마음데로 사용가능 (소급모델링)
즉, 원본소스에 대한 엑세스 권한이 없는 유형을 확장하는 기능이 포함되어 있다.
2. 확장가능 멤버 (속성과 메서드)
<확장가능멤버종류>
1) (타입)계산속성, (인스턴스) 계산속성
2) (타입)메서드, (인스턴스)메서드
3) 새로운생성자( 다만 클래스의 경우 편의생성자만 추가가능) >> 구조체는 편의생성자처럼 사용하려는애나 지정생성자 둘다 사용가능
4)서브스크립트
5) 새로운 중첩타입 정의 및 사용
6) 프로토콜 채택 및 프로토콜 관련 메서드
클래스/ 구조체/ 열거형 타입에 확장이 가능
새로운 메서드를 추가할 수 있지만, 상속처럼 본체에 대한 재정의는 불가 >> 재정의는 확장이 아닌 상속
<타입의확장 생성자의 경우 주의>
extention Sometype {
...
convenience init(...) { //확장에서 새로운 생성자 구현가능
self.init(...)
}
...
}
새로운 생성자를 구현해도 됨
본체의 지정생성자 호출
1) 클래스 = 편의생성자만 구현가능 (본래의 지정생성자를 호출하는 방법으로만 구현가능)
2) 구조체 = 지정생성자의 형태로도 자유롭게 생성자 구현가능
(구조체참고: 모든 저장속성에 기본값 + 본체엥서 생성자 구현하지 않은 경우,
본체에서기본생성자/ 멤버와이즈 생성자가 제공됨
직접생성자 구현시 >> 제공 안되는것이 원칙이지만, 확장에서의 구현은 괜찮음 따라서 기본생성자/ 멤버와이즈 생성자 지속 제공되며, 확장에서도 호출도 가능하다.)
관습적으로 프로토콜의 채택은 확장에서 구현하는것을 권장한다 >> 이유는 프로토콜단원에 나온다.
이 포스팅은 인프런 앨런의 스위프트문법강의를 참고하여 작성하였습니다.
'swift문법' 카테고리의 다른 글
| [Swift] Part16_메서드 디스패치 (0) | 2022.08.25 |
|---|---|
| [Swift] Part15_프로토콜 (0) | 2022.08.24 |
| [Swift] Part13_타입캐스팅(Type Casting) (0) | 2022.08.23 |
| [Swift] Part12_클래스(상속과 초기화) (0) | 2022.08.23 |
| 참고) 싱글톤패턴 (2) | 2022.08.23 |