[iOS] Inheritance

Eugenie·2022년 5월 3일
0

상속 [ 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)

profile
🌱 iOS developer

0개의 댓글