본 내용은 스위프트 프로그래밍 3판 (야곰 지음) 교재를 공부한 내용을 바탕으로 작성 하였습니다.
객체지향 언어의 가장 큰 특징은 객체 끼리의 서로 상호작용으로 유연한 코드 작성이 가능 하다는것인데, 코드를 작성하다보면 외부에 노출 되거나 일반적으로 접근 해서는 안되는 코드가 있기 마련이다. 접근 제어
는 이러한 객체의 상호작용에서 접근을 제한 하는 기능을 한다.
접근제어
는 모듈과 소스코드를 기반으로 단위로 동작 하는데 모듈과 소스코드의 정의는 다음과 같다.
모듈: 코드의 묶음 단위로 프레임워크, 라이브러리, 앱(애플리케이션)등을 예로 들 수 있다.
소스코드: 모듈 안에 있는 소스 코드를 의미한다.
접근 제어는 접근 수준
키워드를 이용하여 선언하며 각 타입과 내부 메서드, 이니셜라이저, 서브 스크립트 등에 대한 접근 수준을 지정해 줄 수 있다.
스위프트에서 접근 수준
은 5가지가 존재하며 내용은 다음과 같다.
접근수준 | 키워드 | 접근도 순위 | 범위 | 비고 |
---|---|---|---|---|
개방 접근수준 | open | 1 | 모듈 외부까지 | 클래스와 클래스 멤버에서만 사용가능 |
공개 접근수준 | public | 2 | 모듈 외부까지 | - |
내부 접수준 | Internal | 3 | 모듈 내부 | - |
파일외부비공개 접근수준 | fileprivate | 4 | 파일 내부 | - |
비공개 접근수준 | private | 5 | 기능 정의 내부 | - |
접근 수준의 키워드를 하나씩 알아보자
공개 접근수준
은 자신이 구현된 소스 코드 내부와 자신이 속한 모듈, 외부에서 접근한 모듈까지 모두 접근이 가능하다.
개방 접근수준
은 접근 순위가 1순위이며 공개 접근수준과 비슷한 기능을 하지만 몇가지의 차이점이 있으며 그 차이점은 다음과 같다.
개방 접근수준
은 오직 클래스에서만 사용이 가능하다.외부의 다른 모듈
에서도 상속
이 가능하다.외부 다른 모듈
에서 재정의
또한 가능하다.개방 접근수준을 제외한 나머지 접근수준으로 정의한 클래스는 클래스가 정의된 모듈 안에서만 상속이 가능하며, 또한 개방 접근수준을 제외한 나머지 접근수준으로 정의한 클래스 멤버는 정의된 모듈 내부에서만 재정의가 가능하다.
접근수준 키워드를 작성하지 않고 선언시 기본으로 지정
되는 접근수준이다. 내부 접근수준은 소스파일이 속한 모듈 내부에서만 접근이 가능하다.
파일외부비공개 접근수준
으로 선언 할 경우 구현된 소스파일 내부에서만 접근이 가능하다.
비공개 접근수준
로 선언한 요소는 그 기능을 구현한 내부에서만 사용이 가능하다. 비공개 접근수준
은 같은 소스파일 내부의 다른 타입 혹은 메서드 등에서도 접근이 불가능하다.
접근제어를 구현시 적용되는 규칙은 다음과 같다.
상위 요소보다 하위 요소의 접근 수준이 더 높을 수 없다.
예를 들어 구조체의 접근 수준을 비공개 접근수준
일 경우 프로퍼티나 메서드의 접근 수준을 공개 접근수준
이나 개방 접근수준
으로 구현할 수 없다는 것이다. 이럴 경우 프로퍼티와 메서드는 구조체의 접근제어 수준을 따른다.
그리고 함수의 경우함수의 접근수준
은 매개변수로 전달되는 전달 인자의 접근 수준
보다 높게 구현 할 수 없다.
튜플과 열거형 또한 비슷한 규칙을 가지는데 튜플의 접근수준
은 튜플의 내부 요소의 접근수준
보다 높게 구현 할 수 없다. 열거형의 경우 열거형의 case는 열거형의 접근 수준을 따르고 열거형의 원시값의 접근수준
은 열거형의 접근수준
보다 낮은 접근수준이 올 수 없다.