C 계열 프로그래밍 언어(예: Objective-C)에서는 항상 "클래스 메소드"(class methods)가 존재했습니다. 스위프트에는 타입에 대한 두 가지 종류의 메소드인 static과 class가 있습니다. 이들은 인스턴스가 아닌 고유 타입에서 메소드를 호출할 수 있게 합니다. static은 구조체, 열거형 및 재정의가 불가능한 클래스에서 사용되며, class는 자식 클래스에서 재정의할 수 있는 클래스에 사용됩니다.
문제: static과 class 간의 혼동은 상속이 가능한 클래스 계층에서 발생하며, 메소드/속성을 자식 클래스에서 재정의 허용 또는 금지를 원하는 경우입니다.
해결책:
코드 예시:
class Animal { class func makeSound() { print("Some generic animal sound") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Woof!") } // override static func kingdom() — 오류: static은 재정의할 수 없습니다! } Animal.makeSound() // Some generic animal sound Dog.makeSound() // Woof! print(Animal.kingdom()) // Animalia
주요 특징:
struct나 enum에서 class func을 사용할 수 있나요?
아니요, class func은 클래스에만 허용됩니다. struct와 enum은 오직 static 메소드와 속성만 지원합니다.
static 프로퍼티는 computed 또는 mutable(var)일 수 있나요?
네, static 프로퍼티는 computed 및 stored가 될 수 있으며, static var를 통해 정의될 수 있습니다. struct와 enum에서 프로퍼티를 고유 타입을 통해 접근하도록 만드는 유일한 방법입니다.
코드 예시:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
클래스의 인스턴스를 통해 class 메소드를 호출할 수 있나요?
네, 가능하지만 권장되지 않습니다: class 메소드는 항상 타입과 관련이 있으며 구체적인 객체와는 관계가 없기 때문에 기본 타입의 동작이나 재정의를 호출합니다.
재정의가 예상되지 않음에도 statics 유틸리티가 있는 클래스에서 class func을 사용하는 것.
장점:
단점:
상수 및 유틸리티에 static을 사용하고, 실제로 자식 클래스에서 변경할 수 있는 factory 메소드에 class를 사용하는 것.
장점:
단점: