접근 제어
접근 제어access control는 외부 코드에 대한 접근성과 가시성visibility을 제한한다. 접근 제어는 상세 구현을 숨기고 외부 코드가 접근했으면 하는 인터페이스만 노출시킨다. 클래스와 구조체 모두에 구체적인 접근 단계access level를 부여할 수 있다. 또한 클래스와 구조체에 속해있는 프로퍼티와 메서드, 그리고 생성자도 가능하다.
스위프트에는 다섯 가지의 접근 단계가 존재한다.
Open: open은 가장 열려있는 접근 단계다. 모듈을 임포트하고자 하는 어느 곳에서는 프로퍼티나 메서드, 클래스 등을 사용할 수 있게 한다. open으로 표시된 아이템은 해당 아이템이 정의된 모듈 내에 있는 모든 아이템에서 서브클래싱이나 오버라이딩을 할 수 있으며, 해당 아이템이 정의된 모듈을 임포트한 모듈에서도 이를 서브클래싱하거나 오버라이딩할 수 있다. 주로 프레임워크에서 프레임워크의 공개 API를 노출시키기 위해 사용한다.Public: public은 모듈을 임포트하고자 하는 어느 곳에서나 프로퍼티나 메서드, 클래스 등을 사용할 수 있게 해준다. 접근 제어를 public으로 하는 아이템은 누구나 사용할 수 있으며, 해당 아이템이 정의된 모듈 내에 있는 모든 아이템에서 서브클래싱하거나 오버라이딩할 수 있다. 주로 프레임워크에서 프레임워크의 공개 API를 노출하기 위해 사용한다.Internal: internal은 기본이 되는 접근 단계다. 아이템이 정의된 모듈 내부에서 프로퍼티와 메서드, 클래스 등을 사용할 수 있게 해준다. 프레임워크 외부 코드에서는 아이템에 접근할 수 없다.Fileprivate: fileprivate 접근 제어는 아이템이 정의되어 있는 소스 파일과 동일한 코드 내부에서만 프로퍼티와 메서드 접근을 허용한다.Private: private은 가장 제한된 접근 단계로 정의한 소스 파일 내부에서만 프로퍼티와 메서드, 클래스를 사용할 수 있다.
클래스의 메서드를 예를 들어
Fileprivate과Private을 비교해보자. fileprivate은 같은 파일에 선언된 클래스의 메서드를 클래스 밖에서 접근할 수 있다. private은 같은 파일에 선언된 클래스의 메서드일 지라도 클래스 밖에서 접근할 수 없다.
스위프트에서 접근 단계가 어떠한 엔티티보다 더 낮은 접근 단계를 갖게 다른 엔티티에 정의될 수 없다. 엔티티가 더 낮은 접근 단계를 가진 다른 엔티티에 의존하려고 할 때 해당 엔티티에 더 높은 접근 단계를 할당할 수 없음을 의미한다.
이와 관련된 규칙은 다음과 같다.
- 인자 중 어느 한 가지나 반환 타입의 접근 단계가
private인 경우 외부 코드가private타입에 접근할 수 없기 때문에 해당 메서드를public으로 설정할 수 없다. - 클래스나 구조체의 접근 단계를
private으로 설정한 경우 메서드나 프로퍼티의 접근 단계를public으로 설정할 수 없다. 이는 클래스가private인 경우 외부 코드에서 생성자에 접근할 수 없기 때문이다.