우선 우리가 잘 알고 있듯이 swift의 접근제어자는 다음과 같이 6개가 있습니다. 5개라고 알고 있는 사람도 많겠지만, Swift 5.9 부터 package 접근제어자가 추가되어 6개가 되었습니다.
Swift는 코드 내의 엔티티에 대해 6가지 다른 액세스 수준을 제공합니다. 이러한 액세스 수준은 엔티티가 정의된 소스 파일, 소스 파일이 속한 모듈 및 모듈이 속한 패키지와 관련이 있습니다.
접근 제어자
- open: 가장 높은 수준의 접근 제어자. 다른 모듈에서도 접근, 서브클래싱, 오버라이딩 가능
// 모듈: ModuleA
open class Animal {
open func bark() {
print("으르렁")
}
}
// 모듈: ModuleB
class Cat: Animal {
override open func bark() {
print("야옹")
}
}
- public: open과 같은 수준의 접근 제어자. 다른 모듈에서도 접근이 가능하나, 서브클래싱과 오버라이딩은 불가능
// 모듈: ModuleA
public class Animal {
public func bark() {
print("으르렁")
}
}
// 모듈: ModuleB
class Cat: Animal { // Error: 외부모듈에서 서브클래싱 X
override open func bark() { // Error: 외부모듈에서 오버라이딩 X
print("야옹")
}
}
- internal: 같은 모듈 내에서는 어디서든지 접근 가능하지만, 외부 모듈에선 접근 불가능
// 모듈: ModuleA
internal class Animal {
internal func bark() {
print("으르렁")
}
}
// 모듈: ModuleB
let animal = Animal() // Error: 외부 모듈에선 접근 불가능
animal.bark()
- fileprivate: private 수준이지만 같은 파일 내에서는 접근이 가능
- private: 가장 낮은 수준의 접근 제어자. 해당 요소가 선언된 블록 내에서만 사용할 수 있음.
// 모듈: ModuleA, 파일: Animal.swift
class Dog {
private func bark() {
print("멍멍")
}
}
class Cat {
fileprivate func bark() {
print("야옹")
}
}
// 모듈: ModuleA, 파일: Zoo.swift
class Zoo {
let dog = Dog()
let cat = Cat()
func sound() {
dog.bark() // Error: private 은 정의된 블록에서만
cat.bark() // Error: fileprivate은 같은 파일에서만
}
}
6. package 접근 제어자 (New)
package: 같은 패키지 내에선 접근 가능
새로 생긴 접근제어자라 예시를 들어 설명해보겠습니다.
플레이어를 재생시키는 건 플레이어화면에서만 가능합니다.
package 접근제어자가 없다면 다른 모듈에서 사용하기 위해 public 접근 제어자를 썼을겁니다. 하지만 public 은 모든 모듈에서 접근 가능하기 때문에 원하지 않는 모듈에서 접근해 안티 패턴이 될 수 있습니다.
구조를 보니 같은 패키지끼리는 접근가능하지만 다른 패키지에선 접근하지 못하게 하면 되지 않을까?
그래서 나온게 package 접근제어자 입니다.
모듈을 빌드할때 새로운 플래그 -package-name가 전달됩니다.
swiftc -module-name App -package-name appPkg ...
swiftc -module-name Player -package-name featurePkg ...
swiftc -module-name Present -package-name featurePkg ...
모듈 빌드가 완료되면, App모듈은 appPkg로 기록되고, player present 모듈은 featurePkg로 기록됩니다.
따라서 패키지 명이 다르기 때문에 App 모듈에서 package 접근제어자에 접근이 불가능해집니다.
'iOS' 카테고리의 다른 글
캐시 데이터 용량 표시 방식 개선하기: ByteFormatter (0) | 2024.07.29 |
---|---|
GCD 공식문서 읽고 정리하기 (0) | 2024.07.26 |
Swift 메모리 관점에서의 Image (4) | 2024.06.18 |
모듈화란? with Tuist (2) | 2024.06.03 |
SwiftData 알아보기 (1) | 2024.05.24 |