Swift

Swift: 접근제어 구현 규칙

소재훈 2022. 2. 15. 01:07

모든 타입에 적용되는 접근 수준의 규칙은 

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

이다.

 

비공개 접근 수준으로 정의한 구조체 내부의 프로퍼티로 내부 수준이나 공개 수준을 가지는 프로퍼티를 정의할 수 없고,

함수의 매개변수로 특정 접근 수준이 부여되었을 때, 함수의 접근수준이 매개변수 타입의 접근 수준보다 높을 수 없다.

private class Aclass {
    /**
     * 비공개 접근 수준으로 정의한 클래스에서
     * 공개 접근 수준의 메서드를 정의한다고 해도 메서드의
     * 접근 수준도 비공개 접근수준으로 취급된다.
     */
    public func someMethod() {
        //대충 메서드 내용
    }
}

/**
 * Aclass의 접근 수준이 비공개 접근 수준이므로
 * 공개접근 수준 함수의 매개변수 또는 반환 타입으로 사용될 수 없다.
 * 아래의 함수에서도 에러가 발생한다.
 */
public func someFunction(a: Aclass) -> AClass {
    return a
}

 

아래는 요소로 사용되는 InternalCalss와 PrivateStruct의 접근수준이 publicTuple보다 낮기 때문에 둘 다 튜플의 요소로서 사용할 수 없다. 튜플 요소의 접근수준이 튜플의 접근 수준보다 높을 수 없다.

두 번째 privateTuple의 접근 수준이 요소의 접근 수준들보다 같거나 높기 때문에 privateTuple은 사용할 수 있다.

internal class InternalClass {} // 내부 접근수준 클래스
private struct PrivateStruct {} // 비공개 접근수준 구조체

public var publicTuple: (first: InternalClass, second: PrivateStruct) =
	(InternalClass(), PrivateStruct()) // 사용할 수 없다.
    
private var privateTuple: (first: InternalClass, second: PrivateStruct) = 
	(InternalCalss(), PrivateStruct()) // 사용할 수 있다.

 

프레임 워크를 만들 때는 다른 모듈에서 특정 기능에 접근할 수 있도록 API에서 사용할 기능을 공개 접근수준(public)으로 지정해주어야 한다. 나머지 요소는 내부 접근수준(internal)이나 비공개 접근 수준(private), 파일 비공개 접근 수준(fileprivate)으로 적절히 설정하면 된다.