상속 : 부모가 자식에게 재산을 물려주는 행위
클래스가 다른 클래스로부터 메소드 프로퍼티 또는 다른 특성들을 상속받는것
상속받는 클래스 : 자식클래스, 서브클래스
상속하는 클래스 : 부모클래스, 슈퍼클래스
코드로 확인
상속
상속받은 서브클래스는 부모클래스로 부터 물려받은 메소드 프로퍼티 서브스크립트를 호출하거나 접근할 수 있다
import UIKit
//슈퍼클래스
class Vehicle {
var currentSpeed = 0.0
var description: String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
}
}
//상속
/*
class 클래스이름: 부모클래스이름 {
//하위클래스 정의
}
*/
//서브클래스
class Bicycle: Vehicle {
var hasBasket = false
}
var bicycle = Bicycle()
bicycle.currentSpeed // 0
bicycle.currentSpeed = 15.0
bicycle.currentSpeed // 15
오버라이딩
서브클래스는 override 키워드를 사용하여 슈퍼클래스에서 정의된 메소드, 프로퍼티, 서브스크립트 등을 자신만의 내용으로 재정의 할 수 있다.
- 만약 같은 이름의 정의가 슈퍼클래스에 없는데 오버라이드키워드를 사용하면 컴파일러 오류가 난다
- 슈퍼클래스에 동일한 이름의 정의가 있는데 오버라이드키워드를 사용하지 않으면 컴파일러 오류가 난다
함수 오버라이딩
import UIKit
//슈퍼클래스
class Vehicle {
var currentSpeed = 0.0
var description: String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
}
}
//서브클래스
class Train: Vehicle{
override func makeNoise() { //오버라이딩
print("choo choo")
}
}
let train = Train()
train.makeNoise()
----------------------------------------
choo choo
키워드 super
import UIKit
//슈퍼클래스
class Vehicle {
var currentSpeed = 0.0
var description: String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
print("speaker on")
}
}
//서브클래스
class Train: Vehicle{
override func makeNoise() {
super.makeNoise() //super 키워드 사용으로 슈퍼클래스의 함수 먼저 호출
print("choo choo")
}
}
let train = Train()
train.makeNoise()
-------------------------------------------------
speaker on
choo choo
프로퍼티 오버라이딩
import UIKit
//슈퍼클래스
class Vehicle {
var currentSpeed = 0.0
var description: String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
print("speaker on")
}
}
//서브클래스
class Car: Vehicle{
var gear = 1
override var description: String { //프로퍼티 오버라이딩
return super.description + " in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 30.0
car.gear = 2
print(car.description)
---------------------------------------------------
traveling at 30.0 miles per hour in gear 2
프로퍼티 옵저버
import UIKit
//슈퍼클래스
class Vehicle {
var currentSpeed = 0.0
var description: String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
print("speaker on")
}
}
//서브클래스
class Car: Vehicle{
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
//서브클래스
class AutomaticCar: Car{
override var currentSpeed: Double {
didSet { //프로퍼티옵저버, currentSpeed값이 변하면 gear 리턴
gear = Int(currentSpeed / 10) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
-------------------------------------------------------------
AutomaticCar: traveling at 35.0 miles per hour in gear 4
더해서
- 계산 프로퍼티와 저장프로퍼티를 오버라이딩한 프로퍼티는 getter, setter를 가질 수 있다
- 자식클래스에서 재정의하려는 프로퍼티는 슈퍼클래스의 프로퍼티의 이름과 타입이 일치해야 한다
- 슈퍼클래스에서 read-write로 선언된 프로퍼티를 서브클래스에서 read-only로 정의 할 수 없지만
- 슈퍼클래스에서 read-only로 선언된프로퍼티를 서브클래스에서 read-write로 정의 할 수 있다.
- 상속된 프로퍼티에 프로퍼티 옵저버를 추가할 때 상수저장프로퍼티나 read-only연산프로퍼티는 값을 재설정할 수 없기 때문에 프로퍼티옵저버를 추가할 수 없다.
- 메서드, 프로퍼티 등을 오버라이딩하지 못하게 하려면 키워드 앞에 final 키워드를 작성해주면 된다.
- final키워드가 사용되서 정의된 요소를 오버라이딩 시도하면 컴파일러 오류가 난다.
글의 모든 내용은 패스트캠퍼스 강의를 시청하고 작성한 내용입니다.
End