Notice
Recent Posts
Recent Comments
Link
大器晩成
싱글톤패턴 (Singleton Pattern) 본문
싱글톤 패턴은 앱 개발에서 특정 클래스나 구조체의 단일 인스턴스만을 생성하고, 이를 전역적으로 공유하기 위해 사용되는 디자인 패턴입니다. (특정한 유일한 데이터/관리 객체가 필요한 경우 사용) -> 유일하게 1개만 존재하는 객체입니다.
// 구현 방법
class 객체명 {
static let 변수명 = 객체명()
private init() {}
}
class Singleton {
// 타입 프로퍼티(전역변수)로 선언
static let shared = Singleton() // 자신의 객체를 생성해서 전역변수에 할당
var userInfoId = 12345
private init() {} // 해당 코드가 없을 경우 새로운 객체를 생성하는 것도 가능
}
Singleton.shared // 메모리에 올라가는 시점
let object = Singleton.shared
object.userInfoId = 1234567
Singleton.shared.userInfoId // 1234567로 변경
let object2 = Singleton.shared // 유일한 객체를 가르키는 것일뿐
object2.userInfoId //1234567
Singleton.shared.userInfoId
// 그렇지만 아래와 같은 것도 가능 ===> 새로운 객체를 생성한 것임
//let object3 = Singleton()
//object3.userInfoId
// 하지만 private init() 설정으로 새로운 객체 추가적 생성이 불가하게 막는 것이 싱글톤 패턴입니다
- 앱을 실행하는 동안, (데이터 공유 등) 유일하게 1개만 필요로 하는 객체일 때 사용합니다.
- 한 번 생성이 되면, 앱이 종료할 때까지 1개의 객체로써 메모리에 상주합니다.
(다만, 실제 static변수로 선언된 것은 접근 시에만 지연(lazy) 속성처럼 동작합니다) - 외부에서, 또 다른 새로운 객체 생성을 금지하고 싶은 경우 private init()으로 방지합니다.
클래스 기반 싱글톤
class SingletonClass {
// 싱글톤 인스턴스 (static)
static let shared = SingletonClass()
// private 초기화 방지
private init() {
print("SingletonClass initialized")
}
// 예제 메서드
func doSomething() {
print("Doing something in SingletonClass")
}
}
// 사용 예
SingletonClass.shared.doSomething()
// 출력: "Doing something in SingletonClass"
- static let shared는 클래스의 전역적인 단일 인스턴스를 제공합니다.
- private init()는 외부에서 새로운 인스턴스 생성을 막아줍니다.
- shared를 통해 항상 동일한 인스턴스를 사용합니다.
구조체 기반 싱클톤
- 구조체는 값 타입이라서 기본적으로 복사(copy)가 이루어지지만, static 속성을 사용해 싱글톤처럼 구현할 수 있습니다.
struct SingletonStruct {
// 싱글톤 인스턴스 (static)
static let shared = SingletonStruct()
// private 초기화 방지 (구조체는 기본적으로 public initializer를 제공하므로 명시적으로 막아야 함)
private init() {
print("SingletonStruct initialized")
}
// 예제 메서드
func doSomething() {
print("Doing something in SingletonStruct")
}
}
// 사용 예
SingletonStruct.shared.doSomething()
// 출력: "Doing something in SingletonStruct"
- static let shared를 통해 단일 인스턴스를 제공합니다.
- private init()로 구조체의 외부 생성자를 방지합니다.
- 구조체의 싱글톤은 주로 상태를 변경하지 않는 읽기 전용 용도로 사용됩니다.
- 구조체는 값 타입이므로, let으로 선언하면 인스턴스 자체가 불변(immutable)으로 취급됩니다.
- 구조체의 값을 변경하고 싶다면, var로 선언하거나 mutating 메서드를 사용해야 합니다.
실제 사용 예시
// 앱을 실행하는 동안, 하나의 유일한 객체만 생성되어서, 해당 부분을 관리
let screen = UIScreen.main // 화면
let userDefaults = UserDefaults.standard // 한번생성된 후, 계속 메모리에 남음!!!
let application = UIApplication.shared // 앱
let fileManager = FileManager.default // 파일
let notification = NotificationCenter.default // 노티피케이션(특정 상황, 시점을 알려줌)
클래스와 구조체 싱글톤 패턴의 차이
클래스(class)
- let으로 선언하더라도 내부 프로퍼티는 변경 가능합니다.
- 참조는 고정되지만, 참조하는 객체의 속성 값은 수정 가능합니다.
구조체(struct)
- let으로 선언하면 내부 프로퍼티도 절대 변경 불가합니다.
- 변경하려면 var로 선언하거나, mutating 키워드를 사용해야 합니다.
728x90
'iOS > Swift 문법' 카테고리의 다른 글
클래스의 상속 (Inheritance) (0) | 2024.11.25 |
---|---|
구조체와 클래스(let, var) 참고자료 (0) | 2024.11.25 |
접근 제어 (Access Control) (0) | 2024.11.25 |
서브 스크립트(Subscripts) (0) | 2024.11.25 |
타입 메서드 (0) | 2024.11.25 |