🔥 이니셜라이저의 접근 제어
사용자 정의 이니셜라이저는 초기화하는 타입보다 작거나 같은 접근 수준을 할당받을 수 있어요. 유일한 예외는 필수 이니셜라이저(Required Initializers에 정의된 대로)인데, 필수 이니셜라이저는 그것이 속한 클래스와 동일한 접근 수준을 가져야 한답니다.
함수 및 메서드 매개변수와 마찬가지로, 이니셜라이저의 매개변수 타입은 이니셜라이저 자체의 접근 수준보다 더 private할 수 없죠.
기본 이니셜라이저
Default Initializers에서 설명한 대로, Swift는 모든 속성에 기본값을 제공하고 자체적으로 이니셜라이저를 제공하지 않는 모든 구조체 또는 기본 클래스에 대해 인수 없이 기본 이니셜라이저
를 자동으로 제공해 줍니다.
기본 이니셜라이저는 초기화하는 타입과 동일한 접근 수준을 가지는데, 해당 타입이 public
으로 정의되지 않는 한 그렇습니다. public
으로 정의된 타입의 경우, 기본 이니셜라이저는 internal로 간주되네요. 다른 모듈에서 사용할 때 public 타입을 인수 없는 이니셜라이저로 초기화할 수 있게 하려면, 타입 정의의 일부로 직접 public 인수 없는 이니셜라이저를 명시적으로 제공해야 해요.
public struct SomePublicStruct { public var somePublicProperty = 0 public init() {} // 명시적인 public 이니셜라이저 제공 }
swift
구조체 타입의 기본 멤버별 이니셜라이저
구조체 타입의 기본 멤버별 이니셜라이저는 구조체의 저장 속성 중 하나라도 private인 경우 private으로 간주됩니다. 마찬가지로, 구조체의 저장 속성 중 하나라도 file private이면, 이니셜라이저는 file private이 되겠죠. 그렇지 않으면, 이니셜라이저는 internal 접근 수준을 갖게 됩니다.
위의 기본 이니셜라이저와 마찬가지로, 다른 모듈에서 사용할 때 public 구조체 타입을 멤버별 이니셜라이저로 초기화할 수 있게 하려면, 타입 정의의 일부로 직접 public 멤버별 이니셜라이저를 제공해야 해요.
public struct SomePublicStruct { public var somePublicProperty = 0 public init(somePublicProperty: Int) { self.somePublicProperty = somePublicProperty } }
swift
이렇게 하면 SomePublicStruct
의 인스턴스를 다른 모듈에서도 멤버별 이니셜라이저를 사용하여 생성할 수 있게 됩니다.
let publicStruct = SomePublicStruct(somePublicProperty: 42)
swift
이와 같이 이니셜라이저의 접근 제어는 타입의 캡슐화와 모듈화를 효과적으로 달성하는 데 중요한 역할을 하죠. 적절한 접근 수준을 설정함으로써 이니셜라이저의 가시성을 제한하고, 타입의 내부 구현 세부 사항을 숨길 수 있습니다. 이는 코드의 안정성과 유지 보수성을 높이는 데 도움이 되는 거예요.