접근 제한자(access control)
💡 접근 제한자(access control)
- 코드 내의 속성, 메서드, 클래스 또는 다른 유형의 멤버에 대한 외부 접근을 제어하는 데 사용됨
- 접근 제한자는 코드의 모듈성을 높이고 보안을 강화하며 코드를 더 명확하게 만드는 데 도움이 됨
- 상위 요소보다 하위 요소가 더 높은 접근 수준을 가질 수 없음
접근 제한자 종류
open(개방 접근 수준)
- 다른 모듈에서 해당 클래스를 상속하거나 재정의할 수 있음
- 클래스와 클래스의 멤버에서만 사용 가능
open class Vehicle {
open func startEngine() {
print("Engine started")
}
}
open class Car: Vehicle {
open var carType: String = "Sedan"
}
public(공개 접근 수준)
- 주로 프레임워크에서 외부와 연결된 인터페이스를 구현할 때 사용
- 일반적으로 사용하는 swift의 기본요소는 모두 public(공개 접근 수준)으로 구현되어 있음
- 다른 모듈에서 사용 가능하며, 해당 모듈 내에서도 액세스할 수 있음
→ 상속이나 재정의는 제한되지만 일반적으로 모든 속성과 메서드가 외부에서 사용될 수 있음
public struct Point {
public var x: Int
public var y: Int
public init(x: Int, y: Int) {
self.x = x
self.y = y
}
public mutating func moveByX(_ deltaX: Int, y deltaY: Int) {
self.x += deltaX
self.y += deltaY
}
}
internal(내부 접근 수준)
- 기본적으로 Swift의 접근 수준이며, 같은 모듈 내에서만 액세스할 수 있음
→ 다른 모듈에서는 사용할 수 없음
internal class InternalClass {
internal var internalProperty: Int = 10
internal func doSomethingInternally() {
print("Internal operation performed")
}
}
internal let internalConstant = 20
fileprivate(파일 외부 비공개 접근수준)
- 같은 파일 내에서만 액세스할 수 있음
→ 클래스의 구현 세부 정보를 숨기고 다른 코드에 영향을 미치지 않도록 하는 데 사용됨
class OuterClass {
fileprivate var outerVariable = 30
fileprivate func outerFunction() {
print("Outer function called")
}
fileprivate class InnerClass {
fileprivate func innerFunction() {
print("Inner function called")
}
}
}
private(비공개 접근 수준)
- 가장 제한적인 접근 수준으로, 해당 멤버가 선언된 범위 내에서만 액세스할 수 있음
class MyClass {
private var privateVariable = 40
private func privateFunction() {
print("Private function called")
}
}
접근 제한자 종류 표
접근 수준 | 상속 및 재정의 허용 |
모듈 내 액세스 | 외부 모듈 액세스 | 설명 | 사용 예시 |
open | 허용 | 가능 | 가능 | 다른 모듈에서 해당 클래스를 상속하거나 재정의할 수 있음 | 외부 프레임워크나 라이브러리의 기본 클래스 확장 |
public | 제한됨 | 가능 | 가능 | 다른 모듈에서 사용 가능하며, 해당 모듈 내에서도 액세스할 수 있음. 상속이나 재정의는 제한됨 | 모듈의 API를 정의할 때 사용 |
internal | 제한됨 | 가능 | 불가능 | 같은 모듈 내에서만 액세스 가능 | 기본적으로 Swift의 접근 수준, 모듈 내에서만 사용되는 구현 세부 정보 |
fileprivate | 제한됨 | 가능 | 불가능 | 같은 파일 내에서만 액세스 가능 | 클래스의 구현 세부 정보를 숨기고 다른 코드에 영향을 미치지 않도록 하는 데 사용됨 |
private | 제한됨 | 가능 | 불가능 | 해당 멤버가 선언된 범위 내에서만 액세스 가능 | 클래스의 세부 구현을 보호하고 클래스 외부의 코드에 영향을 제한하는 데 사용됨 |
open(개방 접근 수준)와 public(공개 접근 수준)의 차이점
구분 | open(개방 접근 수준) | public(공개 접근 수준) |
상속 및 재정의 | 다른 모듈에서 클래스를 상속하고 재정의 가능 | 다른 모듈에서 클래스 상속 및 재정의 제한 |
모듈 내 액세스 | 가능 | 가능 |
외부 모듈 액세스 | 가능 | 가능 |
사용 예시 | 외부 프레임워크나 라이브러리의 기본 클래스 확장 | 모듈의 API를 정의할 때 사용 |
은닉 정도
[제약 적음] open < public < internal < fileprivate < private [제약 많음]
※ 접근 제한자를 작성하지 않을 경우 internal로 판단
접근수준 | 키워드 | 접근도 | 범위 | - |
개방 접근수준 | open | 높음 ▲ | | | ▼ 낮음 |
모듈 외부 | 클래스에서만 사용 |
공개 접근수준 | public | 모듈 외부 | ||
내부 접근수준 | internal | 모듈 내부 | ||
파일 외부 비공개 접근수준 | fileprivate | 파일 내부 | ||
비공개 접근수준 | private | 기능 정의 내부 |
은닉 정도 표 출처: https://co-dong.tistory.com/17
' 𝗔𝗣𝗣𝗟𝗘 > SWIFT : GRAMMAR' 카테고리의 다른 글
Swift 기초 문법 - 고차함수(higher-order function) (0) | 2024.03.13 |
---|---|
Swift 기초 문법 - 클로저(Closure) (0) | 2024.03.13 |
Swift 기초 문법 - 타입 캐스팅(Type Casting) (0) | 2024.03.12 |
Swift 기초 문법 - 프로퍼티 옵저버 (0) | 2024.03.12 |
Swift 기초 문법 - 초기화(Initialization) (0) | 2024.03.11 |