🔥 상수, 변수, 속성 및 서브스크립트의 접근 제어

464자
6분

강의 목차

상수, 변수 또는 속성은 그것의 타입보다 더 public할 수 없습니다. 예를 들어, private 타입을 가진 public 속성을 작성하는 것은 유효하지 않아요. 마찬가지로, 서브스크립트는 인덱스 타입이나 반환 타입보다 더 public할 수 없답니다.

만약 상수, 변수, 속성 또는 서브스크립트가 private 타입을 사용한다면, 해당 상수, 변수, 속성 또는 서브스크립트도 private으로 표시되어야 해요.

private var privateInstance = SomePrivateClass()
swift

getter와 setter

상수, 변수, 속성 및 서브스크립트의 getter와 setter는 자동으로 해당 상수, 변수, 속성 또는 서브스크립트와 동일한 접근 수준을 받습니다.

변수, 속성 또는 서브스크립트의 읽기-쓰기 범위를 제한하기 위해 setter에 getter보다 낮은 접근 수준을 줄 수 있어요. var 또는 subscript 도입부 앞에 fileprivate(set), private(set) 또는 internal(set)을 작성하여 낮은 접근 수준을 할당하는 거죠.

아래 예제는 문자열 속성이 수정된 횟수를 추적하는 TrackedString이라는 구조체를 정의합니다.

struct TrackedString {
    private(set) var numberOfEdits = 0 // numberOfEdits 속성은 TrackedString 내부에서만 설정 가능
    var value: String = "" {
        didSet {
            numberOfEdits += 1 // value가 변경될 때마다 numberOfEdits 증가
        }
    }
}
swift

TrackedString 구조체는 value라는 저장 문자열 속성을 정의하며, 초기값은 "" (빈 문자열)입니다. 또한 이 구조체는 value가 수정된 횟수를 추적하는 데 사용되는 numberOfEdits라는 저장 정수 속성도 정의하고 있어요. 이 수정 추적은 value 속성에 대한 didSet 속성 옵저버로 구현되며, value 속성이 새로운 값으로 설정될 때마다 numberOfEdits를 증가시킵니다.

TrackedString 구조체와 value 속성은 명시적인 접근 수준 수정자를 제공하지 않으므로, 둘 다 기본 접근 수준인 internal을 받아요. 하지만 numberOfEdits 속성의 접근 수준은 private(set) 수정자로 표시되어 있는데, 이는 속성의 getter는 여전히 기본 접근 수준인 internal을 가지지만, 속성은 TrackedString 구조체의 일부인 코드 내에서만 설정할 수 있음을 나타내죠. 이를 통해 TrackedString은 내부적으로 numberOfEdits 속성을 수정할 수 있지만, 구조체 정의 외부에서 사용될 때는 읽기 전용 속성으로 제공할 수 있습니다.

TrackedString 인스턴스를 생성하고 문자열 값을 여러 번 수정하면, 수정 횟수와 일치하도록 numberOfEdits 속성 값이 업데이트되는 것을 볼 수 있어요.

var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
print("The number of edits is \(stringToEdit.numberOfEdits)")
// "The number of edits is 3"이 출력됩니다.
swift

다른 소스 파일 내에서 numberOfEdits 속성의 현재 값을 쿼리할 수는 있지만, 다른 소스 파일에서 속성을 수정할 수는 없습니다. 이 제한은 편리한 기능 접근을 여전히 제공하면서도 TrackedString의 편집 추적 기능의 구현 세부 사항을 보호하죠.

필요한 경우 getter와 setter 모두에 명시적 접근 수준을 할당할 수 있다는 점에 유의하세요. 아래 예제는 구조체가 public 접근 수준으로 명시적으로 정의된 TrackedString 구조체의 버전을 보여줍니다. 따라서 구조체의 멤버(numberOfEdits 속성 포함)는 기본적으로 internal 접근 수준을 가져요. publicprivate(set) 접근 수준 수정자를 조합하여 구조체의 numberOfEdits 속성 getter를 public으로, 속성 setter를 private으로 만들 수 있습니다.

public struct TrackedString {
    public private(set) var numberOfEdits = 0
    public var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
    public init() {}
}
swift

이렇게 하면 TrackedString 구조체를 사용하는 다른 모듈에서도 numberOfEdits 속성의 값을 읽을 수 있게 되지만, 값을 수정하는 것은 여전히 TrackedString 구조체 내부로 제한됩니다.