클래스 타입에서만 사용할 수 있는 타입 메서드

static키워드를 사용한 것과 동일하게 전역에서 클래스 타입에 바로 사용할 수 있는 키워드
class Parent {
class func classMethod() {
print("Parent의 class method입니다.")
}
}
class Child: Parent {
override class func classMethod() {
print("Child에서 재정의된 class method입니다.")
}
}
Child.classMethod()
static 키워드를 사용한 메서드와 동일하게 해당 타입을 직접 접근해 메서드 호출을 가능하게 하는 함수class Parent {
// static func: 재정의 불가능
static func staticMethod() {
print("Parent의 static method입니다.")
}
// class func: 재정의 가능
class func classMethod() {
print("Parent의 class method입니다.")
}
}
class Child: Parent {
// 에러 static 메서드는 override 불가
// override static func staticMethod() {
// print("재정의 시도")
// }
// class 메서드는 override 가능
override class func classMethod() {
print("Child에서 재정의된 class method입니다.")
}
}
Child.classMethod()
class 타입에서만 사용 가능, struct, Enum 사용 불가
static에서 재정의가 불가능했지만, class func는 override가 가능, 자식 클래스에서 해당 함수를 재정의가 가능
class는 기본적으로 상속 가능성이 발생하기 때문에 컴파일 시점에 특정 타입에 어떤 타입이 들어올 지 모름. (ex let who: Parent = Child())
class func도 동일. 컴파일 시점에 어떤 함수를 호출할 지 모르기 때문에 런타임 시점에 결정됨.
이로 인해 컴파일 시점에 타입이 정해지는 static func에 비해 약간의 오버헤드 발생 가능
final 키워드는 해당 타입이 override 될 수 없음을 알리는 역할class Type {
class func method() {
...
}
}
class ChlidType: Type {
final class func method() {
...
}
}
이 경우는 정적 디스패치로 변환해서 호출
Type.method()
이 경우는 타입을 감췄기에 동적 디스패치 그대로
func exMethod(testClass: Type.Type) {
testClass.method()
}
상속이 불가능하고, 타입을 통해 호출이 가능하다는 점에서 static func와 동일하게 동작
final 키워드를 사용함으로써 컴파일러가 정적 디스패치로 변환하여 컴파일
vTable을 안 뒤져도 되네? 라고 판단함.
물론 값을 받을 때 타입을 감춰서 호출하면 vTable에 접근해야 함.
참고
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/methods/#Type-Methods
https://www.swift.org/blog/whole-module-optimizations/