[Swift] 상속의 개념, 오버라이드

팔랑이·2023년 6월 14일
post-thumbnail

상속

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

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()에서 상속받아 가져온다.

오버라이드(override)

부모 클래스에서 메소드 등을 참조해올 때, 그걸 있는 그대로 상속받아 쓸 수도 있지만 변형을 주고 싶을 수도 있다. 이럴 때 오버라이딩을 사용한다.

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 프로그래밍]

profile
정체되지 않는 성장

0개의 댓글