TIL: (참고) 접근 제어(Access Control) / 싱글톤 패턴(Singleton Pattern)

Royce·2025년 3월 22일

Swift 문법

목록 보기
32/63

접근 제어(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)

  • 싱글톤 패턴은 앱 전체에서 단 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴이다
  • 특정 데이터나 설정을 앱 전역에서 공유할 필요가 있을 때 사용한다
  • 인스턴스가 여러 개 생기는 것을 막고, 하나의 인스턴스를 전역에서 접근할 수 있게 만든다

싱글톤 패턴의 특징

  1. 유일한 인스턴스: 클래스의 인스턴스를 하나만 만들고, 전역에서 공유할 수 있다
  2. 전역 접근: 인스턴스를 전역에서 접근할 수 있도록 한다 (ClassName.shared 같은 방식)
  3. 메모리 효율: 메모리에 하나의 인스턴스만 올라가므로 메모리 사용을 절약할 수 있다
  4. private init() 사용: 외부에서 새로운 인스턴스를 생성하지 못하게 방지한다

싱글톤 패턴 구현 방법

예: AppSetting(앱 설정) 클래스

class AppSettings {
    static let shared = AppSettings()  // 유일한 인스턴스 생성
    
    private init() {}  // 외부에서 생성하지 못하도록 방지 (접근 제어: private)
    
    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)")        // 출력: 볼륨 수준: 7
print("다크 모드 사용: \(settings.darkModeEnabled)") // 출력: 다크 모드 사용: true

// 설정 초기화 메서드 호출
settings.resetToDefaults()

싱글톤 패턴 구현 방식 설명

  1. static let shared 선언:
    • 클래스의 인스턴스를 전역 변수로 선언한다
    • static 이기 때문에 클래스의 모든 인스턴스가 공유한다
  2. private init() 생성자:
    • 클래스 외부에서 새로운 인스턴스를 생성하지 못하도록 방지한다
    • 다른 곳에서 AppSettings() 를 사용해서 인스턴스를 만들 수 없게 한다
  3. 전역에서 접근 가능:
    • AppSettings.shared 형태로 접근하여 인스턴스에 접근할 수 있다
    • 모든 코드에서 같은 인스턴스를 공유하므로 데이터를 일관되게 유지할 수 있다

싱글톤 패턴의 활용 예시(UIKit의 싱글톤 클래스들)

  1. UIApplication.shared – 앱 전체의 설정 및 상태를 관리하는 객체
  2. UIScreen.main – 디바이스 화면의 정보에 접근하기 위한 객체
  3. UserDefaults.standard – 앱의 사용자 설정을 저장하고 관리하는 객체
  4. FileManager.default – 파일과 디렉터리를 관리하는 객체
  5. NotificationCenter.default – 알림(Notification)을 관리하는 객체

싱글톤 패턴의 장 · 단점

장점

  • 인스턴스가 하나로 유지되므로 메모리 낭비를 줄일 수 있다
  • 전역에서 접근 가능하여 데이터 관리가 용이하다
  • 앱 전역 설정, 캐시 데이터, 로그 시스템 등에 유용하다

단점

  • 전역 상태를 공유하므로, 지나치게 사용하면 코드의 의존성이 증가할 수 있다
  • 멀티스레드 환경에서 동기화 문제를 유발할 수 있다 (Swift에서는 안전하게 처리된다)

싱글톤 패턴 선언 시 주의사항

  1. private init() 반드시 사용: 외부에서 인스턴스를 새로 생성하지 못하도록 제한한다
  2. 싱글톤 인스턴스는 기본적으로 lazy 하게 초기화된다 (첫 사용 시 초기화됨)
  3. Thread-Safe: Swift의 static let 선언은 자동으로 스레드 안전(Thread-Safe)하게 보장된다

요약

  • 싱글톤 패턴: 앱 전역에서 하나의 인스턴스만 존재하도록 보장하는 패턴
  • 구현 방법: static let + private init()
  • 활용 예: 설정 관리, 로그 시스템, 데이터 캐시, 네트워크 관리자 등
profile
iOS 개발자 지망생

0개의 댓글