1. 접근수준
- 키워드를 통해 구현
- 각 타입에 특정 접근수준을 지정 가능
- 타입 내부의 프로퍼티 / 메서드 / 이니셜라이져 / 서브스크립트 각각에도 접근 수준 지정 가능
- 스위프트에서는 모듈과 소스파일에 따라 구분 가능
- 상위 요소보다 하위 요소가 더 높은 접근 수준을 가질 수 없다.
private class AClass {
public func someMethod() {
}
}
public func someFunction(a: AClass) -> AClass {
return a
}
2. 공개 접근수준 - public
- 모듈 외부 까지 접근 가능
- 어디서든 쓰일 수 있음
- 주로 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 사용
- 스위프트의 기본 요소는 모두 공개 접근수준
- 스위프트 표준 라이브러이 Bool type의 예
public struct Bool {
public init()
}
3. 개방 접근수준 - open
- public 접근수준 이상으로 높은 접근 수준
- 클래스와 클래스의 멤버에서만 사용가능
- publc 과의 차이
- open을 제외한 다른 모든 접근 수준의 클래스는 클래스가 정의된 모듈 안에서만 상속이 가능
- open을 제외한 다른 모든 접근 수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 재정의 가능
- open의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속가능
- open의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 모듈에서도 override 가능
- 클래스를 open으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모클래스로 사용 하겠다는 목적으로 클래스를 설계하고 코드를 작성했음을 의미
- Foundation 프레임워크에 정의되어 있는 개방접근 수준의 NSString 클래스
open class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding {
open var length: Int { get }
open func character(at index: Int) -> unichar
public init()
public init?(coder aDecoder: NSCoder)
}
- 라이브러리 / 프레임워크 설계시 프로그래머가 이 타입을 사용할 수 있도록 하려면 open / public
- 이 경우 프로그래머가 상속받아 사용하면 좋겠다거나 상속 후 재정의하여 사용하면 좋겠다 -> open
- 그렇지 않고 클래스를 상속받거나 재정의 할 수 없도록 막고 싶다면 -> public
- 두 경우가 아닌 접근수준의 클래스 및 타입은 모듈 외부에서 접근할 수 없음으로 라이브러리 및 프레임워크를 사용하는 사용자가 사용할 수 없다.
4. 내부 접근수준 - internal
- internal은 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준
- internal로 지정된 요소는 모듈 어디에서든 쓰일 수 있음
- 모듈을 가져다 사용하는 외부 모듈에서는 접근 불가
- 외부에서 사용할 클래스 / 구조체가 아니며 모듈 내부 광역적 사용할 경우 internal 지정
5. 파일외부비공개 접근수준 - fileprivate
- fileprivate 으로 지정된 요소는 그 소스파일 내부에서만 사용 가능
- 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우 사용
6. 비공개 접근수준 - private
- private은 가장 한정적인 범위
- 기능을 구현하고 정의한 범위 내에서만 사용
- 같은 소스파일 안의 기능 / 타입에도 사용 불가