본문 바로가기
공부/[iOS&Swift]

[Swift] 접근제어(Access Control)에 대하여

by 인생은아름다워 2022. 1. 13.

✏️ 접근제어(Access Control에 대하여)

접근제어 왜필요하지?

객체지향 프로그래밍 패러다임에서 몇 가지 중요한 개념이있는데 그 중 하나가 은닉화이다. 이 은닉화를 구현하기 위해 접근제어가 핵심이라고 한다.

캡슐화, 은닉화에 대해서 꼭 한번 공부 및 생각정리가 필요하다고 생각됨!

 

기본적으로 내 코드(내가 만든 타입, 프로퍼티, 메써드 등)에 접근할 수 있는 접근 수준을 할당함으로써, 그리고 프로토콜의 경우 전역 상수, 변수, 함수와 마찬가지로 특정한 컨텍스트(Context)로 제한함으로서, 은닉화를 구현할 수 있는것 같다. 자세한 내용을 좀 더 들여다보자.

  • 여기서 context라는 표현은 모나드? 뭐 그쪽 Chapter 지나가면서 슬쩍 보였던 것 같은데, 아직 나는 모르는개념이기에(프로토콜도 사실 모르는개념) 일단 메모만 해 두도록 하자.

접근제어를 통해서 내 코드를 외부에 공개하지 않을 수도 있다고 하는데, 사실 이 부분은 어떤 의미인지 잘 모르겠다.

 

✏️ Access Level(접근 수준)

공식문서에서는 문서의 간결화를 위하여 types, properties, functions등을 엔티티(entity)라고 표현한다.

Swift에는 5개의 접근수준을 제공한다. 각각의 entity에 접근수준을 지정할 수 있다. 5개의 접근수준은 open, public, internal, fileprivate, private이다.

기본적으로 이러한 접근수준은 소스파일과(.swift) 모듈(import로 불러오는 단위 - 배포하는 코드의 단위)에 따라 구분한다.

open(개방) access가 가장 높고, private(비공개) accss가 가장 낮은 접근수준이다. 정확하게 위에서 언급한 순으로 접근수준이 높은 것 -> 낮은 것 으로 볼 수 있다.

  • open level과 public level의 차이점 open과 public 모두 정의된 소스파일과 모듈 외부에서 사용할 수 있지만.open은 class 그리고 class member에서만 사용 가능하며, 서브클래싱, 오버라이딩 등의 기능을 외부 모듈에서 사용하고자할 때는 open level에서만 가능하다!

단순히 사용하는 것과, 상속, 재정의 등을 하는것은 분명 다르니까!

그리고 공식문서에는 이런 말이 있다.You typically use open or public access when specifying the public interface to a framework.

이런식으로 우리가 자주 접하는 스위프트의 기본 요소들은 public으로 지정되어있는 것 같다. 그래서 우리가 가져다 쓸 수 있는 것이지...(import Foundation만 해준다면?)

  • internal access level 정의된 모듈 내의 어떤 소스파일에서도 접근할 수 있는 접근수준이다! 그러니까, 내가 만들어서 배포하는 모듈의 밖에서 접근할일이 없을 것 같은 entity를 만든다면 이 접근 수준을 사용하면 될 듯!
  • file private access level 구현된 소스파일에서만 접근, 사용이 가능한 접근 수준이다. 즉, 외부 소스파일에서 변경하거나 접근하면 좋지 않을 때 사용하는 접근 수준!
  • pravate access level 오로지 구현한 entity내부에서만 사용 가능한 접근 수준이다. 다만, 같은 소스파일 내에 있는 extension에서는 접근이 가능하다!

✏️ Guiding Principle of Access level (접근 수준 기본 원칙)

상위 요소보다 하위 요소보다 더 높은 접근 수준을 가질 수 없다! 는 것이 기본 원칙이다. 예를 들자면 아래와 같다.

private struct Person {
    public var name: String
    var age: UInt
    ...
}

 

✏️ Default Access level(기본 접근 수준)

내가 만드는 모든 entity는 기본 접근 수준을 가지고있으며, 직접 키워드로 표현해주지 않아도 된다. 기본 접근 수준은 internal이다!

🤔 그동안 몇 개의 소스파일(.swift)로 나눠작업을 하고, 어떠한 접근 수준을 지정해주지 않았는데도 정상적으로 잘 작동했던 이유이다!

 

🍎 결론

이 외에도 생각해 볼 접근제어관련 내용들이 많이 있다.

  • 튜플, 함수, 열거형 등의 접근 수준
  • 접근제어를 통해 read-only구현

이외에도 또 있겠지?

하지만 우선 이정도로 접근제어를 공부해보고 추후에 궁금할때 공식문서를 더 읽어보기로 한다. 우선은 그동안은 왜 public, private 등의 키워드가 붙는지 이해하지 못했었는데 그정도 감은 생긴 것 같다.

참고했던 글

Swift-LanguageGuide/Access Control

댓글