大器晩成

싱글톤패턴 (Singleton Pattern) 본문

iOS/Swift 문법

싱글톤패턴 (Singleton Pattern)

zerobugpark 2024. 11. 25. 14:34

 

싱글톤 패턴은 앱 개발에서 특정 클래스나 구조체의 단일 인스턴스만을 생성하고, 이를 전역적으로 공유하기 위해 사용되는 디자인 패턴입니다. (특정한 유일한 데이터/관리 객체가 필요한 경우 사용) -> 유일하게 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