모듈
은 배포할 하나의 코드 묶음 단위로, 통상적으로 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단위가 될 수 있다.소스파일
은 말 그대로 하나의 소스파일(.swift) 를 의미한다.open
: 모듈 외부까지public
: 모듈 외부까지internal
: 모듈 외부까지fileprivate
: 파일 내부private
: 기능 정의 내부open과 public의 차이는 오버라이드 및 상속 가능성 여부이다.
public 같은 경우에는 모듈 외부의 클래스에 대해 상속 및 오버라이드가 불가능 하지만, open의 경우에는 모듈 외부의 클래스에 대해 상속 및 오버라이드가 가능하다.
모든 타입에 적용되는 접근수준의 규칙은 상위요소보다 하위요소가 더 높은 접근 제어 수준을 가질 수 없다
이다. 예를 들어 비공개 접근 수준으로 정의한 구조체 내부의 프로퍼티는 공개수준이나 내부수준의 접근 수준을 갖는 것으로 정의할 수 없다.
private class AClass{
public func ... /// 불가
}
public func sonFuction(a: AClass) -> {
return a
} /// 불가
internal class InternalClass{}
private class struct PrivateStruct{}
public var public tuple : (first: InternalClass, second: PrivateStruct) = (InternalClass(), PrivateStruct()) // 오류 발생
private var tuple : (first: InternalClass, second: PrivateStruct) = (InternalClass(), PrivateStruct()) // 가능
fileprivate
와 private
모두 파일 내부에서만 접근이 가능하며, private
은 조금 더 제한된 접근 제어 수준을 갖는다.extension
키워드 통해 자신을 확장하는 키워드에서 private
의 접근 수준이 파일 내부 수준으로 올라간다.(fileprivate
) 와 동일private(set)
이나 fileprivate(set)
와 같이 표현한다.class Aclass{
private count: Int = 0
public private(set) getCount: Int{
get{
return count
}
set{
count += 1
}
}
public internal(set) subscript(_ at: Int) -> Int{
get{
return 100
}
set{
}
}
}
var hi = Aclass()
print(hi.getCount) // 1
hi.getCount = 2 // 오류 발생! setter의 접근 제어 수준이 private이다!
print(hi[4]) // 100