티스토리 뷰
Extension 이란?
Extension(익스텐션)은 구조체, 클래스, 열겨형 등의 타입에 새로운 기능을 추가할 수 있는 기능입니다. 이때 타입의 원본 코드를 알지 못해도, 타입이름만으로도 기능을 확장할 수 있습니다.
-> 만약 Int 타입의 기능을 확장하고 싶다면? Int타입의 자세한 구현 코드를 알지 못해도, Int라는 타입이름을 알고 있으니 extension을 사용하면 기능을 확장할 수 있는 것이죠!
Swift에서 extension을 이용하면 다음과 같은 일들을 할 수 있습니다.
- 계산된 인스턴스 프로퍼티와 계산된 타입 프로퍼티의 추가
- 인스턴스 메서드와 타입 메서드의 추가
- 새로운 이니셜라이저 제공
- 서브스크립트 정의
- 중첩 타입의 선언과 사용
- 특정 프로토콜을 따르는 타입 만들기
상속 VS 익스텐션
상속과 익스텐션은 기능을 추가한다는 공통점이 있습니다.
둘의 차이점은 과연 무엇일까요?
상속 | 익스텐션 | |
확장 | 수직확장 (부모클래스, 자식클래스) | 수평적 확장 |
사용 | 클래스 타입 | 클래스, 구조체, 프로토콜, 제네릭 등 모든 타입 |
재정의 | o | x (불가능) |
표에서 볼 수 있듯 상속은 부모클래스-자식클래스로 이뤄져 수직적인 확장이고, Extension을 이용한 확장은 수평적 확장이라고 할 수 있겠습니다. 그리고 상속은 오직 클래스 타입에서만 이용됩니다.
또한 상속에서는 재정의가 가능하지만, 익스텐션에서 기존의 기능을 다시 재정의 override 하는 것은 불가능합니다.
Extension 정의하기
extension 확장할 타입 이름 {
// 추가할 새로운 기능 구현
}
- extension 이라는 키워드를 이용하여 정의합니다.
- 확장할 타입 이름만 알면 extension 기능을 사용할 수 있습니다.
Extension 사용예시
Int 타입에 새롭게 짝수와 홀수를 판별하는 기능을 추가해보도록 하겠습니다.
func printEvenOrOdd() {
// extension 사용하기
print(1.isEven) // false
print(2.isEven) // true
print(1.isOdd) // true
print(2.isOdd) // false
}
// extension 정의
extension Int {
var isEven: Bool {
return self % 2 == 0 // true or false로 반환될 것
}
var isOdd: Bool {
return self % 2 == 1 // true or false로 반환될 것
}
}
isEven, isOdd라는 연산 프로퍼티를 추가했습니다.
이 Extension이 적용된 코드에서 만약 (Int형의무언가).isEven 을 하게되면 self가 바로 (Int형의무언가) 를 가리키게 되므로
(Int형의무언가)가 2로 나눴을때 나머지가 0일때 비교연산자(==)를 거쳐 true가 반환되게 되고, 0이 아니라면 false가 반환되게 됩니다.
.isOdd를 하게 되면 self에 해당하는 (Int형의무언가)를 2로 나눴을때 나머지가 1일때 true가 반환되고, 아니라면 false가 반환되게 됩니다.
아래와 같이 메서드확장도 할 수 있습니다.
func mul(){
print(3.multiply(by: 2)) // 3 * 2 가 리턴되어 6으로 출력됨
print(4.multiply(by: 5)) // 4 * 5 가 리턴되어 20이 출력됨
}
extension Int {
func multiply(by n: Int) -> Int {
return self * n;
}
}
이니셜라이저 추가도 가능합니다.
extension String {
init(int: Int) {
self = "\(int)"
}
init(double: Double) {
self = "\(double)"
}
}
let stringFromInt: String = String(int: 100)
// "100"
let stringFromDouble: String = String(double: 100.0)
// "100.0"
'iOS' 카테고리의 다른 글
[iOS/Swift] UIView, UIImageView에 그림자주기 (0) | 2021.06.07 |
---|---|
[오류] outlet cannot be connected to repeating content (0) | 2021.06.07 |
[Swift] Protocol ? 프로토콜? (4) | 2021.04.29 |
[iOS/Swift] Scroll View 스크롤뷰 (0) | 2021.04.20 |
[iOS/Swift] Stack View 스택뷰 (0) | 2021.04.20 |