야곰님의 swift 프로그래밍 책을 보며 정리했습니다.
접근제어란?
접근제어는 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능입니다. 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공할 수 있습니다.
접근제어의 필요성?
객체지향 프로그래밍에서 중요한 캡슐화와 은닉화를 구현하는 이유는 외부에서 보거나 접근하면 안되는 코드가 있기 때문입니다. 그래서 접근제어를 이용해 필요한 부분만 코드를 노출시킵니다.
모듈과 소스파일?
스위프트의 접근제어는 모듈과 소스파일 기반으로 설계되었습니다.
모듈은 배포할 코드의 묶음 단위입니다. 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단위가 될 수 있습니다. 스위프트에서는 import 키워드를 사용해 불러옵니다.
소스파일은 하나의 스위프트 소스 코드 파일을 의미합니다.
접근수준?
접근제어는 접근수준 키워드를 통해 구현할 수 있습니다. open, public, internal, fileprivate, private 다섯가지가 있습니다.
접근 수준 | 키워드 | 접근도 | 범위 | 비고 |
개방 접근수준 | open | 높음 | 모듈 외부까지 | 클래스에서만 사용 |
공개 접근수준 | public | 모듈 외부까지 | ||
내부 접근수준 | internal | 모듈 내부 | ||
파일외부비공개 접근수준 | fileprivate | 파일 내부 | ||
비공개 접근수준 | private | 낮음 | 기능 정의 내부 |
(1) open
public 보다 높은 접근수준으로, 클래스와 클래스 멤버에서만 사용할 수 있습니다. 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속할 수 있습니다. 해달 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의할 수 있습니다.
(2) public
public 키워드로 접근 수준이 지정된 요소는 어디서든 쓰일 수 있습니다. 자신이 구현된 소스파일은 물론, 그 소스파일이 속해 있는 모듈, 그 모듈을 가져다 쓰는 모듈 등 모든 곳에서 사용할 수 있습니다.
주로 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 많이 쓰입니다.
(3) internal
기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근 수준입니다. 소스파일이 속해 있는 모듈 어디서든 쓰일 수 있습니다. 다만 그 모듈을 가져다 쓰는 외부 모듈에서는 접근할 수 없습니다. 보통 외부에서 사용할 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용할 경우 사용합니다. (기본 접근수준이므로 굳이 표기해주지 않아도 된다)
(4) fileprivate
그 요소가 구현된 소스파일 내부에서만 사용할 수 있습니다. 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에만 사용하면 좋습니다.
(5) private
가장 한정적인 범위이며, 그 기능을 정의하고 구현한 범위 내에서만 허용할 수 있습니다. 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용할 수 없습니다.
접근제어 구현시 참고사항
- 상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다.
- private으로 정의된 클래스안에 public으로 정의된 함수를 담을 수 없다.
- public으로 정의된 함수의 매개변수로 전달된 함수가 private일 수 없다.
'iOS > Swift' 카테고리의 다른 글
[iOS] Data Binding in MVVM (0) | 2022.02.19 |
---|---|
[iOS] MVVM 패턴 (0) | 2022.02.18 |
[iOS] MVC 패턴 (0) | 2022.02.16 |
[iOS] didSet,willSet 그리고 get,set (0) | 2022.02.16 |
[iOS] 데이터 전달 방식 4가지 - property, delegate, closure, NotificationCenter (7) | 2022.02.13 |
댓글