← 메인으로

0806-1 서브클래싱과 익스텐션

상속, 클래스, 그리고 하위 클래스

상속 개념은 현실 세계의 관점을 프로그래밍으로 가져왔다. 이것은 클래스에 어떤 특성(예를 들어 메서드와 프로퍼티)을 정의할 수 있게 해주었고, 그 클래스를 상속받은 다른 클래스를 생성할 수 있게 해준다. 상속된 클래스는 부모 클래스의 모든 기능을 상속받으며 자신만의 기능을 추가하게 된다.

스위프트 상속 예제

class BankAccount { var accountBalance: Float var accountNumber: Int init(number: Int, balance: Float) { accountNumber = number accountBalance = balance } func displayBalance() { print("Number \(accountNumber)") print("Current balance is \(accountBalance)") } } 

SavingsAccount라고 불릴 BankAccount의 하위 클래스를 생성하기 위해 새로운 클래스를 선언하고, 부모 클래스로 BankAccount를 지정하자.

class SavingsAccount: BankAccount { } 

하위 클래스 기능 확장

이제 부모 클래스의 모든 기능을 포함하는 하위 클래스를 만들 수 있게 되었다. 하지만, 실제로 어떻게 되는지 확인하기 위해 저축 계좌 정보를 저장할 수 있도록 하위 클래스를 확장한다.

class SavingsAccount: BankAccount { // 클래스 상속 var interestRate: Float = 0.0 // 하위 클래스 프로퍼티 func calculateInterest() -> Float // 하위 클래스 함수 { return interestRate * accountBalance } } 

상속받은 메서드 오버라이딩하기

상속을 사용할 경우, 필요한 작업과 거의 비슷한 메서드를 부모 클래스에서 찾을 수 있을 것이다. 그러나 정확한 기능을 제공하기 위해서는 수정이 필요하다.

이러한 조건에서 할 수 있는 한가지 방법은 상속된 메서드를 무시하고 완전히 새로운 이름의 메서드를 새롭게 만드는 것이다. 하지만, 좀 더 좋은 방법으로는 상속받은 메서드를 오버라이딩하여 하위 클래스 내에 새로운 버전의 메서드를 만드는 것이다.

class SavingsAccount: BankAccount { var interestRate: Float = 0.0 func calculateInterest() -> Float { return interestRate * accountBalance } override func displayBalance() { print("Number \(accountNumber)") print("Current balance is \(accountBalance)") print("Prevailing interest rate is \(interestRate)") } } 
override func displayBalance() { super.displayBalance() // super: 상위 클래스의 기능 먼저 실행해! (기존 함수) print("Prevailing interest rate is \(interestRate)") // 새로운 기능: 이자율 추가로 출력 } 

super.displayBalance()가 뭐냐면? -> 상위 클래스가 정의한 함수인 displayBalance()를 먼저 실행해달라는 뜻.

하위 클래스 초기화하기

현재 SavingsAccount 클래스는 다음과 같이 부모 클래스인 BankAccount의 초기화 메서드를 상속하고 있다.

init(number: Int, balance: Float) { accountnumber = number accountBalance = balance } 
class SavingsAccount: BankAccount { var interestRate: Float init(number: int, balance: Float, rate: Float) { interestRate = rate super.init(number: number, balance: balance) } } 

Swift에서는 하위 클래스가 초기화될 때 반드시 하위클래스 고유 프로퍼티 먼저 초기화, 그 다음에 super.init(...)으로 상위 클래스 초기화를 호출한다.

SavingsAccount 클래스 사용하기

이제 SavingsAccount 클래스에 대한 작업이 끝났으니 부모 클래스인 BankAccount를 사용했던 이전의 예제 코드처럼 SavingsAccount 클래스를 사용할 수 있다.

let savings1 = SavingsAccount(number: 12311, balance: 600.00, rate: 0.07) print(savings1.calculateInterest()) savings1.displayBalance() 

스위프트 클래스 익스텐션

스위프트 클래스에 새로운 기능을 추가하는 또 다른 방법은 익스텐션을 이용하는 것이다. 익스텐션은 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에 메서드, 생성장, 그리고 연산 프로퍼티와 서브스크립트 등의 기능을 추가하기 위해 사용될 수 있다.

extension Double { // 기존 클래스 이름 var squared: Double { return self * self } var cubed: Double { return self * self * self } }