🔥 상수, 변수, 속성 및 서브스크립트의 접근 제어
강의 목차
상수, 변수 또는 속성은 그것의 타입보다 더 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 접근 수준을 가져요. public
과 private(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
구조체 내부로 제한됩니다.