[Swift] 스위프트 익스텐션(extension) 정의 및 예제 코드
스위프트 클래스에 새로운 기능을 추가하는 또 다른 방법은 익스텐션(extension)을 이용하는 것이다. 익스텐션은 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에 메서드, 초기화(initializer), 그리고 연산 프로퍼티와 서브스크립트(subscript) 등의 기능을 추가하기 위하여 사용될 수 있다. 스위프트 언어와 iOS SDK 프레임워크에 내장된 클래스에 기능을 추가할 때 익스텐션을 이용하면 매우 효과적일 수 있다.
클래스는 다음의 구문을 이용하여 익스텐션된다.
extension ClassName {
// 새로운 기능을 여기에 추가한다
}
이번 예제에서는 표준 Double 클래스에 제곱 값을 반환하는 프로퍼티와 세제곱 값을 반환하는 프로퍼티를 추가하고자 한다고 가정하자. 이 기능은 다음의 익스텐션 선언부를 이용하여 추가할 수 있다.
extension Double {
var squared: Double {
return self * self
}
var cubed: Double {
return self * self * self
}
}
Double 클래스에 두 개의 새로운 연산 프로퍼티를 갖도록 확장했으니 이제는 다음과 같이 이용할 수 있다.
let myValue: Double = 3.0
print(myValue.squared)
여기서 주목해야 할 점은 myValue 상수를 선언할 때 Double형이 되도록 선언하고 익스텐션 프로퍼티를 사용했다는 것이다.
실제로 이 프로퍼티는 하위 클래스를 사용하는 것이 아니라 익스텐션으로 추가된 것이므로, 우리는 Double 값에서 이 프로퍼티에 직접 접근할 수 있다.
print(3.0.squared)
print(6.0.cubed)
스텐션은 하위 클래스를 사용하지 않고 클래스의 기능을 확장할 수 있는 빠르고 편리한 방식을 제공한다. 하지만, 하위 클래스 역시 익스텐션보다 좋은 장점들을 가지고 있다. 예를 들어, 익스텐션을 이용해서는 클래스에 있는 기존의 기능을 오버라이드할 수 없으며, 익스텐션에는 저장 프로퍼티를 포함할 수도 없다.
상속받은 메서드 오버라이딩
class SavingsAccount: BankAccount {
var interestRate: Float
func calculateInterest() -> Float {
return interestRate * accountBalance
}
override func displayBalance() {
print("Number (accountNumber)")
print("Current balance is (accountBalance)")
print("Prevailing interest rate is (interestRate)")
}
}