Swift: Access Level / 접근 수준

Wooyo·2023년 10월 24일
0
post-thumbnail

1. 접근수준

  • 키워드를 통해 구현
  • 각 타입에 특정 접근수준을 지정 가능
  • 타입 내부의 프로퍼티 / 메서드 / 이니셜라이져 / 서브스크립트 각각에도 접근 수준 지정 가능
  • 스위프트에서는 모듈과 소스파일에 따라 구분 가능
  • 상위 요소보다 하위 요소가 더 높은 접근 수준을 가질 수 없다.
private class AClass {
    // 공개 접근수준을 부여해도 AClass의 접근수준이 비공개 접근수준
    // 이 메서드의 접근수준도 비공개 접근수준으로 취급
    public func someMethod() {
        // ...
    }
}
// AClass의 접근수준이 비공개 접근수준
// 공개 접근수준 함수의 매개변수나 반환 값 타입으로 사용 불가
public func someFunction(a: AClass) -> AClass {
    // 오류 발생!
    return a
}

2. 공개 접근수준 - public

  • 모듈 외부 까지 접근 가능
  • 어디서든 쓰일 수 있음
  • 주로 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 사용
  • 스위프트의 기본 요소는 모두 공개 접근수준
  • 스위프트 표준 라이브러이 Bool type의 예
/// A value type whose instances are either 'true' or 'false'.
public struct Bool {
       /// Default-initialize Boolean value to 'false'.
       public init()
}

3. 개방 접근수준 - open

  • public 접근수준 이상으로 높은 접근 수준
  • 클래스와 클래스의 멤버에서만 사용가능
  • publc 과의 차이
    - open을 제외한 다른 모든 접근 수준의 클래스는 클래스가 정의된 모듈 안에서만 상속이 가능
    - open을 제외한 다른 모든 접근 수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 재정의 가능
    - open의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속가능
    - open의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 모듈에서도 override 가능
    - 클래스를 open으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모클래스로 사용 하겠다는 목적으로 클래스를 설계하고 코드를 작성했음을 의미
  • Foundation 프레임워크에 정의되어 있는 개방접근 수준의 NSString 클래스
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)
}
  • 라이브러리 / 프레임워크 설계시 프로그래머가 이 타입을 사용할 수 있도록 하려면 open / public
  • 이 경우 프로그래머가 상속받아 사용하면 좋겠다거나 상속 후 재정의하여 사용하면 좋겠다 -> open
  • 그렇지 않고 클래스를 상속받거나 재정의 할 수 없도록 막고 싶다면 -> public
  • 두 경우가 아닌 접근수준의 클래스 및 타입은 모듈 외부에서 접근할 수 없음으로 라이브러리 및 프레임워크를 사용하는 사용자가 사용할 수 없다.

4. 내부 접근수준 - internal

  • internal은 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준
  • internal로 지정된 요소는 모듈 어디에서든 쓰일 수 있음
  • 모듈을 가져다 사용하는 외부 모듈에서는 접근 불가
  • 외부에서 사용할 클래스 / 구조체가 아니며 모듈 내부 광역적 사용할 경우 internal 지정

5. 파일외부비공개 접근수준 - fileprivate

  • fileprivate 으로 지정된 요소는 그 소스파일 내부에서만 사용 가능
  • 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우 사용

6. 비공개 접근수준 - private

  • private은 가장 한정적인 범위
  • 기능을 구현하고 정의한 범위 내에서만 사용
  • 같은 소스파일 안의 기능 / 타입에도 사용 불가
profile
Wooyo의 개발 블로그

0개의 댓글