접근제어란?
- 객체지향 프로그래밍 패러다임에서 은닉화를 구현하기 위한 핵심 기능
- 코드끼리 상호작용을 할 때, 파일 간, 모듈 간에 접근을 제한할 수 있는 기능.
- 코드의 상세 구현은 숨기고, 허용된 기능만 사용하는 인터페이스를 제공할 수 있도록 하는 기능
모듈과 소스 파일
- 스위프트 접근제어는 모듈과 소스파일을 기반으로 설계
- 모듈 : 배포할 코드의 묶음 단위, 통상 하나의 프레임워크, 라이브러리, 애플리케이션 단위를 의미, import를 사용해 불러온다.
- 소스파일 : 스위프트 소스 코드 파일. 보통 하나의 타입을 파일 하나에 정의하지만 여러 개를 정의할 수도 있다.
접근수준
- 접근제어는 접근수준 키워드를 통해 구현
- 타입, 타입의 프로퍼티, 메서드, 이니셜라이저, 서브스크립트 각각에도 지정 가능
- open, public, internal, fileprivarte, private 5가지
- 높은 접근수준 ———————————낮은 접근 수준
- public, 공개 접근수준
- 어디서든 접근 가능
- 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 사용
- 스위프트의 기본 요소는 모두 공개 접근 수준
- open, 개방 접근수준
- 공개 접근수준이지만 다음과 같은 차이가 있음
- 클래스와 클래스 멤버에서만 사용 가능
- open ✅
→ class : 모듈 밖의 다른 모듈에서도 상속 가능
→ member : 모듈 밖의 다른 모듈에서도 재정의 가능
- open ⛔️ , open을 제외한 나머지 접근수준의 클래스
→ class : 모듈 안에서만 상속
→ member : 모듈 안에서만 재정의
- 따라서 open을 명시하는 것은 다른 모듈에서도 부모 클래스로 사용하겠다는 목적이 분명!
- internal, 내부 접근수준
- 기본적으로 모든 요소에 암묵적으로 지정하는 접근 수준
- 모듈 안에서 어디서든 사용 가능
- fileprivate, 파일외부비공개 접근수준
- 소스파일 내부에서만 사용 가능
- 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용
- private, 비공개 접근수준
- 해당 기능을 정의하고 구현한 범위 내에서만 사용 가능
- 같은 파일 extension은 가능
- 같은 소스 파일도 안된다.
접근제어 구현
- 접근수준을 지정해서 접근제어를 구현, 그냥 각각 요소 앞에 지정해주기만 하면 된다.
- internal은 굳이 안해도 된다.
접근제어 구현 참고사항
-
규칙 : 상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다. 적어도 같아야 한다.
- 비공개 클래스에 공개 프로퍼티를 정의할 수 없다.
- 파라미터나 리턴값이 비공개인데 함수가 공개일 수 없다.
- 튜플 내부 타입이 비공개인데 튜플이 공개일 수 없다.
-
프레임워크를 만들 때는 다른 모듈에서 특정 기능에 접근할 수 있도록 API로 사용할 기능을 공개로, 그외의 요소는 internal이나 비공개로 설정. 적절히 구현하자.
-
열거형은
- case 별로 불가능. 타입 자체에 해야 함
- 원시 값 타입의 접근 수준이 열거형 보다 낮을 수 없다
- 연관 값 타입도 마찬가지
읽기 전용 구현
- 설정자만 낮은 수준으로 제한해서 읽기 전용으로 만들기
- 설정자 접근수준 제한은 해당 요소의 접근 수준보다 같거나 낮게
- (set)으로 표현
internal private(set) var gogo = 1
public internal(set) subscript(some: Int) -> Int {
}