접근 제어는 코드의 구성 요소(클래스, 구조체, 함수, 변수 등)에 대한 외부 접근을 제어하는 기능입니다.
다른 모듈이나 타입에서 특정 속성이나 메서드에 접근하는 것을 제한함으로써 코드의 캡슐화(encapsulation)를 유지하고, 의도치 않은 사용을 방지할 수 있습니다.
Swift는 접근 제어를 위한 다섯 가지 수준을 제공합니다.
1. 접근 제어 수준
접근 수준 | 설명 |
---|---|
open |
모듈 외부에서 상속, 재정의 가능 (클래스 및 클래스 멤버 전용) |
public |
모듈 외부에서 사용 가능하지만, 상속이나 재정의는 불가능 |
internal |
동일 모듈 내에서만 사용 가능 (기본값) |
fileprivate |
같은 파일 내에서만 접근 가능 |
private |
같은 타입 내부에서만 접근 가능 |
Swift에서 접근 제어는 기본적으로 internal
입니다. 별도로 지정하지 않으면 같은 모듈 내에서만 접근이 가능합니다.
2. 예제: 기본 접근 제어
class BankAccount {
private var balance: Int = 0
func deposit(_ amount: Int) {
balance += amount
}
func currentBalance() -> Int {
return balance
}
}
let account = BankAccount()
// account.balance = 1000 // 오류: 'balance'는 private임
account.deposit(1000)
print(account.currentBalance()) // 1000
이 예제에서 balance
는 private
으로 선언되어 클래스 외부에서는 직접 접근할 수 없습니다.
이러한 방식은 데이터를 보호하고, 허용된 방식으로만 접근하도록 유도합니다.
3. fileprivate의 활용
fileprivate
은 같은 파일 내에서는 접근이 가능하지만, 다른 파일에서는 접근할 수 없습니다.
주로 확장(extension)과 함께 사용될 수 있습니다.
class Logger {
fileprivate func log(_ message: String) {
print("LOG: \(message)")
}
}
extension Logger {
func logInfo(_ text: String) {
log("INFO: \(text)")
}
}
log(_:)
는 같은 파일에 있는 extension
에서 접근할 수 있지만, 외부에서는 사용할 수 없습니다.
4. internal: 기본 접근 수준
Swift의 기본 접근 수준은 internal
입니다. 명시하지 않아도 동일 모듈 내에서 사용 가능합니다.
struct User {
var name = "익명"
}
위 구조체는 접근 제어자가 없지만, 컴파일러는 자동으로 internal
로 처리합니다.
즉, 같은 앱 또는 프레임워크 모듈 내에서만 접근 가능합니다.
5. public과 open의 차이
public
은 외부 모듈에서 사용할 수 있지만, 클래스나 메서드를 상속하거나 재정의할 수는 없습니다.
반면 open
은 외부 모듈에서도 상속과 재정의가 모두 가능합니다.
open class Animal {
open func sound() {
print("...")
}
}
public class Dog: Animal {
override func sound() {
print("멍멍")
}
}
이처럼 open
은 외부 확장을 허용해야 하는 라이브러리나 프레임워크에서 주로 사용됩니다.
6. 접근 제어와 캡슐화
접근 제어를 적절히 활용하면 내부 구현 세부 사항을 숨기고, 필요한 인터페이스만 외부에 노출할 수 있습니다.
이것은 객체 지향 프로그래밍의 핵심 개념 중 하나인 캡슐화(encapsulation)를 실현하는 데 필수적입니다.
마무리
접근 제어는 단순히 변수나 메서드의 노출 여부를 조절하는 것이 아니라, 코드의 안정성과 유지보수성을 향상시키는 중요한 수단입니다.private
부터 open
까지 각 수준의 의미를 정확히 이해하고, 설계 의도에 맞게 선택하여 사용하는 습관이 필요합니다.
불필요하게 공개된 멤버는 외부에서의 의도치 않은 사용으로 이어질 수 있으므로, 가능한 한 제한적인 접근을 기본으로 설정하는 것이 좋습니다.