프로그래밍모바일 개발자

스위프트에서 static 및 class 메소드란 무엇입니까? 둘의 차이는 무엇이며, static을 어디에 사용하고 class를 어디에 사용해야 하며, 이들을 사용할 때 어떤 오류가 발생할 수 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

C 계열 프로그래밍 언어(예: Objective-C)에서는 항상 "클래스 메소드"(class methods)가 존재했습니다. 스위프트에는 타입에 대한 두 가지 종류의 메소드인 static과 class가 있습니다. 이들은 인스턴스가 아닌 고유 타입에서 메소드를 호출할 수 있게 합니다. static은 구조체, 열거형 및 재정의가 불가능한 클래스에서 사용되며, class는 자식 클래스에서 재정의할 수 있는 클래스에 사용됩니다.

문제: static과 class 간의 혼동은 상속이 가능한 클래스 계층에서 발생하며, 메소드/속성을 자식 클래스에서 재정의 허용 또는 금지를 원하는 경우입니다.

해결책:

  • static func — 재정의할 수 없는 타입과 연결된 함수를 정의할 수 있도록 합니다(최종).
  • class func — 자식 클래스에서 재정의할 수 있습니다.

코드 예시:

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

주요 특징:

  • static은 override를 금지하고, class는 허용합니다.
  • static은 구조체, 열거형 및 변경 불가능한 클래스에서 유틸리티 메소드로 사용하기 편리합니다.
  • class는 재정의를 지원하기 위해 오직 클래스에만 적용됩니다.

함정 질문.

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 메소드는 항상 타입과 관련이 있으며 구체적인 객체와는 관계가 없기 때문에 기본 타입의 동작이나 재정의를 호출합니다.

일반적인 오류 및 안티 패턴

  • 자식 클래스에서 static 메소드를 재정의하려고 하면 컴파일 오류가 발생합니다.
  • 재정의가 의도되지 않은 곳에서 class func을 사용하는 것(예: 수학 유틸리티).
  • struct/enum에 class func을 적용하는 것 — 컴파일 오류.

실생활 예시

부정적 사례

재정의가 예상되지 않음에도 statics 유틸리티가 있는 클래스에서 class func을 사용하는 것.

장점:

  • 이후 요구사항 변경 시 시그니처의 유연성.

단점:

  • 자식 클래스에서 제어할 수 없는 재정의 가능성이 있어 애플리케이션의 잘못된 동작을 초래할 수 있습니다.

긍정적 사례

상수 및 유틸리티에 static을 사용하고, 실제로 자식 클래스에서 변경할 수 있는 factory 메소드에 class를 사용하는 것.

장점:

  • 상속 계약 및 허용된 작업의 명확한 구분.
  • static 메소드에 대한 최적 성능.

단점:

  • 큰 계층에서는 static과 class가 어디에 적용되었는지 추적하기 어려워 API 설계 시 주의가 필요합니다.