Static 및 class 속성은 인스턴스가 아닌 유형에 속하는 속성입니다. 역사적으로 이들은 모든 인스턴스에 공통적인 정보를 저장하는 문제를 해결하기 위해 등장했습니다(예: 카운터, 구성을 위한 팩토리 등). 스위프트에서는 static을 모든 유형(class, struct, enum)에서 사용할 수 있지만, class는 클래스에서만 사용할 수 있으며 오직 계산된 속성에 대해서만 재정의할 수 있는 기능을 제공합니다.
문제: 잘못된 static 속성 사용은 경쟁 상태 및 여러 스레드에서 액세스할 때 오류를 초래할 수 있습니다. 또한 static과 class를 혼동하여 상속에서 재정의 메커니즘을 잘못 선택하기 쉽습니다.
해결책:
코드 예시:
class Counter { static var count = 0 static let queue = DispatchQueue(label: "counter.queue") static func increment() { queue.sync { count += 1 } } class var typeDescription: String { return "Generic Counter" } } class NamedCounter: Counter { override class var typeDescription: String { return "Named Counter" } }
주요 기능들:
질문 1: static let 속성을 get으로 계산된 속성(computed property)으로 선언할 수 있습니까?
네, static 속성은 stored 또는 computed일 수 있습니다. let 속성의 경우 일반적으로 상수지만, static var는 충분히 계산된 속성이 될 수 있습니다:
struct Math { static var pi: Double { return 3.1415926 } }
질문 2: static var는 기본적으로 스레드 안전합니까?
아니요, static var가 여러 스레드에서 변경되면 경쟁 상태가 발생할 수 있습니다. 읽기/쓰기 작업은 수동으로 동기화되어야 합니다.
질문 3: class var를 stored 속성으로 사용할 수 있습니까?
아니요, class var는 항상 계산된 속성(get/optional set이 있는 속성)이어야 하며, stored 속성은 static에만 허용됩니다.
애플리케이션에서 사용자의 로그인 카운터가 static var에 저장되었고, 여러 스레드에서 동기화 없이 증가되었습니다.
장점:
단점:
전역 구성 객체에는 static let을 사용하였고, 접근은 읽기 전용 또는 기록을 위한 DispatchQueue 사용으로 제한되었습니다.
장점:
단점: