[[0822 focusgo 분석하기]]에서 나온 첫 질문.
@StateObject private var studySession = StudySession.shared - 여기서 .shared 라고 쓰여 있는 부분이 바로 싱글톤(Singleton) 인스턴스 패턴이다.
싱글톤 패턴이란?
- 앱 전체에서 단 하나의 인스턴스만 존재하도록 보장하는 [[디자인 패턴]]
- 즉, StudySession 객체를 여러 뷰에서 만들어도 항상 똑같은 하나의 인스턴스만 쓰게끔 강제하는 구조.
- Swift에서는 보통 static let shared = StudySession() 이렇게 구현한다.
왜 쓰는가?
- 전역 상태 공유: 앱에서 "공부 시간"이라는 데이터를 메뉴바, 메인 화면, 알림 등 여러 뷰에서 동시에 사용해야 한다면, 각각 새로운 인스턴스를 만들면 데이터가 따로 논다. 하지만 싱글톤으로 만들면 어느 뷰에서 바꿔도 앱 전체가 같은 값을 본다.
- 메모리 낭비 방지: 딱 하나만 만들고 계속 쓰니까 불필요하게 여러 개 만들 필요가 없다.
- 접근 편의성: StudySession.shared 이렇게 어디서든 접근 가능
class StudySession: ObservableObject { static let shared = StudySession() // 싱글톤 인스턴스 만들기 @Published var hideIcon: Bool = false @Published var customText: String = "" @Published var currentSubject: String? @Published var currentSessionTime: String = "0m" private init() { } // 외부에서 new 못하게 막음 } - 이렇게 하면 StudySession()을 직접 init 못 하고, 항상 StudySession.shared를 써야 한다.
지금 코드에서의 의미
- @StateObject private var studySession = StudySession.shared -> 이는 앱 전체에서 단 하나뿐인 공부 세션 상태를 MenuBarTimerView에서 구독하는 것