콘텐츠로 건너뛰기

[야곰 Swift 프로그래밍] 12 접근제어(Access Control)

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()