iOS/Swift

접근제어

밤새는 탐험가89 2024. 2. 5. 11:56

 

 

접근제어 

코드끼리 상호작용을 할 때 

파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능

 

 

 

접근제어의 필요성 

캡슐화와 은닉화를 구현하는 이유는 

외부에서 보거나 접근하면 안 되는 코드가 있기 때문

 

 

 

모듈과 소스파일 

모듈은 배포할 코드의 묶음 단위 

소스파일하나의 스위프트 소스 코드 파일 의미 

 

 

 

접근수준 키워드

open

public

internal

fileprivate

private

 

접근수준 키워드를 통해 각 타입 (클래스, 구조체, 열거형 등)에 접근 수준 지정 가능 

또는 

타입 내부의 프로퍼티, 메서드. 이니셜라이저 등에도 접근 수준 지정 가능 

 

 

 

공개 접근수준 => public

public 키워드로 접근수준이 지정된 요소는 어디서든 사용 가능 

파일의 내부는 물론 외부에서도 지정된 요소에 접근 가능 

 

 

 

개방 접근수준 => open

open 키워드로 지정한 요소는 공개 접근수준 이상으로 높은 접근 수준

단, 클래스와 클래스의 멤버에서만 사용 가능 

 

★ 클래스를 개방 접근수준으로 명시했다면? ★

그 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적

 

 

공개 접근 수준과 다른 점 

- 개방 접근수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속 가능

- 개방 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의 가능

 

 

내부 접근수준 => internal

internal 키워드로 지정하는 내부 접근수준은 "기본적으로 모든 요소에 암묵적으로 지정하는" 기본 접근수준

내부 접근수준으로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 사용 가능

다만, 그 모듈을 가져다 쓰는 외뷰 모듈에서는 접근할 수 없음 

 

 

 

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

fileprivate 접근수준으로 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용 가능 

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

 

 

 

비공개 접근수준 => private

private 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용 가능 

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

 

출처:  [Swift] 객체지향 프로그래밍과 스위프트 - 접근제어 (velog.io)

 

 

 

접근제어 구현

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이기 때문에 {}외부에서 접근 불가