본문 바로가기

iOS (스파르타)/Swift 문법

문법 심화 - 접근제한자

03. 접근제한자

코드 요소에 대한 외부 접근을 제한하여 모듈 간의 접근성과 보안을 조절하는 접근 제한자에 대해 학습

 

1) 접근 제한자      // playground상에서 완벽하게 하기는 힘들다..

  • 접근 제한자는 다른 소스 파일이나 모듈의 코드에서 코드 일부에 대한 접근을 제한
  • [제약이 적음] open < public < internal < fileprivate < private [제약이 많음]
    • open : 모든 소스 파일에서 해당 level 접근 가능 + 모든 곳에서 서브클래싱 가능(모든곳에서 상속 가능)
    • public : 모든 소스 파일에서 해당 level 접근 가능 + 같은 모듈 내에서만 서브클래싱 가능(같은 모듈 내에서만 상속 가능)
    • internal : 같은 모듈 내에서만 접근 가능 // 디폴트로 인터널 수준 적용 타이핑할일이 없다
    • fileprivate : 같은 소스파일 내에서만 접근 가능
    • private : 클래스 내부에서만 접근 가능
  • 접근 제한자를 작성하지 않으면  internal로 판단합니다
  • 상위 요소보다 하위 요소가 더 높은 접근 수준을 가질 수 없습니다.

 

  • 모듈과 소스파일
    • 모듈(module)
      • 배포할 코드의 묶음 단위입니다.
      • 하나의 프레임워크/ 라이브러리/ 어플리케이션이 모듈 단위가 될 수 있습니다.
      • import 키워드를 통해 불러올 수 있습니다.
    • 소스파일   (각각의 파일들)
      • 하나의 swift 소스 코드 파일을 의미합니다.
  • public, open
    • 둘 다 모듈 외부까지 접근할 수 있습니다.
    • open은 클래스와 클래스 맴버에서만 사용할 수 있고 다른 모듈에서 서브클래싱이 가능하지만 public은 그렇지 않습니다.
    • open으로 클래스를 개방 접근 수준으로 명시하는 것은 그 클래스를 다른 모듈에서도 수퍼클래스로 사용하겠다는 의미로 해당 클래스를 설계하고 만들었다는 것을 의미합니다(다른 모듈에서 상속을 허용함)
    • public은 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 사용합니다.
  • internal
    • 모든 요소에 암묵적으로 지정하는 디폴트 접근 제어자입니다.
    • 소스 파일이 속해있는 모듈 어디에든 접근할 수 있지만 외부 모듈에서는 접근할 수 없습니다.
  • fileprivate
    • 소스 파일 내부에서만 접근할 수 있습니다.
    • 서로 다른 클래스가 같은 하나의 소스 파일에 정의되어있고 fileprivate로 선언되어 있다면 두 클래스는 서로 접근할 수 있습니다.
  • private
    • 가장 제한적인 접근제어자입니다.
    • fileprivate과 달리 같은 파일 안에 있어도 서로 다른 클래스이고 private로 선언되어 있다면 두 요소는 서로 접근할 수 없습니다. // 클래스 뿐만 아니라 struct, enum 모두