Jupyo's Daily Story
접근제어(Access Control) 본문
728x90
반응형
접근 제어(Access Control)는 코드 내에서 특정 클래스, 구조체, 열거형, 프로퍼티, 메서드 등의 접근 범위를 정의하는 기능입니다.
이를 통해 외부에서 해당 코드에 접근할 수 있는 범위를 제한할 수 있어 코드의 안정성과 보안을 강화할 수 있습니다.
Swift에서는 총 5가지 접근 수준을 제공하며, 이를 이용해 접근 범위를 제어할 수 있습니다.
1. open
- 정의: 외부 모듈에서 접근이 가능하며, 해당 클래스나 멤버는 서브클래싱 및 오버라이딩이 가능합니다.
- 주요 사용처: 프레임워크나 라이브러리에서 외부에서 상속받거나 수정할 수 있도록 허용하고자 할 때
- 특징: open으로 정의된 클래스는 외부 모듈에서도 서브클래싱이 가능하며, 메서드는 오버라이딩할 수 있습니다.
open class Animal {
open func makeSound() {
print("Animal sound")
}
}
// 다른 모듈에서도 서브클래싱 가능
class Dog: Animal {
override func makeSound() {
print("Bark")
}
}
2. public
- 정의: 외부 모듈에서 접근 가능하지만, 서브클래싱 및 오버라이딩은 불가능합니다.
- 주요 사용처: 외부에서 사용하되, 상속이나 메서드 재정의는 허용하지 않으려 할 때
- 특징: public으로 정의된 클래스나 메서드는 외부에서 접근할 수 있지만, 서브클래싱이나 오버라이딩은 같은 모듈 내에서만 가능합니다.
public class Animal {
public func makeSound() {
print("Animal sound")
}
}
// 외부 모듈에서는 서브클래싱 불가
3. internal
- 정의: 같은 모듈 내에서만 접근 가능하며, 다른 모듈에서는 접근할 수 없습니다.
- 주요 사용처: 앱 또는 프레임워크 내부에서만 사용할 수 있고, 외부에서는 사용을 제한하고자 할 때
- 특징: 기본적으로 모든 요소는 internal입니다. 이를 통해 같은 모듈 내에서는 자유롭게 사용할 수 있지만, 외부 모듈에서는 접근할 수 없습니다.
fileprivate class Animal {
func makeSound() {
print("Animal sound")
}
}
// 같은 파일 내에서만 사용 가능
4. fileprivate
- 정의: 동일한 파일 내에서만 접근 가능
- 주요 사용처: 한 파일 내에서만 접근을 허용하고자 할 때, 클래스의 세부 구현을 숨기고 싶을 때 사용됩니다.
- 특징: fileprivate로 선언된 멤버는 같은 파일 내의 다른 클래스나 구조체에서도 접근할 수 있지만, 파일을 벗어나면 접근할 수 없습니다.
fileprivate class Animal {
func makeSound() {
print("Animal sound")
}
}
// 같은 파일 내에서만 사용 가능
5. private
- 정의: 동일한 정의 범위(클래스, 구조체) 내에서만 접근 가능하며, 같은 파일 내의 다른 클래스나 구조체에서도 접근할 수 없습니다.
- 주요 사용처: 특정 클래스 또는 구조체 내부에서만 사용할 수 있도록 하여, 외부에서의 접근을 완전히 차단하고자 할 때
- 특징: private로 선언된 멤버는 오직 해당 클래스 또는 구조체 내에서만 접근 가능합니다.
class Animal {
private func makeSound() {
print("Animal sound")
}
}
let animal = Animal()
// animal.makeSound() // 오류 발생, private 접근 불가
요약
- open: 외부에서 서브클래싱 및 오버라이딩 가능
- public: 외부에서 접근 가능, 서브클래싱 및 오버라이딩은 불가
- internal: 같은 모듈 내에서만 접근 가능 (기본 접근 수준)
- fileprivate: 같은 파일 내에서만 접근 가능
- private: 같은 클래스 또는 구조체 내부에서만 접근 가능
접근 제어는 코드의 사용 범위를 명확히 정의하고, 외부에서 불필요한 수정이나 접근을 방지하는 데 중요한 역할을 합니다.
반응형
'Swift' 카테고리의 다른 글
백그라운드 Playback (0) | 2024.02.20 |
---|---|
lazy (2) | 2022.11.24 |
final (0) | 2022.11.24 |
포맷 지정자 (0) | 2022.11.18 |
[문자열] 이메일 검증하기 (0) | 2022.11.17 |