티스토리 뷰
상속 (Inheritance)
클래스는 메소드, 프로퍼티, 다른 특징들을 다른 클래스로 부터 상속할 수 있습니다.
상속을 해주는 클래스를 superclass(상위 클래스, 슈퍼 클래스)라고 하며,
상속 받는 클래스는 subclass(하위 클래스, 서브 클래스)라고 합니다.
상속은 Swift에서 다른 유형과 클래스를 구별하는 근본적 요소 입니다.
클래스는 상속된 프로퍼티에 프로퍼티 옵저버를 추가하여 프로퍼티 값이 변경될 때 알림을 받을 수도 있습니다.
프로퍼티 옵저버는 저장프로퍼티, 연산프로퍼티에 관계 없이 모든 프로퍼티에 추가할 수 있습니다.
프로퍼티 옵저버는 여기에 정리해 놓았습니다.
클래스 정의 (Defining a base class)
base 클래스란 어떤 클래스로 부터도 상속받지 않은 클래스를 말합니다.
NOTE
superclass를 지정하지 않고 정의한 클래스는 자동으로 base 클래스가 됩니다.
예제
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// do nothing - an arbitrary vehicle doesn't necessa
}
}
Vehicle 이라는 base 클래스를 정의했으며,
이 클래스는 currentSpeed 프로퍼티, description 연산 프로퍼티, makeNoise() 메소드를 갖고 있습니다.
아래와 같이 Vehicle 객체를 생성할 수도 있습니다.
let someVehicle = Vehicle()
print(someVehicle.description)
// traveling at 0.0 miles per hour
서브클래싱 (Subclassing)
상위 클래스의 성격을 상속 받고 자기 자신의 고유 특성도 추가할 수 있습니다.
문법
class SubClass: SuperClass {
// code
}
예제
위에서 사용했던 Vehicle 을 서브클래싱 하는 Bicycle을 아래와 같이 표현할 수 있습니다.
class Bicycle: Vehicle {
var hasBasket = false
}
서브클래스(Bicycle)의 객체를 생성하고, 프로퍼티도 변경할 수 있습니다.
let bicycle = Bicycle()
bicycle.hasBasket = true
슈퍼클래스(Vehicle)의 currentSpeed, description 프로퍼티도 사용 가능합니다.
bicycle.currentSpeed = 15.0 // Vehicle클래스의 currentSpeed를 상속받음
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour
서브클래스로 생성된 클래스를 다른 클래스에 서브클래싱 할 수 있습니다.
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
이제 Tandem 클래스는 Vehicle, Bicycle 의 프로퍼티와 메소드를 사용할 수 있습니다.
오버라이딩 (Overriding)
슈퍼클래스에서 상속받은것을 서브클래스에서 재정의 하는걸 말합니다.
overriding이라고 하며,
인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입프로퍼티, 서브스크립트 모두 가능합니다.
override 키워드를 가장앞에 선언하여 사용합니다.
슈퍼클래스 메소드, 프로퍼티, 서브스크립트의 접근
(Accessing Superclass Methods, Properties and Subscripts)
super 키워드와 ' . '(점문법) 혹은 인덱스 구문으로 슈퍼클래스의 메소드, 프로퍼티, 서브스크립트에 접근할 수 있습니다.
메소드 접근 = super.someMethod()
프로퍼티 접근 = super.someProperty
서브스크립트 접근 = super[someIndex]
메소드 오버라이드 (Overriding Methods)
Vehicle 클래스에서 상속받은 makeNoise() 메소드 앞에 override 키워드를 붙여주면 재정의 할 수 있습니다.
// class Vehicle {
// func makeNoise() {
// // do nothing - an arbitrary vehicle doesn't necessa
// }
//}
class Train: Vehicle {
override func makeNoise() {
print("칙칙 췍")
}
}
let train = Train()
train.makeNoise()
// 칙칙 췍
프로퍼티 오버라이드 (Overriding Properties)
상속받은 저장 프로퍼티, 연산 프로퍼티 모두 override 할 수 있으며,
override시에는 프로퍼티의 이름과 타입을 명시 해야합니다. (상속받은 프로퍼티 형태로만 인식하기 때문)
//class Vehicle {
// var currentSpeed = 0.0
// var description: String {
// return "traveling at \(currentSpeed) miles per hour"
// }
// ...
//}
class Car: Vehicle {
var gear = 1 // Car 의 고유 프로퍼티
override var description: String { // override시 프로퍼티 이름(description), 타입(String) 명시
return super.description + " in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// Car: traveling at 25.0 miles per hour in gear 3
1. Car 클래스는 Vehicle를 상속 받고
2. currentSpeed 를 25로 변경, Car 클래스의 고유 프로퍼티 gear 를 3 으로 변경.
프로퍼티 옵저버 오버라이드 (Overriding Properties Observers)
슈퍼클래스에 선언된 프로퍼티 옵저버도 서브클래스에서 재정의해 사용할 수 있습니다.
NOTE
상수 프로퍼티와 읽기전용 프로퍼티는 set을 할 수 없기 때문에 옵저버를 붙일 수 없습니다.
아래는 프로퍼티 옵저버 오버라이드의 예제 입니다.
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
print("oldValue:", oldValue)
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
automatic.currentSpeed = 22.0
print("AutomaticCar: \(automatic.description)")
// oldValue: 0.0
// oldValue: 35.0
// AutomaticCar: traveling at 22.0 miles per hour in gear 3
오버라이드 방지 (Preventing Overrides)
서브클래스에서 오버라이드 되는것을 방지하려면 final 키워드를 사용합니다.
해당 클래스를 마지막으로 더이상 상속하지 않겠다는 뜻!!
final class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4
// 서브클래스 AutomaticCar를 상속하려하면 아래와 같은 에러가 나옵니다.
class SomeCar: AutomaticCar { // error: Inheritance from a final class AutomaticCar
var wiper = true
}
let someCar = SomeCar()
print(someCar.currentSpeed)
'iOS' 카테고리의 다른 글
[iOS] 다크모드 제한 (iOS 13+) (0) | 2022.04.15 |
---|---|
[iOS] 스토리 보드 없이 코드로 UI작업할 때 세팅 (no storyboard setting/ Code based UI) (0) | 2022.04.13 |
[iOS] GCD 심화 - 동시성과 관련된 문제들 (Race condition, Tsan, DispatchQueue barrier, Thread-safe, Deadlocks, Priority Inversion) (0) | 2022.04.08 |
[iOS] 메모리 구조 (memory) (0) | 2022.04.06 |
[iOS] LaunchScreen 설정 후 디바이스에만 나오지 않을때 (0) | 2022.04.05 |
- Total
- Today
- Yesterday
- Swift Leetcode
- Swift joined()
- RTCCameraVideoCapturer
- Swift ModernRIBs
- Swift init
- Swift joined
- 원티드 프리온보딩
- Swift 프로그래머스
- Swift 프로퍼티
- RIBs tutorial
- Swift final
- swift protocol
- CS 네트워크
- removeLast()
- 2023년 회고
- Swift inout
- Swift
- swift reduce
- swift property
- Swift 알고리즘
- swift (programmers)
- Combine: Asynchronous Programming with Swift
- swift programmers
- Class
- ios
- swift 고차함수
- iOS error
- Swift 내림차순
- Swift RIBs
- Swift Error Handling
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |