접근 제어(Access Control)
- 접근 제어는 코드의 접근 가능 범위를 설정하여 외부에서 사용 가능한 범위를 제한하는 기능이다
- 외부 객체가 특정 기능이나 속성에 접근하는 것을 막아, 데이터 보호 및 캡슐화(Encapsulation) 를 강화한다
접근 제어의 종류
| 접근 수준 | 설명 | 사용 가능 위치 |
|---|
open | 모듈 외부에서 상속 및 접근 가능(클래스, 메서드만 해당) | 프레임워크 또는 라이브러리에서 사용 |
public | 모듈 외부에서 접근 가능, 상속 및 재정의 불가 | 공개된 API 또는 라이브러리 기능 |
internal | 동일 모듈 내에서 접근 가능(기본 접근 수준) | 일반적인 앱 개발에서 사용 |
fileprivate | 동일 파일 내에서만 접근 가능 | 파일 단위로 캡슐화할 때 사용 |
private | 동일 선언 내에서만 접근 가능(클래스, 구조체 내부) | 특정 타입 내부에서만 사용 가능 |
사용법 예시
class Example {
private var privateVar = 0
fileprivate var fileVar = 1
internal var internalVar = 2
public var publicVar = 3
open var openVar = 4
}
싱글톤 패턴(Singleton Pattern)
- 싱글톤 패턴은 앱 전체에서 단 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴이다
- 특정 데이터나 설정을 앱 전역에서 공유할 필요가 있을 때 사용한다
- 인스턴스가 여러 개 생기는 것을 막고, 하나의 인스턴스를 전역에서 접근할 수 있게 만든다
싱글톤 패턴의 특징
- 유일한 인스턴스: 클래스의 인스턴스를 하나만 만들고, 전역에서 공유할 수 있다
- 전역 접근: 인스턴스를 전역에서 접근할 수 있도록 한다 (
ClassName.shared 같은 방식)
- 메모리 효율: 메모리에 하나의 인스턴스만 올라가므로 메모리 사용을 절약할 수 있다
private init() 사용: 외부에서 새로운 인스턴스를 생성하지 못하게 방지한다
싱글톤 패턴 구현 방법
예: AppSetting(앱 설정) 클래스
class AppSettings {
static let shared = AppSettings()
private init() {}
var volumeLevel: Int = 5
var darkModeEnabled: Bool = false
func resetToDefaults() {
volumeLevel = 5
darkModeEnabled = false
print("설정이 초기값으로 되돌아갔습니다.")
}
}
싱글톤 패턴 사용 예시(앱 설정)
let settings = AppSettings.shared
settings.volumeLevel = 7
settings.darkModeEnabled = true
print("볼륨 수준: \(settings.volumeLevel)")
print("다크 모드 사용: \(settings.darkModeEnabled)")
settings.resetToDefaults()
싱글톤 패턴 구현 방식 설명
static let shared 선언:
- 클래스의 인스턴스를 전역 변수로 선언한다
static 이기 때문에 클래스의 모든 인스턴스가 공유한다
private init() 생성자:
- 클래스 외부에서 새로운 인스턴스를 생성하지 못하도록 방지한다
- 다른 곳에서
AppSettings() 를 사용해서 인스턴스를 만들 수 없게 한다
- 전역에서 접근 가능:
AppSettings.shared 형태로 접근하여 인스턴스에 접근할 수 있다
- 모든 코드에서 같은 인스턴스를 공유하므로 데이터를 일관되게 유지할 수 있다
싱글톤 패턴의 활용 예시(UIKit의 싱글톤 클래스들)
UIApplication.shared – 앱 전체의 설정 및 상태를 관리하는 객체
UIScreen.main – 디바이스 화면의 정보에 접근하기 위한 객체
UserDefaults.standard – 앱의 사용자 설정을 저장하고 관리하는 객체
FileManager.default – 파일과 디렉터리를 관리하는 객체
NotificationCenter.default – 알림(Notification)을 관리하는 객체
싱글톤 패턴의 장 · 단점
장점
- 인스턴스가 하나로 유지되므로 메모리 낭비를 줄일 수 있다
- 전역에서 접근 가능하여 데이터 관리가 용이하다
- 앱 전역 설정, 캐시 데이터, 로그 시스템 등에 유용하다
단점
- 전역 상태를 공유하므로, 지나치게 사용하면 코드의 의존성이 증가할 수 있다
- 멀티스레드 환경에서 동기화 문제를 유발할 수 있다 (Swift에서는 안전하게 처리된다)
싱글톤 패턴 선언 시 주의사항
private init() 반드시 사용: 외부에서 인스턴스를 새로 생성하지 못하도록 제한한다
- 싱글톤 인스턴스는 기본적으로
lazy 하게 초기화된다 (첫 사용 시 초기화됨)
- Thread-Safe: Swift의
static let 선언은 자동으로 스레드 안전(Thread-Safe)하게 보장된다
요약
- 싱글톤 패턴: 앱 전역에서 하나의 인스턴스만 존재하도록 보장하는 패턴
- 구현 방법:
static let + private init()
- 활용 예: 설정 관리, 로그 시스템, 데이터 캐시, 네트워크 관리자 등