[Swift] 접근제어
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition
(iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
접근제어란?
- 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능
- 접근제어를 통해 코드의 상세 구현은 숨기고, 허용된 기능만 사용하는 인터페이스를 제공 가능
접근제어의 필요성
- 객체지향 프로그래밍 패러다임에서 캡슐화와 은닉화를 구현하는 이유는 외부에서 보거나 접근하면 안 되는 코드가 있기 때문
- 불필요한 접근으로 의도치 않은 결과를 초래하거나 꼭 필요한 부분만 제공해야하는데, 전체 코드가 노출될 가능성이 있을 때
접근제어를 이용
모듈과 소스파일
- 모듈(Module) : 배포할 코드의 묶음 단위, 통상 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단위가 될 수 있음
- import 키워드를 사용
- 소스파일 : 하나의 스위프트 소스 코드 파일
- 보통 파일 하나에 타입 하나만 정의하지만, 때로는 소스파일 하나에 여러 타입(여러개의 클래스, 구조체, 열거형 등)이나 함수 등 많은 것을 정의하거나 구현 가능
접근수준(Access Level)
- 각 타입(클래스, 구조체, 열거형 등)에 특정 접근수준을 지정할 수 있고, 타입 내부의 프로퍼티, 메서드, 이니셜라이저, 서브스크립트
각각에도 접근 수준 지정 가능
- 접근수준을 명시하는 키워드의 종류로는 open, public, internal, fileprivate, private가 있음
접근수준 | 키워드 | 접근도 | 범위 | 비고 |
개방 접근수준 | open | 높음 낮음 |
모듈 외부까지 | 클래스에서만 사용 |
공개 접근수준 | public | 모듈 외부까지 | ||
내부 접근수준 | Internal | 모듈 내부 | ||
파일외부비공개 접근수준 | fileprivate | 파일 내부 | ||
비공개 접근수준 | private | 기능 정의 내부 |
공개 접근수준 - public
- public 키워드 사용, 접근수준이 지정된 요소는 어디서든지 사용 가능
- 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 사용
- 우리가 사용하는 스위프트의 기본 요소는 모두 공개 접근수준으로 구현되어 있음
개방 접근수준 - open
- open 키워드 사용, puvlic 이상으로 높은 접근 수준
- 클래스와 클래스의 멤버에서만 사용 가능
- public과 open의 차이점
- 개방 접근수준을 제외한 다른 모든 접근수준의 클래스는 그 클래스가 정의된 모듈 안에서만 상속 가능
- 개방 접근수준을 제외한 다른 모든 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 재정의 가능
- 개방 접근수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속 가능
- 개방 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의 가능
- 클래스를 open으로 명시 → 그 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적으로 클래스 설계하고 코드 작성을 의미
내부 접근수준 - internal
- internal 키워드 사용, 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준
- internal로 지정된 요소는 소스파일에 속해 있는 모듈 어디에서든 사용 가능
파일외부비공개 접근수준 - fileprivate
- fileprivate 키워드 사용
- 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용 가능
- 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용하면 좋음
비공개 접근수준 - private
- private 키워드 사용, 가장 한정적인 범위
- 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용 가능
- 지정한 기능은 심지어 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용 불가
접근제어 구현
- 각각의 접근수준을 요소 앞에 지정해주기만 하면 됨
- internal은 기본 접근수준이므로 생략 가능
접근제어 구현 참고사항
- 상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없음
- 함수의 매개변수로 특정 접근수준이 부여된 타입이 전달되거나 반환된다면, 그 타입의 접근수준보다 함수의 접근수준이 높게 설정될 수
없음
- 함수뿐만 아니라 튜플의 내부 요소 타입 또한 튜플의 접근수준보다 같거나 높아야 함
- 접근수준에 따라 접근이 불가능하는 경우가 생기는데 → 프레임워크를 만들 때는 다른 모듈에서 특정 기능에 접근할 수 있도록 API로
사용할 기능을 public으로 지정해야 함
- 그 외의 요소는 internal 또는 private으로 적절히 설정
private와 fileprivate
- fileprivate로 지정한 요소는 같은 파일 어떤 코드에서도 접근 가능
- private로 지정한 요소는 같은 파일 내부에 다른 타입의 코드가 있더라도 접근이 불가
읽기 전용 구현
- 값을 변경할 수 없고 읽기만 가능하도록 제한하려면 설정자만 더 낮은 접근수준을 갖도록 제한하면 됨
- 요소의 접근수준 키워드 뒤에 "접근수준(set)"처럼 표현하면 설정자의 접근수준만 더 낮도록 지정 가능
- 설정자 접근수준 제한은 프로퍼티, 서브스크립트, 변수 등에 적용 가능하며, 해당 요소의 접근수준보다
같거나 낮은 수준으로 제한해야 함
'iOS > Swift' 카테고리의 다른 글
[Swift] URLSession (0) | 2022.11.17 |
---|---|
[Swift] Codable vs JSONSerialization (1) | 2022.10.15 |
[Swift] 인스턴스 (0) | 2022.09.28 |
[Swift] Extension (0) | 2022.09.27 |
[Swift] 상속 (0) | 2022.09.25 |