SwiftUI

[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)")   
   }
}

Leave a Reply

error: Content is protected !!