새소식

iOS/Swift

[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의 차이점

  1. 개방 접근수준을 제외한 다른 모든 접근수준의 클래스는 그 클래스가 정의된 모듈 안에서만 상속 가능
  2. 개방 접근수준을 제외한 다른 모든 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 재정의 가능
  3. 개방 접근수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속 가능
  4. 개방 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의 가능

- 클래스를 open으로 명시 → 그 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적으로 클래스 설계하고 코드 작성을 의미

 

내부 접근수준 - internal


- internal 키워드 사용, 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준

- internal로 지정된 요소는 소스파일에 속해 있는 모듈 어디에서든 사용 가능

 

파일외부비공개 접근수준 - fileprivate


- fileprivate 키워드 사용

- 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용 가능

- 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용하면 좋음

 

비공개 접근수준 - private


- private 키워드 사용, 가장 한정적인 범위

- 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용 가능

- 지정한 기능은 심지어 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용 불가

 

 

 

접근제어 구현


- 각각의 접근수준을 요소 앞에 지정해주기만 하면 됨

- internal은 기본 접근수준이므로 생략 가능

 

접근제어 구현 참고사항


- 상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없음

- 함수의 매개변수로 특정 접근수준이 부여된 타입이 전달되거나 반환된다면, 그 타입의 접근수준보다 함수의 접근수준이 높게 설정될 수
없음

- 함수뿐만 아니라 튜플의 내부 요소 타입 또한 튜플의 접근수준보다 같거나 높아야 함

- 접근수준에 따라 접근이 불가능하는 경우가 생기는데 → 프레임워크를 만들 때는 다른 모듈에서 특정 기능에 접근할 수 있도록 API로
사용할 기능을 public으로 지정해야 함

- 그 외의 요소는 internal 또는 private으로 적절히 설정

 

 

 

private와 fileprivate


- fileprivate로 지정한 요소는 같은 파일 어떤 코드에서도 접근 가능

- private로 지정한 요소는 같은 파일 내부에 다른 타입의 코드가 있더라도 접근이 불가

 

 

 

읽기 전용 구현


- 값을 변경할 수 없고 읽기만 가능하도록 제한하려면 설정자만 더 낮은 접근수준을 갖도록 제한하면 됨

- 요소의 접근수준 키워드 뒤에 "접근수준(set)"처럼 표현하면 설정자의 접근수준만 더 낮도록 지정 가능

- 설정자 접근수준 제한은 프로퍼티, 서브스크립트, 변수 등에 적용 가능하며, 해당 요소의 접근수준보다
같거나 낮은 수준으로 제한해야 함

설정자의 접근수준 지정

 

728x90

'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
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.