상속 [ Type Inference ]
클래스 만이 상속 가능하며,
상속은 단일 상속만 허용된다.
클래스는 메서드, 프로퍼티 및 기타 특징들을 상속할 수 있다.
기본 클래스 [ Basic Class ]
아무런 상속을 받지 않는 클래스를 말한다.
// example1
class Human {
var name: String?
var age: Int?
var height: Int?
var weight: Int?
}
서브 클래싱 [ Subclassing ]
기본 클래스를 기반으로
새로운 클래스를 만드는 작업이다.
// example2
class Vehicle {
let speed: Int
init(speed: Int) {
self.speed = speed
}
func display() {
print("speed is \(speed)")
}
}
class Car: Vehicle {
init() {
super.init(speed: 120)
}
}
let car = Car()
car.display() // speed is 120
클래스 Car
는 클래스 Vehicle
을 상속받는다.
이를 서브클래싱한다고 표현한다.
상속받고자 하는 클래스를
슈퍼 클래스 [ Super Class ] 라고 하고,
상속받는 클래스를
서브 클래스 [ Sub Class ] 라고 한다.
상속 관계에 있는 모든 멤버를 포함하고, 접근도 가능하게 된다.
상속 방지 [ final ]
어떠한 클래스도 상속 받을 수 없도록
class
키워드 앞에 final
을 추가해주면 된다.
// example3
final class Human {
var name: String?
var age: Int?
}
오버라이딩 [ Overriding ]
자식 클래스가
부모 클래스에서 상속받은 것을 재정의하는 작업이다.
오버라이딩은 인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 서브 스크립트 모두에 대해 가능하다.
// example4
class Vehicle {
let speed: Int
init(speed: Int) {
self.speed = speed
}
func display() {
print("speed is \(speed)")
}
}
class Car: Vehicle {
init() {
super.init(speed: 120)
}
override func display() {
print("car's speed : \(speed)")
}
}
let car = Car()
car.display() // car's speed : 120
오버라이딩 방지 [ final ]
자식 클래스에서 특정 메소드, 프로퍼티 등이
재정의되는 것을 방지하기 위해 final
키워드를 사용한다.
// example5
final class Vehicle {
let speed: Int
init(speed: Int) {
self.speed = speed
}
func display() {
print("speed is \(speed)")
}
}
final
을 적용하는 것이 성능에 이점이 있다.final
로 선언된 요소들은 직접 호출하는 반면에,
그렇지 않은 요소들은 vtable 을 통해 간접 호출되어
직접 호출되는 경우보다 느리게 작동한다고 한다.
vtable
가상 메소드 테이블이며,
메소드 오버라이딩에 따라 실행 시점에 어떤 메소드를 실행할지
결정하는 동적 디스패치를 지원하기 위해 프로그래밍 언어에서
사용하는 메커니즘이다.
📚 Referecne
Swift) 상속(Inheritance) 정복하기 (1/2) - 상속이란?
Swift) 상속(Inheritance) 정복하기 (2/2) - 오버라이딩(Overriding)