🔥 이니셜라이저의 접근 제어

288자
4분

사용자 정의 이니셜라이저는 초기화하는 타입보다 작거나 같은 접근 수준을 할당받을 수 있어요. 유일한 예외는 필수 이니셜라이저(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

이와 같이 이니셜라이저의 접근 제어는 타입의 캡슐화와 모듈화를 효과적으로 달성하는 데 중요한 역할을 하죠. 적절한 접근 수준을 설정함으로써 이니셜라이저의 가시성을 제한하고, 타입의 내부 구현 세부 사항을 숨길 수 있습니다. 이는 코드의 안정성과 유지 보수성을 높이는 데 도움이 되는 거예요.