<aside> 💡 기존 클래스, 구조체, 열거형, 프로토콜 타입 등에 새로운 기능을 추가하여 확장할 수 있는 기능

익스텐션이 타입에 추가할 수 있는 기능

클래스의 상속과 익스텐션 차이

Untitled

<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

Initializer(생성자) 추가하기

기존 타입에 새로운 이니셜라이저를 추가할 수 있다.