[Swift] Access Control

Lena·2020년 11월 24일

Access control은 코드의 일부를 다른 소스파일이나 모듈로부터 제한하는 것이다.
이는 코드의 자세한 구현부를 숨기고 접근 가능한 범위를 구체화한다.

Modules and Source Files

  • 스위프트의 접근 제어는 modules과 sources files의 개념에 기반을 두고 있다.
  • module은 코드의 묶음을 의미
  • frameworkapplication을 module로 볼 수 있다.
  • 이러한 module은 import keyword로 내 소스파일에서 사용할 수 있다.
  • source files은 module 안의 하나의 스위프트 파일을 의미한다.

Access Levels

Open

  • 정의된 모듈 밖에서도 import로 접근 가능하다.
  • 외부에서 subclass와 override가 가능하다.

Public

  • 외부 모듈에서 접근 가능하다.
  • 하지만 외부에서 subclass와 override는 불가능하다.

Internal

  • 따로 선언하지 않으면 기본으로 적용되는 default level
  • 같은 모듈 내에서는 어디서든 접근 가능하고, 상속 가능하다.

File-Private

  • 같은 스위프트 파일 내에서만 접근 가능하다.
  • 스위프트는 같은 파일 내에 class를 여러 개 선언하기도 하는데, fileprivate으로 선언했다면 같은 파일 안에 있으므로 접근 가능하다.

Private

  • private으로 선언된 요소와 같은 블록 안에서만 접근 가능하다.

Open access applies only to classes and class members, and it differs from public access by allowing code outside the module to subclass and override

open은 class와 class 멤버에만 사용할 수 있고, 선언된 모듈 외부에서 subclass와 override가 가능하다는 점이 public과의 차이점이다.

Principle of Access Levels

  • 바깥 요소의 접근 제어 수준보다 높은 수준의 내부 요소는 있을 수 없다.
  • 특정 접근제어 수준의 타입이 함수의 매개변수나, 반환되는 타입일 경우 함수는 해당 값의 접근제어보다 높을 수 없다.
// 예제 코드
func someFunction() -> (SomeInternalClass, SomePrivateClass) { // error
    // function implementation goes here
}

// function의 access level은 parameter, return type의 access level 중 가장 제한적인 것으로 결정됨

private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // function implementation goes here
}

References

https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html
https://baked-corn.tistory.com/80

0개의 댓글