티스토리 뷰
OOP에서 상속은 객체들 간의 관계를 만들어주는 편리한 방법이지만 클래스가 아닌 타입에서는 불가능합니다.
스위프트에서는 클래스 뿐아니라 다른 타입에서도 새로운 기능을 추가해줄 수 있는 익스텐션이라는 장치를 제공합니다.
Extension
익스텐션은 기존 클래스, 구조, 열거형을 포함한 모든 타입에 새로운 기능을 추가할 수 있도록 만들어 줍니다.
연산 프로퍼티, 메서드, 이니셜라이저, 서브스크립트, 중첩 데이터 타입 등을 추가할 수 있습니다.
안에 있는 내용을 알고 있지 않아도 해당 타입이 무엇인지만 알고있다면 기능을 확장할 수 있습니다.
마치 클래스의 상속과 비슷해보이나, 익스텐션에서는 추가는 가능해도 재정의는 불가능하다는 차이가 존재합니다.
특히 외부 라이브러리나 프레임워크처럼 소스를 수정할 수 없는 타입에 기능을 추가할 때 익스텐션을 사용합니다.
익스텐션은 프로토콜과 같이 자주 사용되어 객체 지향 프로그래밍을 너머 프로토콜 지향 프로그래밍(Protocol-Oriented Programming, POP)으로 개념을 확장시켜줍니다.
익스텐션 구현
struct volume{
var x:Int?
var y:Int?
var z:Int?
init(X=Int, Y=Int, Z=Int){ // 지정 이니셜라이저
x=X
y=Y
z=Z
}
}
extension volume{ // volume이라는 이름을 가진 타입의 기능을 확장
var isEven: Bool { return self.x % 2 == 0 } // 연산 인스턴스 프로퍼티
static var isOdd: Bool { return self.x % 2 == 1 } //연산 타입 프로퍼티
func square: Int { return self.x*self.y } // 인스턴스 메서드
static func cube: Int { return self.x*self.y*self.z } // 타입 메서드
init(X=Int, Y=Int){ // 편의 이니셜라이저
x=X
y=Y
}
}
익스텐션을 통해 기존에 구현하지 않았던 기능들을 추가할 수 있습니다.
extension B: ProtocolX, ProtocolY, ProtocolZ {
/* 프로토콜 요구사항 구현 */
}
익스텐션은 기존에 존재하는 타입이 추가적으로 다른 프로토콜을 채택할 수 있도록 확장할 수도 있습니다.
이 밖에도 서브스크립트, 중첩 타입 등을 추가할 수 있지만 저장 프로퍼티나 프로퍼티 감시자는 추가할 수 없습니다.
'Swift' 카테고리의 다른 글
[스위프트] guard let / if let (0) | 2021.03.21 |
---|---|
[Swift] Color Literal / Custom Color (0) | 2021.03.15 |
[Swift] 인스턴스 (0) | 2021.01.16 |
[Swift] 프로퍼티의 종류 (0) | 2021.01.13 |
[Swift] 메서드 (0) | 2021.01.13 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- test coverage
- 강한 순환 참조
- 벨만포드 알고리즘
- 최단경로 알고리즘
- rxswift
- mach-o
- 최단경로 문제
- IOS
- WWDC19
- 포드 풀커슨 알고리즘
- MeTal
- 네트워크 유량
- Testable
- CPU와 Memory
- HIG
- WWDC17
- WWDC16
- WWDC21
- observeOn
- 다익스트라 시간복잡도
- 코딩대회
- 에드몬드 카프 알고리즘
- 최대 매칭
- 부스트캠프 6기
- 벨만포드 시간복잡도
- CompositionalLayout
- 네트워크 플로우
- 컴퓨터 추상화
- State Restoration
- 최단경로문제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함