Swift: class func

틀틀보·2025년 11월 23일

Swift

목록 보기
16/19

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

class func

static 키워드를 사용한 것과 동일하게 전역에서 클래스 타입에 바로 사용할 수 있는 키워드

class Parent {
    class func classMethod() {
        print("Parent의 class method입니다.")
    }
}

class Child: Parent {
    override class func classMethod() {
        print("Child에서 재정의된 class method입니다.")
    }
}

Child.classMethod()
  • static 키워드를 사용한 메서드와 동일하게 해당 타입을 직접 접근해 메서드 호출을 가능하게 하는 함수

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 funcoverride가 가능, 자식 클래스에서 해당 함수를 재정의가 가능

성능적인 부분

기본적으로 class는 동적 디스패치에 의해 동작한다.

  • class는 기본적으로 상속 가능성이 발생하기 때문에 컴파일 시점에 특정 타입에 어떤 타입이 들어올 지 모름. (ex let who: Parent = Child())

  • class func도 동일. 컴파일 시점에 어떤 함수를 호출할 지 모르기 때문에 런타임 시점에 결정됨.

  • 이로 인해 컴파일 시점에 타입이 정해지는 static func에 비해 약간의 오버헤드 발생 가능

그럼 final 키워드를 쓰면?

  • 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/

https://developer.apple.com/videos/play/wwdc2016/416/

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/inheritance/#Preventing-Overrides

profile
안녕하세요! iOS 개발자입니다!

0개의 댓글