Swift

Swift - 6. 서브 클래싱과 익스텐션 개요

iosos 2023. 12. 28. 16:20

상속, 클래스, 하위 클래스

  • 클래스에 어떤 특성을 정의하고 그 클래스를 상속받은 다른 클래스를 생성
    • 부모 클래스의 모든 기능을 상속받으며, 자신의 기능을 추가
  • 클래스 상속을 통하여 클래스 계층 구조를 만듦
    • 계층 구조의 최상위 클래스 : 베이스 클래스 (루트 클래스)
    • 상속 받은 클래스 : 하위 클래스 (자식 클래스)
    • 하위 클래스가 상속받은 클래스 : 부모 클래스 (상위 클래스)
  • 하위 클래스는 반드시 단 한 개의 부모 클래스만 둘 수 있음 → 단일 상속
class BankAccount {
    var accountBalance : Float = 0  // 계좌에 남은 잔고
    var accountNumber : Int = 0     // 계좌 번호
    var fees : Float = 25.00        // 은행 수수료
    
    // 초기화
    init(number : Int, balance : Float){
        accountNumber = number
        accountBalance = balance
    }

    // 인스턴스 메서드
    func displayBalance(){
        print("Number \(accountNumber)")
        print("Current balance is \(accountBalance)")
    }
}

→ 기존의 BankAccount 클래스를 상속하여 저축 계좌 클래스를 생성하고 싶음

class SavingsAccount : BankAccount {

}

→ 부모인 BankAccount 클래스의 모든 메서드, 프로퍼티를 상속 받음

 

 

 

하위 클래스의 기능 확장

class SavingsAccount : BankAccount{
    var interestRate : Float = 0.0
    
    func calculateInterest() -> Float{
        interestRate * accountBalance
    }
}

 

 

 

메서드 오버라이딩

  • 부모에게 상속받은 메서드가 필요한 동작이 아닐 경우, 메서드를 오버라이드하여 하위 클래스 내에 새로운 버전의 메서드를 만드는 것
  • 규칙
    1. 하위 클래스의 오버라이딩 메서드는 부모 클래스 메서드의 매개변수 개수와 타입이 정확하게 일치해야 함
    2. 오버라이딩 하는 메서드는 반드시 부모 클래스 메서드가 반환하는 타입과 일치해야 함
  • displayBalance라는 메서드를 SavingsAccount 클래스에서는 계좌에 할당된 현재 이자율도 함께 출력하고 싶음 → 오버라이딩 사용
class SavingsAccount : BankAccount{
    var interestRate : Float = 0.0
    
    func calculateInterest() -> Float{
        interestRate * accountBalance
    }

    override func displayBalance(){
        print("Number \(accountNumber)")
        print("Current balance is \(accountBalance)")
        print("Prevailing interest rate is \(interestRate)")
    }
}

 

 

→ 계좌번호와 잔고 출력 호출은 코드의 중복!  -> 없앨 수 있음

 override func displayBalance(){
        super.displayBalance()
        print("Prevailing interest rate is \(interestRate)")
 }

 

 

 

 

하위 클래스 초기화

  • 하위 클래스는 부모 클래스인 BankAccount의 초기화 메서드를 상속하고 있음
init(number : Int, balance : Float){
        accountNumber = number
        accountBalance = balance
}

 

 

 

  • 이때 SavingsAccount 클래스는 이자율에 대한 변수가 추가로 필요함
  • 따라서 하위 클래스의 init 메서드는 이자율을 초기화하는 작업을 한 후 부모 클래스의 init 메서드를 호출하여 변수 초기화 해야 함
class SavingsAccount : BankAccount{
    var interestRate : Float = 0.0
    
    // 초기화
    init(number : Int, balance : Float, rate : Float){
        interestRate = rate
        super.init(number : number, balance : balance)
    }
...
}

→ 항상 하위 클래스의 초기화 작업 완료 후 부모 클래스의 init 메서드를 호출해야 함

 

 

 

SavingsAccount 클래스 사용하기

let savings1 = SavingsAccount(number: 12311, balance: 600.00, rate: 0.07)

print(savings1.calculateInterest()) // 42.0
savings1.displayBalance()

/*
 Number 12311
 Current balance is 600.0
 Prevailing interest rate is 0.07
 */

 

 

 

클래스 익스텐션 (Extension)

  • 클래스에 새로운 기능을 추가하는 방법
  • 익스텐션은 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에 메서드, 초기화, 연산 프로퍼티와 서브 스크립트 등의 기능을 추가하기 위해 사용
  • 내장된 클래스에 기능을 추가할 때 효과적
extension ClassName {
	// 새로운 기능 추가
}

 

 

 

  • Double 클래스에 제곱 값을 반환하는 프로퍼티와 세제곱 값을 반환하는 프로퍼티 추가
// extension
extension Double{
    var squared : Double {
        self * self
    }
    
    var cubed : Double {
        self * self * self
    }
}

let myValue : Double = 3.0
print(myValue.squared)  // 9.0
print(myValue.cubed)    // 27.0
print(3.5.cubed)        // 42.875
print(2.0.squared)      // 4.0
  • 익스텐션은 기존의 기능은 오버라이드 할 수 없음
  • 저장 프로퍼티 포함 x

'Swift' 카테고리의 다른 글

Swift - 8. 프로퍼티 래퍼  (0) 2023.12.29
Swift - 7. 구조체  (0) 2023.12.28
Swift - 5. 객체 지향 프로그래밍 기초  (0) 2023.12.27
Swift - 4. 함수, 메서드, 클로저 개요  (1) 2023.12.26
Swift - 3. 제어 흐름  (0) 2023.12.26