Swift의 Extension은 기존 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가하는 기능을 제공, 그래서 기존 소스 코드를 수정하지 않고도 기능을 확장 가능
비교 항목 | 클래스 상속 (Inheritance) | 익스텐션 (Extension) |
---|---|---|
새로운 저장 프로퍼티 추가 | 가능 | 불가능 |
기존 메서드 오버라이딩 | 가능 (override 사용) | 🚫 불가능 |
새로운 메서드 추가 | 가능 | 가능 |
새로운 계산 속성 추가 | 가능 | 가능 |
새로운 초기화 메서드 추가 | 가능 | 가능 (단, 클래스에서는 제한이 있을 수 있음) |
기존 타입을 수정 없이 기능 확장 | 불가능 (수정 필요) | 가능 |
구조체(Struct), 열거형(Enum) 지원 | 지원 안됨 (클래스만 가능) | 가능 |
프로토콜 채택 가능 | 가능 | 가능 |
1) 클래스 상속
새로운 저장 프로퍼티(Stored Property) 추가 가능
부모 클래스의 기능을 변경(Override) 가능
인스턴스를 생성할 때 새로운 프로퍼티를 포함한 상태로 초기화 가능
2) Extension(익스텐션)
새로운 저장 프로퍼티 추가 불가능
기존 타입을 확장할 수 있지만, 인스턴스의 메모리 구조를 변경하지 않음
기존 클래스, 구조체, 열거형, 프로토콜의 기능을 확장하는 용도
1) 클래스 상속을 사용할 때
새로운 저장 프로퍼티를 추가해야 할 때
부모 클래스의 메서드를 변경(오버라이딩)해야 할 때
기존 클래스를 확장하고, 특정 동작을 재정의해야 할 때
2) 익스텐션을 사용할 때
기존 타입을 변경하지 않고 기능만 확장하고 싶을 때
구조체(Struct) 또는 열거형(Enum)에 기능을 추가해야 할 때
프로토콜을 채택하여 기존 클래스나 구조체에 새로운 기능을 추가할 때
클래스를 변경할 수 없을 때(UIKit 기본 클래스 등)
Extionsion은 자주 사용하였는데 클래스는 상속받아 커스텀 뷰, 뷰컨, 컴포넌트들만 생성해봤지 내가 생성한 클래스를 다른 클래스에 상속시켜본적은 없는 것 같다.