티스토리 뷰

Swift 또한 다른 언어와 마찬가지로 여러 접근제어자를 제공하여 특정 코드의 접근을 다른 소스파일이나 모듈에서 제한할 수 있다. 

접근 제어는 클래스, 구조체 , 열거형 등 개별 타입에도 적용할 수 있고, 그 타입에 속한 프로퍼티, 메서드, 생성자, 서브스크립트에도 적용할 수 있다. 

 

바로 알아보도록 하자.


Swift의 접근 제어는 모듈과 소스파일에 기반을 두고 있다. 모듈은 코드를 배포하는 단일 단위로 하나의 프레임워크나 앱이 이 단위로 배포되고 다른 모듈에서 Swift의 Import 키워드를 사용하여 import 될 수 있다. 

 

1. 접근 레벨

Swift에서는 5개의 접근 레벨을 제공한다.

 

 1) Open & Public: Open과 Public 접근자 모두 선언한 모듈이 아닌 다른 모듈에서 사용 가능하다. 두 접근자의 차이점은 Open은 다른 모듈에서 오버라이드와 서브 클래싱이 불가능 하다는 점이다.

 2) Internal: 기본 접근레벨로 아무 접근 레벨을 선언하지 않으면 Internal로 간주된다. Internal 로 선언된 코드는 해당 모듈 전체에서 사용이 가능하다.

 3) File-private: 특정 엔티티를 선언한 파일 안에서만 사용 가능하다.

 4) Private: 특정 엔티티가 선언된 괄호 안에서만 사용이 가능하다.


2. 접근제어 문법

각 접근자를 사용하여 클래스와 변수, 상수를 선언한 예는 다음과 같다.

public class SomePublicClass {}
internal class SomeInternalClass {} // internal 은 생략 가능
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}

public var somePublicVariable = 0
internal let someInternalConstant = 0 // internal 은 생략 가능
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
public class SomePublicClass {                  // explicitly public class
    public var somePublicProperty = 0            // explicitly public class member
    var someInternalProperty = 0                 // implicitly internal class member
    fileprivate func someFilePrivateMethod() {}  // explicitly file-private class member
    private func somePrivateMethod() {}          // explicitly private class member
}

class SomeInternalClass {                       // implicitly internal class
    var someInternalProperty = 0                 // implicitly internal class member
    fileprivate func someFilePrivateMethod() {}  // explicitly file-private class member
    private func somePrivateMethod() {}          // explicitly private class member
}

fileprivate class SomeFilePrivateClass {        // explicitly file-private class
    func someFilePrivateMethod() {}              // implicitly file-private class member
    private func somePrivateMethod() {}          // explicitly private class member
}

private class SomePrivateClass {                // explicitly private class
    func somePrivateMethod() {}                  // implicitly private class member
}

 

만약, 튜플이나 중첩 타입과 같이 2가지 접근 제어를 선언한 엔티티가 존재하는 경우는 둘 중 더 낮은 접근 제어자를 적용한다.


그 밖에 함수나 초기자 등 여러 타입, 변수에 대한 접근 제어 조건이 있긴 하지만, 기본적으로 접근 제어는 접근 가능 레벨을 확인하는 것이 가장 중요하기 때문에 따로 서술하지는 않겠다.

 

References: https://jusung.gitbook.io/the-swift-language-guide/language-guide/25-access-control

 

접근제어 (Access Control) - The Swift Language Guide (한국어)

접근제어는 특정 코드의 접근을 다른 소스파일이나 모듈에서 제한하는 것입니다. 이렇게 접근제어를 함으로써 특정 코드의 세부적인 구현을 감추고 딱 필요한 만큼 공개해 다른 곳에서 사용할

jusung.gitbook.io

 

Comments