<aside> 💡 기존 클래스, 구조체, 열거형, 프로토콜 타입 등에 새로운 기능을 추가하여 확장할 수 있는 기능
override
) 불가익스텐션이 타입에 추가할 수 있는 기능
클래스의 상속과 익스텐션 차이
Class
- 클래스의 상속은 클래스 타입에서만 가능. 특정 타입을 물려받아 하나의 새로운 타입을 정의하고 추가 기능 구현하는 수직 확장Extension
- 구조체, 클래스, 프로토콜 등에 적용 가능. 기존 타입에 기능을 추가하는 수평 확장
</aside><aside> 💡 익스텐션을 이용해 클래스, 구조체, 열거형 혹은 프로토콜 타입에 (메서드)기능을 추가할 수 있습니다. retroactive modeling으로 알려진 것과 같이 원본 코드를 몰라도 그 타입에 대한 기능을 확장할 수 있습니다. 익스텐션은 Objective-C 의 카테고리와 유사합니다. Swift에서 익스텐션을 이용해 다음을 할 수 있습니다.
익스텐션은 타입에 새 기능을 추가할 수 있지만 오버라이드는(override)는 할 수 없습니다.
단 @objc 붙이면 가능 (슈퍼 클래스의 메서드 앞에다 작성시)
</aside>
<aside> 💡 상속과 Extension의 비교
현재 존재하는 타입
확장의 장점
</aside>
원본 타입(소스코드)에 접근하지 못하는 타입들도 확장해서 사용할 수 있다.
//Font 세팅시!
extension UIFont {
public enum PretendardType: String {
case regular = "-Regular"
case semibold = "-SemiBold"
case bold = "-Bold"
case extrabold = "-ExtraBold"
case medium = "-Medium"
}
}
→ 원하는 fontType 을 출력해주기위해 필요한 fontType을 구현하고 원본 코드는 그대로 두고, 원하는 기능만 해당타입에 확장하는것! 하지만 UIFont 원본을 건들지 않고, 위처럼 확장한 경우 앞으로 UIFont를 선언하는 모든 인스턴스는 UIFont+extension으로 구현해야한다.( where절로 제한을 줄수도 있다.)
저장 프로퍼티는 추가할 수 없으며, 오로지 "연산 프로퍼티"만 추가 가능하다
extension Int {
var half: Int {
return self / 2
}
}
let num = 100
print(num.half)
// 타입 메서드
extension Int {
static func printZero() {
print(0)
}
}
Int.printZero() //0
// 인스턴스 메서드
extension Int {
func printDouble() {
print(self * 2)
}
}
let num = 100
num.printDouble() //200
기존 타입에 새로운 이니셜라이저를 추가할 수 있다.