Swift - 접근제어
27 Mar 2017접근제어란
코드끼리 상호작용을 할 때 파일 간 또는 모듈() 간에 접근을 제한할 수 있는 기능입니다. 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공할 수 있습니다.
- 접근제어의 필요성
- 객체 지향 프로그래밍(OOP, Obejct-oriented programming)에서 캡슐화와 은닉화는 중요한 개념이고 잘 설계된 클래스를 만드는데 사용되는 기법입니다.
- 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용할 수 있습니다.
- 전체 코드를 노출하지 않고 꼭 필요한 부분만 제공하는 것을 통해 프로그래머에게 의도한 대로 코드 작성을 유도할 수 있습니다.
접근 수준
- 스위프트에서는 접근 수준 키워드를 통해 접근제어를 구현할 수 있습니다. 타입(클래스, 구조체, 열거형 등)에 특정 접근수준을 지정할 수 있고, 타입 내부의 프로퍼티, 메소드, 이니셜라이저, 서브스크립트 각각에도 접근수준을 지정할 수 있습니다.
접근수준 | 키워드 | 접근도 | 범위 | 비고 |
---|---|---|---|---|
개방접근수준 | open | 높음 | 모듈 외부까지 | 클래스에서만 사용 |
공개 접근수준 | public | ↑ | 모듈 내부 | |
내부 접근수준 | internal | 모듈 내부 | ||
파일외부비공개 접근수준 | fileprivate | ↓ | 파일 내부 | |
비공개 접근수준 | private | 낮음 | 기능 정의 내부 |
공개 접근수준
- public 키워드 사용
- 소스파일, 소스파일이 속해 있는 모듈 등 어디에서든 사용할 수 있다.
- 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 많이 쓰입니다.
- 스위프트의 기본 요소는 모두 공개 접근수준으로 구현되어 있습니다.
개방 접근수준
- open 키워드 사용
- 클래스와 클래스의 멤버에서만 사용할 수 있습니다.
- 개방 접근수준을 제외한 다른 모든 접근수준의 클래스는 그 클래스가 정의된 모듈 안에서만 상속될 수 있습니다.
- 개방 접근수준을 제외한 다른 모든 접근수준의 클래스 멤버는 그 멤버가 정의된 모듈 안에서만 재정의될 수 있습니다.
- 개방 접근수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속될 수 있습니다.
- 개방 접근수준의 클래스 멤버는 그 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의될 수 있습니다.
내부 접근수준
- internal 키워드 사용
- 기본적으로 모든 요소에 암묵적으로 저장되는 기본 접근수준입니다.
- 보통 외부에서 사용될 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용될 경우 내부 접근수준을 지정하게 됩니다.
내부 접근수준으로 접근수준이 지정된 요소는 구현된 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있습니다.
파일외부비공개 접근수준
- fileprivate 키워드 사용
- 파일외부비공개 접근수준으로 접근수준이 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용할 수 있습니다.
- 해당 소스파일 외부에서 값이 변경되거나 함수가 호출되면 부작용이 생길 수 있는 경우에 사용하면 좋습니다.
비공개 접근수준, private
- private 키워드 사용
- 비공개 접근수준으로 접근수준이 지정된 요소는 그 기능이 정의되고 구현된 범위 내에서만 사용될 수 있습니다.
- 비공개 접근수준으로 지정된 기능은 심지어 같은 소스파일 안에 구현된 다른 타입이나 기능에서도 사용할 수 없습니다.
접근제어 구현 참고사항
- 모든 타입에 적용되는 접근수준의 규칙은
'상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다.'
입니다.- 비공개 접근수준으로 정의된 구조체 내부의 프로퍼티로 내부수준이나 공개수준을 가지는 프로퍼티가 정의될 수 없습니다.
- 함수의 매개변수로 특정 접근수준이 부여된 타입이 전달되거나 반환된다면, 그 타입의 접근수준보다 함수의 접근수준이 높게 설정될 수 없습니다.
글의 일부 내용은 야곰님의 저서 스위프트 프로그래밍(2017, 한빛미디어)를 참고하여 작성되었습니다.