
클래스에는 상속 개념이 있다.
어떤 클래스가 다른 클래스의 모든 메서드와 프로퍼티를 상속받고, 이에 더해 자신만의 기능을 추가할 수 있음.
Swift의 계층 구조는 다음과 같다.

하위 클래스는 계속해서 다른 하위 클래스를 둘 수 있다. 근데 이게 계속 연결된다고 해서 한 세대를 넘어서 상속되지는 않음. 하나의 하위클래스는 하나의 부모클래스만 둘 수 있다(:단일 상속(single inheritance)).
[루트 클래스]
class BankAccount {
var accountBalance: Float
var accountNum: Int
init(balance: Float, num: Int) {
accountBalance = balance
accountNum = Num
}
func displayBalance() {
print("Number \(accountNumber)")
print("Current balance is \(accountBalance)")
}
}
위의 루트 클래스를 부모 클래스로 받는 방법은 다음과 같다.
class SavingsAccount: BankAccount{}
👇🏻
class savingsAccount: BankAccount {
var interestRate: Float = 0.0
func calculateInterest() -> Float{
return interestRate * accountBalance
}
}
accountBalance에 대한 정보를 상위클래스인 BankAccount()에서 상속받아 가져온다.
부모 클래스에서 메소드 등을 참조해올 때, 그걸 있는 그대로 상속받아 쓸 수도 있지만 변형을 주고 싶을 수도 있다. 이럴 때 오버라이딩을 사용한다.
class savingsAccount: BankAccount {
var interestRate: Float = 0.0
func calculateInterest() -> Float{
return interestRate * accountBalance
}
override func displayBalance() {
super.displayBalance() //풀어서 써도 상관없음
print("Prevailing interest rate is \(interestRate)")
}
}
위의 예제처럼 super을 사용하여 받아와도 되고, func displayBalance()의 내용을 그대로 써도 무방하다.
위의 예제에서, 현재 SavingsAccount 클래스는 부모클래스 BankAccount의 계좌번호, 잔액 초기화를 상속하고있다.
SavingsAccount를 쓸 경우, 이자율도 초기화해야 하므로 다음과 같이 추가로 초기화 코드를 작성해줘야 한다.
class savingsAccount: BankAccount {
var interestRate: Float = 0.0
init(number: Int, balance: Float, rate: Float) {
interestRate = rate
super.init(number: number, balance: balance)
}
.
.
}
위의 과정을 통해 하위 클래스에 대한 작업을 마친 후, 사용 방법:
let savings1 = SavingsAccount(number: 12311, balance: 600.00, rate: 0.07)
print(savings1.calculateInterest())
savings1.displayBalance()
📚 참고도서
[SwiftUI 기반의 iOS 프로그래밍]