[swift] 20. 접근제어
접근 레벨
- Open : 다른 모듈에서 사용 가능. 서브 클래싱 가능
- Public : 다른 모듈에서 사용 가능. 오버라이드, 서브클래싱 불가.
- Internal : 기본 값. 해당 모듈 전체에서 사용 가능
- File-private : 특정 엔티티를 선안한 파일 안에서만 사용 가능
- Private : 특정 엔티티가 선언된 괄오 안에서만 사용 가능
레벨 지정
- public class 에서 기본적으로 internal 임.
- public 은 명시적으로 지정해야 함. 실수로 노출되는 것을 막기 위함.
- fileprivate class 에서 기본 값은 file-private 임.
- private class 에서 기본 값은 private 임.
튜플 타입
- 가장 낮은 접근 제한자를 따른다.
함수 타입
인자와 반환 값보다 넓은 접근 제한자를 가질 수 없다.
func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}
// 에러. Private class 가 있으므로 함수는 private으로 선언되어야 함.
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}
열거형 타입(Enum)
- 각 case 는 enum의 접근 제한을 따름.
- 개별 접근 제한을 지정할 수 없음.
서브클래싱
- 서브클래스는 수퍼클래스보다 더 높은 접근 레벨을 갖을 수 없음.
- 메소드는 서브클래스에서 더 높은 접근 레벨을 갖는 메소드로 오버라이드 할 수 있음.
public class A {
fileprivate func someMethod() {}
}
internal class B: A {
override internal func someMethod() {}
}
Getter & Setter
- Getter와 Setter의 접근 레벨은 해당 프로퍼티의 접근레벨과 동일하나, 별도 지정 가능
- fileprivate(set), private(set), internal(set)
struct TrackedString { private(set) var numberOfEdits = 0 var value: String = “” { didSet { numberOfEdits += 1 } } }
Extension
- 원본 선언에서 private 멤버로 선언한 것을 익스텐션에서 멤버로 접근할 수 있다.
- 익스텐션에서 private 멤버로 선언한 것을 같은 파일의 다른 익스텐션에서 접근할 수 있다.
protocol SomeProtocol {
func doSomething()
}
struct SomeStruct {
private var privateVariable = 12
}
extension SomeStruct: SomeProtocol {
func doSomething() {
print(privateVariable)
}
}