12.1 접근제어란
- 객체지향 프로그래밍 패러다임에서 은닉화는 중요한 개념 중 하나. 접근 제어는 은닉화를 구현하기 위한 핵심 기능
- 접근제어란 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능
- 스위프트의 접근제어는 모듈과 소스파일을 기반으로 설계됨.
- 모듈(Module)은 배포할 코드의 묶음 단위. 통상 하나의 프레임워크(Framework)나 라이브러리(Library) 또는 애플리케이션(Application)이 모듈 단위가 될 수 있음. import 키워드를 사용해 불러옴
- 소스파일은 하나의 스위프트 소스 코드파일을 의미
12.2 접근수준
- 접근제어는 접근수준(Access Level) 키워드를 통해 구현할 수 있음
- 접근수준 키워드: open, public, internal, fileprivate, private
접근도 / open <———–> 접근도 낮음 / private
12.4 접근제어 구현 참고사항
- 상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다
12.5 private과 fileprivate
- fileprivate 접근수준으로 지정한 요소는 같은 파일 어떤 코드에서도 접근할 수 있음
- 반편 private 접근수준으로 지정한 요소는 같은 파일 내부에 다른 타입의 코드에서는 접근 불가능. 하지만 자신을 확장하는 익스텐션(extension) 코드가 같은 파일에 존재하는 경우에는 접근할 수 있음
public struct SomeType { private var privateVar = 0 fileprivate var fileprivateVar = 0 } // 같은 타입의 익스텐션에서는 Private 요소에 접근 가능 extension SomeType { public func publicMethod() { print("\(self.privateVar), \(self.fileprivateVar)") } private func privateMethod() { print("\(self.privateVar), \(self.fileprivateVar)") } fileprivate func fileprivateMethod() { print("\(self.privateVar), \(self.fileprivateVar)") } } struct AnotherType { var someInstance: SomeType = SomeType() mutating func someMethod() { // public 접근수준에너느 어디서든 접근 가능 self.someInstance.publicMethod() // 같은 파일에 속해 있는 코드이므로 Fileprivate 접근수준 요소에 접근 가능 self.someInstance.fileprivateVar = 100 self.someInstance.fileprivateMethod() // 오류! 다른 타입 내부의 코드이므로 private 요소에 접근 불가 self.someInstance.privateVar = 100 self.someInstance.privateMethod() } } var anotherInstance = AnotherType() anotherInstance.someMethod()