본문 바로가기

TIL

Access Control 접근제어

캡슐화와 은닉화 → 불필요한 접근으로 의도치 않은 결과를 초래 하거나 꼭 필요한 부분만 제공해야하는데 전체 코드가 노출될 가능성이 있을 때 접근제어를 이용

모듈

  • 배포할 코드의 묶음 단위
  • → 현재 프로젝트 하나 단위
  • 하나의 프레임워크(Framework)나 라이브러리(Library) 또는 애플리케이션(Application)
  • import로 부른다

  • open : 클래스를 개방 접근수준으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모클래스로 사용 하겠다는 목적으로 클래스를 설계하고 코드를 작성했음을 의미합니다.→ 클래스를 상속받거나 재정의 할 수 없도록 막고싶다면 public 로 정의
  • → 라이브러리 사용자(프로그래머)가 상속받아 사용하면 좋겠다거나 상속 후 재정의하여 사용하면 좋겠다는 생각을 한다면 open 으로 정의
open class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding {
       open var length: Int { get }
       open func character(at index: Int) -> unichar
       public init()
       public init?(coder aDecoder: NSCoder)
}
  • public : 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 쓰입니다
// A value type whose instances are either 'true' or 'false'.
public struct Bool {
       // Default-initialize Boolean value to 'false'.
       public init()
}
  • internal이 기본값!! → 내부 접근수준
  • fileprivate : .swift 단위/ 기존 private을 붙여서 접근 불가능했던 것이 파일단위내에선 접근 가능해짐
  • private
    • 기능을 정의하고 구현한 범위 내에서만 사용.
    • 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용할 수 없다.
    • 그러나 자신을 확장하는 익스텐션(extension) 코드가 같은 파일에 존재하는 경우에는 접근할 수 있습니다.
    public struct SomeType {
           private var privateVariable = 0
           fileprivate var fileprivateVariable = 0
    }
    // 같은 타입의 익스텐션에서는 private 요소에 접근 가능
    extension SomeType {
        public func publicMethod() {
            print("\\(self.privateVariable), \\(self.fileprivateVariable)")
        }
        private func privateMethod() {
            print("\\(self.privateVariable), \\(self.fileprivateVariable)")
        }
        fileprivate func fileprivateMethod() {
            print("\\(self.privateVariable), \\(self.fileprivateVariable)")
        }
    }
    

→ ‘상위 요소보다 하위 요소가 더 높은 접근수준을 가 질 수 없다

privat(set)

  • 설정자(Setter)만 더 낮은 접근수준을 갖도록 제한할 수 있습니다. 요소의 접근수준 키워드 뒤에 {접근수준}(set)처럼 표현하면 설정자의 접근수준만 더 낮도록 지정해줄 수 있습니다.
  • 프로퍼티, 서브스크립트, 변수 등에 적용
public struct SomeType {
    // 비공개 접근수준 저장 프로퍼티 count
    private var count: Int = 0
    // 공개 접근수준 저장 프로퍼티 publicStoredProperty
    public var publicStoredProperty: Int = 0
    // 공개 접근수준 저장 프로퍼티 publicGetOnlyStoredProperty
    // 설정자는 비공개 접근수준 -> 수정은 타입 안에서, 접근은 모듈외부에서도 가능
    public private(set) var publicGetOnlyStoredProperty: Int = 0
    // 내부 접근수준 연산 프로퍼티 internalComputedProperty
    internal var internalComputedProperty: Int {
        get {
            return count
        }
        set {
            count += 1
        }
    }
    // 내부 접근수준 저장 프로퍼티 internalGetOnlyComputedProperty
    // 설정자는 비공개 접근수준 -> 수정은 타입 안에서만, 밖에서도 접근 가능
    internal private(set) var internalGetOnlyComputedProperty: Int {
        get {
            return count
        }
        set {
            count += 1
        }
    }
}
728x90

'TIL' 카테고리의 다른 글

UIApplicationDelegate / UISceneDelegate  (0) 2023.11.24
View 갈아끼우기  (0) 2023.11.23
MVC  (0) 2023.11.10
Architecture Pattern  (0) 2023.11.10
Optional  (0) 2023.11.07