NOTE 프로퍼티, 타입, 함수 등에 적용가능한 각 접근제어와 관련한 내용은 이후 섹션에서 자세하고 명확하게 기술해 두었습니다.
import
키워드를 사용해 import될 수 있습니다. Xcode의 각 빌드 타겟은 Swift에서 분리된 단일 모듈로 취급됩니다. 소스파일은 모듈안에 있는 소스파일을 의미합니다. 각 소스파일에 여러 특정 타입을 선언해 사용할 수 있습니다.Open
& Public
: Open과 Public 접근자 모두 선언한 모듈이 아닌 다른 모듈에서 사용가능합니다. 두 접근자의 차이점은 Open은 다른 모듈에서 오버라이드와 서브클래싱이 가능하지만 Public 접근자로 선언된 것은 다른 모듈에서는 오버라이드와 서브클래싱이 불가능 합니다.Internal
: 기본 접근레벨로 아무 접근레벨을 선언하지 않으면 Internal
로 간주됩니다. Internal
레벨로 선언되면 해당 모듈 전체에서 사용 가능합니다.File-private
: 특정 엔티티를 선언한 파일 안에서만 사용 가능합니다.Private
: 특정 엔티티가 선언된 괄호({}) 안에서만 사용 가능합니다.internal
을 갖게 됩니다.file-private
, private
등을 사용해 앱내에서 구현 세부사항을 숨길 수 있습니다.public
혹은 open
으로 지정해서 다른 모듈에서 볼 수 있고 접근 가능하도록 만들어야 합니다.NOTE 만약 프레임워크의 구체적 구현을 감추고 싶은 부분이 있다면 그 부분은internal
로 선언하면 됩니다. 그리고 노출 시키고 싶은 API만public
혹은open
으로 지정합니다.
open
이나 public
으로 지정된 엔티티만 다른 모듈에서 접근 가능합니다. 하지만 유닛테스트를 하는 경우 모듈을 import할때 import앞에 @testable
이라는 에트리뷰트를 붙여주면 해달 모듈을 테스트가 가능한 모듈로 컴파일해 사용합니다.internal
접근레벨은 생략할 수 있습니다.file-private
클래스로 선언하면 그안의 프로퍼티와 함수 파라미터 그리고 반환 타입도 file-private
접근 권한을 갖습니다. 다시말해 특정 타입의 접근레벨의 지정은 그 타입의 멤버(프로퍼티, 메소드 초기자 와 서브스크립트)에 기본 접근레벨에 영향을 미칩니다.IMPORTANTpublic
타입은 기본 적으로internal
멤버를 갖고public
을 갖지 않습니다. 이렇게 동작하는 이유는 public API를 만들시 노출되지 말아야 할 API가 실수로 노출되는 것을 막기 위함입니다. 그래서 노출시키고 싶은 멤버는 명시적으로public
접근제어자를 붙여줘야 합니다.
internal
다른 하나는 private
접근 권한을 갖는 2개의 타입으로 구성된 튜플은 더 낮은 레벨인 private
접근 레벨을 갖습니다.NOTE 튜플은 자체적으로 접근레벨을 선언하지 않고 사용하는 클래스, 구조체, 열거형 그리고 함수 등에 따라 자동으로 최소 접근레벨을 부여 받습니다. 즉, 튜플은 명시적으로 접근권한을 명시하지 않습니다.
private
인 SomePrivateClass
가 존재하기 때문에 someFunction()
은 internal
접근레벨로 선언될 수 없기 때문입니다.private
접근레벨을 지정해 줘야 합니다.public
을 따라 모두 public
접근레벨을 갖습니다.internal
접근 레벨을 갖고 있는 열거형 타입에서 private
접근레벨을 갖는 고유값을 사용할 수 없습니다.private
로 선언된 타입의 중첩 타입은 자동으로 private
접근레벨을 갖습니다. file-private
으로 선언된 경우 중첩타입은 file-private
을 갖습니다. public
혹은 internal
로 선언된 타입에서 중첩타입은 자동으로 internal
접근레벨을 갖습니다. public
으로 선언된 타입에서 public
으로 선언된 중첩타입을 사용하고 싶으면 명시적으로 public
접근자를 중첩타입에 적어줘야 합니다.internal
를 갖는데 그것을 서브클래싱해서 pubic
서브클래스를 만들 수 없습니다. 하지만 메소드는 서브클래스에서 더 높은 접은 레벨을 갖는 메소드로 오버라이드 할 수 있습니다. 아래 예제에서는 class B의 someMethod()는 수퍼클래스의 fileprivate
보다 더 높은 접근레벨인 internal
을 갖도록 오버라이드 됐습니다.super.someMethod()
를 호출하는 것이 유효하기 때문입니다.private
타입에서 public
프로퍼티를 선언할 수 없습니다. 아래와 같이 private
클래스 변수의 접근레벨은 private
이 돼야 합니다.fileprivate(set)
, private(set)
, internal(set)
NOTE 이 규칙은 저장프로퍼티 뿐아니라 계산된 프로퍼티에도 동일하게 적용됩니다. 아래 예제는 numberOfEdits변수를private(set)
로 설정해 TrackedString 내부에서만 변경되도록 지정한 코드입니다. TrackedString에 아무런 접근레벨이 지정되지 않았기 때문에internal
로 취급돼 numberOfEdits변수에private(set)
이 지정되지 않았다면 TrackedString 밖에서도 접근이 가능했을 것입니다.
public private(set) var numberOfEdits = 0
게터 레벨도 지정할 수 있습니다.public
으로 지정돼있지 않은 이상 타입과 같은 접근레벨을 갖습니다. 만약 타입의 접근 레벨이 public
으로 지정돼 있으면 기본 초기자는 internal
접근레벨을 갖습니다.private
로 지정된 경우 멤버쪽 초기자의 접근레벨은 private
을 갖고 file private
인 경우는 file private
를 갖습니다. 그밖에는 internal
접근레벨을 갖습니다. 만약 public
구조체 타입이 다른 모듈에서 사용될 때는 반드시 멤버쪽 초기자의 선언에 public
으로 지정해야 다른 모듈에서 그 멤버쪽 초기자를 사용할 수 있습니다.NOTE 프로토콜의 접근레벨과 그 안의 요구사항의 접근레벨은 항상 동일해야하는 것은 다른 타입과는 다르다. 다른 타입은 타입의 선언이public
이어도 안의 구현은internal
일 수 있습니다.
public
타입을 다른 모듈에서 사용하지만 internal
프로토콜은 오직 internal
프로토콜이 선언된 곳에서만 사용가능 합니다. 만약 타입이 public
이고 프로토콜이 internal
이라면 그 프로토콜을 따르는 타입도 internal
입니다.NOTE Objective-C 와 같이 Swift에서도 프로토콜 순응은 전역적으로 같은 프로그램에서 다른 방법으로 프로토콜을 따르는 것은 불가능 합니다.
private
멤버로 선언한것을 익스텐션에서 멤버로 접근할 수 있습니다.private
멤버로 선언한 것을 같은 파일의 다른 익스텐션에서 접근할 수 있습니다.private
멤버로 선언한 것을 원본 선언에서 멤버로 접근할 수 있습니다.private
변수를 하나 선언합니다.private
변수에 접근할 수 있습니다.private
타입의 별칭은 private
, file-private
, internal
, public
, open
타입의 접근 권한을 갖을 수 있습니다.NOTE 이 규칙은 프로토콜의 순응을 충족시키는데 사용하는 연관 타입을 위한 별칭에도 동일하게 적용됩니다.