🔥 접근 수준

628자
9분

Swift는 코드 내의 엔티티에 대해 다섯 가지 서로 다른 접근 수준을 제공합니다. 이러한 접근 수준은 엔티티가 정의된 소스 파일과 관련이 있으며, 해당 소스 파일이 속한 모듈과도 관련이 있죠.

  • Open accesspublic access는 엔티티가 정의 모듈의 모든 소스 파일 내에서 사용될 수 있을 뿐만 아니라, 정의 모듈을 가져오는 다른 모듈의 소스 파일에서도 사용될 수 있게 해줍니다. 일반적으로 프레임워크의 공용 인터페이스를 지정할 때 open 또는 public 접근을 사용하게 되는데요. open과 public 접근의 차이점은 아래에서 설명하도록 하겠습니다.
  • Internal access는 엔티티가 정의 모듈의 모든 소스 파일 내에서 사용될 수 있지만, 해당 모듈 외부의 소스 파일에서는 사용할 수 없도록 합니다. 일반적으로 앱이나 프레임워크의 내부 구조를 정의할 때 internal 접근을 사용하죠.
  • File-private access는 엔티티의 사용을 자체 정의 소스 파일로 제한합니다. 특정 기능의 구현 세부 정보가 전체 파일 내에서 사용될 때 해당 세부 정보를 숨기려면 file-private 접근을 사용하면 됩니다.
  • Private access는 엔티티의 사용을 둘러싸는 선언과 동일한 파일에 있는 해당 선언의 확장으로 제한합니다. 특정 기능의 구현 세부 정보가 단일 선언 내에서만 사용될 때 해당 세부 정보를 숨기려면 private 접근을 사용하세요.

Open access는 가장 높은(제한이 가장 적은) 접근 수준이고 private access는 가장 낮은(제한이 가장 많은) 접근 수준입니다.

Open access는 클래스와 클래스 멤버에만 적용되며, Subclassing에서 설명한 대로 모듈 외부의 코드에서 하위 클래스화 및 재정의를 허용한다는 점에서 public access와 다릅니다. 클래스를 open으로 표시하면 다른 모듈의 코드가 해당 클래스를 상위 클래스로 사용하는 것이 미치는 영향을 고려했으며 클래스의 코드를 그에 따라 설계했음을 명시적으로 나타내는 것이죠.

접근 수준의 지침 원칙

Swift의 접근 수준은 다음과 같은 전반적인 지침 원칙을 따릅니다: 어떤 엔티티도 더 낮은(더 제한적인) 접근 수준을 가진 다른 엔티티의 관점에서 정의될 수 없습니다.

예를 들어보겠습니다:

  • public 변수는 internal, file-private 또는 private 유형으로 정의될 수 없는데, 해당 유형이 public 변수가 사용되는 모든 곳에서 사용 가능하지 않을 수 있기 때문이죠.
public var somePublicVariable: SomeInternalType // 컴파일 에러!
swift
  • 함수는 해당 함수가 구성 요소 유형을 주변 코드에서 사용할 수 없는 상황에서 사용될 수 있으므로 매개변수 유형 및 반환 유형보다 높은 접근 수준을 가질 수 없습니다.
public func someFunction(param: SomeInternalType) -> SomeInternalType { // 컴파일 에러!
    // 구현
}
swift

언어의 다양한 측면에 대한 이 지침 원칙의 구체적인 의미는 아래에서 자세히 다루도록 하겠습니다.

기본 접근 수준

코드의 모든 엔티티(이 장의 뒷부분에서 설명하는 몇 가지 특정 예외 사항 제외)는 명시적 접근 수준을 직접 지정하지 않으면 기본적으로 internal 접근 수준을 갖습니다. 따라서 대부분의 경우 코드에서 명시적 접근 수준을 지정할 필요가 없죠.

단일 대상 앱의 접근 수준

단순한 단일 대상 앱을 작성할 때 앱의 코드는 일반적으로 앱 내에 자체 포함되어 있으며 앱의 모듈 외부에서 사용할 수 있도록 만들 필요가 없습니다. 기본 접근 수준인 internal이 이미 이 요구 사항과 일치하므로 사용자 지정 접근 수준을 지정할 필요가 없죠. 그러나 앱 모듈 내의 다른 코드에서 구현 세부 정보를 숨기기 위해 코드의 일부를 file private 또는 private으로 표시할 수 있습니다.

프레임워크의 접근 수준

프레임워크를 개발할 때는 프레임워크를 가져오는 앱과 같은 다른 모듈에서 보고 액세스할 수 있도록 해당 프레임워크의 공용 인터페이스를 open 또는 public으로 표시해야 합니다. 이 공용 인터페이스는 프레임워크의 API(Application Programming Interface)입니다.

단위 테스트 대상의 접근 수준

단위 테스트 대상이 있는 앱을 작성할 때는 테스트를 위해 앱의 코드를 해당 모듈에서 사용할 수 있도록 만들어야 합니다. 기본적으로 open 또는 public으로 표시된 엔티티만 다른 모듈에서 액세스할 수 있습니다. 그러나 가져오기 선언을 @testable 속성으로 표시하고 테스트를 활성화한 상태에서 해당 제품 모듈을 컴파일하면 단위 테스트 대상에서 모든 internal 엔티티에 액세스할 수 있죠.

@testable import MyModule
 
class MyTests: XCTestCase {
    func testInternalFunction() {
        // MyModule의 internal 함수 테스트
        XCTAssertEqual(MyModule.internalFunction(), expectedResult)
    }
}
swift

이렇게 @testable 속성을 사용하면 내부 구현 세부 정보를 노출하지 않고도 모듈의 internal 엔티티에 대한 테스트 커버리지를 달성할 수 있답니다.

이상으로 Swift의 다양한 접근 수준과 그 특성에 대해 알아보았습니다. 적절한 접근 수준을 사용하면 코드의 캡슐화와 모듈성을 향상시킬 수 있으므로, 프로젝트의 규모와 요구 사항에 맞게 현명하게 접근 수준을 선택하는 것이 중요하겠죠? 코드의 가독성과 유지 보수성을 높이는 데에도 도움이 될 거예요. 접근 수준을 효과적으로 활용하여 더 나은 Swift 코드를 작성해 보시기 바랍니다!