상속, 클래스, 하위 클래스
- 클래스에 어떤 특성을 정의하고 그 클래스를 상속받은 다른 클래스를 생성
- 부모 클래스의 모든 기능을 상속받으며, 자신의 기능을 추가
- 클래스 상속을 통하여 클래스 계층 구조를 만듦
- 계층 구조의 최상위 클래스 : 베이스 클래스 (루트 클래스)
- 상속 받은 클래스 : 하위 클래스 (자식 클래스)
- 하위 클래스가 상속받은 클래스 : 부모 클래스 (상위 클래스)
- 하위 클래스는 반드시 단 한 개의 부모 클래스만 둘 수 있음 → 단일 상속
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
}
}
메서드 오버라이딩
- 부모에게 상속받은 메서드가 필요한 동작이 아닐 경우, 메서드를 오버라이드하여 하위 클래스 내에 새로운 버전의 메서드를 만드는 것
- 규칙
- 하위 클래스의 오버라이딩 메서드는 부모 클래스 메서드의 매개변수 개수와 타입이 정확하게 일치해야 함
- 오버라이딩 하는 메서드는 반드시 부모 클래스 메서드가 반환하는 타입과 일치해야 함
- 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 |