본문으로 건너뛰기

접근 제어

접근 제어access control는 외부 코드에 대한 접근성과 가시성visibility을 제한한다. 접근 제어는 상세 구현을 숨기고 외부 코드가 접근했으면 하는 인터페이스만 노출시킨다. 클래스와 구조체 모두에 구체적인 접근 단계access level를 부여할 수 있다. 또한 클래스와 구조체에 속해있는 프로퍼티와 메서드, 그리고 생성자도 가능하다.

스위프트에는 다섯 가지의 접근 단계가 존재한다.

  • Open : open은 가장 열려있는 접근 단계다. 모듈을 임포트하고자 하는 어느 곳에서는 프로퍼티나 메서드, 클래스 등을 사용할 수 있게 한다. open으로 표시된 아이템은 해당 아이템이 정의된 모듈 내에 있는 모든 아이템에서 서브클래싱이나 오버라이딩을 할 수 있으며, 해당 아이템이 정의된 모듈을 임포트한 모듈에서도 이를 서브클래싱하거나 오버라이딩할 수 있다. 주로 프레임워크에서 프레임워크의 공개 API를 노출시키기 위해 사용한다.
  • Public : public은 모듈을 임포트하고자 하는 어느 곳에서나 프로퍼티나 메서드, 클래스 등을 사용할 수 있게 해준다. 접근 제어를 public으로 하는 아이템은 누구나 사용할 수 있으며, 해당 아이템이 정의된 모듈 내에 있는 모든 아이템에서 서브클래싱하거나 오버라이딩할 수 있다. 주로 프레임워크에서 프레임워크의 공개 API를 노출하기 위해 사용한다.
  • Internal : internal은 기본이 되는 접근 단계다. 아이템이 정의된 모듈 내부에서 프로퍼티와 메서드, 클래스 등을 사용할 수 있게 해준다. 프레임워크 외부 코드에서는 아이템에 접근할 수 없다.
  • Fileprivate : fileprivate 접근 제어는 아이템이 정의되어 있는 소스 파일과 동일한 코드 내부에서만 프로퍼티와 메서드 접근을 허용한다.
  • Private : private은 가장 제한된 접근 단계로 정의한 소스 파일 내부에서만 프로퍼티와 메서드, 클래스를 사용할 수 있다.

클래스의 메서드를 예를 들어 FileprivatePrivate 을 비교해보자. fileprivate은 같은 파일에 선언된 클래스의 메서드를 클래스 밖에서 접근할 수 있다. private은 같은 파일에 선언된 클래스의 메서드일 지라도 클래스 밖에서 접근할 수 없다.

fileprivate과 private 접근 단계 비교

스위프트에서 접근 단계가 어떠한 엔티티보다 더 낮은 접근 단계를 갖게 다른 엔티티에 정의될 수 없다. 엔티티가 더 낮은 접근 단계를 가진 다른 엔티티에 의존하려고 할 때 해당 엔티티에 더 높은 접근 단계를 할당할 수 없음을 의미한다.

이와 관련된 규칙은 다음과 같다.

  • 인자 중 어느 한 가지나 반환 타입의 접근 단계가 private 인 경우 외부 코드가 private 타입에 접근할 수 없기 때문에 해당 메서드를 public 으로 설정할 수 없다.
  • 클래스나 구조체의 접근 단계를 private 으로 설정한 경우 메서드나 프로퍼티의 접근 단계를 public 으로 설정할 수 없다. 이는 클래스가 private 인 경우 외부 코드에서 생성자에 접근할 수 없기 때문이다.