접근제어
코드끼리 상호작용을 할 때
파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능
접근제어의 필요성
캡슐화와 은닉화를 구현하는 이유는
외부에서 보거나 접근하면 안 되는 코드가 있기 때문
모듈과 소스파일
모듈은 배포할 코드의 묶음 단위
소스파일은 하나의 스위프트 소스 코드 파일 의미
접근수준 키워드
open
public
internal
fileprivate
private
접근수준 키워드를 통해 각 타입 (클래스, 구조체, 열거형 등)에 접근 수준 지정 가능
또는
타입 내부의 프로퍼티, 메서드. 이니셜라이저 등에도 접근 수준 지정 가능
공개 접근수준 => public
public 키워드로 접근수준이 지정된 요소는 어디서든 사용 가능
파일의 내부는 물론 외부에서도 지정된 요소에 접근 가능
개방 접근수준 => open
open 키워드로 지정한 요소는 공개 접근수준 이상으로 높은 접근 수준
단, 클래스와 클래스의 멤버에서만 사용 가능
★ 클래스를 개방 접근수준으로 명시했다면? ★
그 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적
공개 접근 수준과 다른 점
- 개방 접근수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속 가능
- 개방 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의 가능
내부 접근수준 => internal
internal 키워드로 지정하는 내부 접근수준은 "기본적으로 모든 요소에 암묵적으로 지정하는" 기본 접근수준
내부 접근수준으로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 사용 가능
다만, 그 모듈을 가져다 쓰는 외뷰 모듈에서는 접근할 수 없음
파일외부비공개 접근수준 => fileprivate
fileprivate 접근수준으로 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용 가능
해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 경우 사용
비공개 접근수준 => private
private 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용 가능
같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용 불가
접근제어 구현
public class SomePublicClass { // 명시적인 public 선언
open var someOpenProperty = "SomeOpen" // open 이라고 설정해도 public으로 작동 ⭐️
public var somePublicProperty = "SomePublic"
var someInternalProperty = "SomeInternal" // 원래의 기본 수준
fileprivate var someFilePrivateProperty = "SomeFilePrivate"
private var somePrivateProperty = "SomePrivate"
}
let somePublic = SomePublicClass()
somePublic.someOpenProperty
somePublic.somePublicProperty
somePublic.someInternalProperty
somePublic.someFilePrivateProperty // 같은 파일 안이기 때문에 접근 가능
//somePublic.somePrivateProperty //private이기 때문에 {}외부에서 접근 불가
'iOS > Swift' 카테고리의 다른 글
클로저 2편 (2) | 2024.02.08 |
---|---|
클로저 1편 (0) | 2024.02.06 |
인스턴스 생성 및 소멸 6편 (인스턴스 소멸) (0) | 2024.02.02 |
인스턴스 생성 및 소멸 5편 (함수를 사용한 프로퍼티 기본값 설정) (0) | 2024.02.01 |
인스턴스 생성 및 소멸 4편 (실패 가능한 이니셜라이저) (0) | 2024.01.31 |