본문 바로가기
개린이 이야기

SingleTon(싱글톤)에 관하여

by iOS 개린이 2023. 2. 3.

싱글톤 패턴

-Class가 인스턴스를 하나만 가지도록 제한하면서 언제 어디서든 인스턴스에 접근할 수 있도록 하는 디자인 패턴이다.

-특정 기능을 수행하는 객체 하나를 생성하여, 공용으로 사용할 때 사용된다.

 

 

싱글톤 구현 방법

 

1. 싱글톤 클래스가 메모리에 처음으로 올라갈 때, 한 번만 초기화되는 타입 인스턴스를 정의한다.

class Singleton {
    static let shared = Singleton()
}

 

언제 어디서든 접근하기 위해 static 키워드를 통해 타입 프로퍼티를 만들고 인스턴스를 정의한다.

 

 

2. 클래스의 기본 이니셜라이저 메소드를 private으로 제한한다.

class Singleton {
    static let shared = Singleton()
    
    private init() { }
}

 

-정의에서 인스턴스를 하나만 가지도록 제한한다고 했는데, private 접근제어 키워드를 통해 init 메소드를 정의해준다.

이는 또 다른 곳에서 init 메소드를 통해 새로운 인스턴스를 생성하는 것을 막기 위함이다. 

(새로운 인스턴스를 만들어 초기화하면 유일성에 어긋나기에 싱글톤 패턴 사용할 이유가 없음.)

 

 

3. 특정 기능을 수행하는 코드를 작성하고 사용한다.

 

class Singleton {
    static let shared = Singleton()
 
    private init() { }
    
    func hello() {
        print("hello")
    }
}

Singleton.shared.hello()

 

언제 어디서든 Singleton의 shared 프로퍼티를 통해 접근할 수 있다.

 

 

싱글톤의 장점

1. 하나의 정보를 가지고, 전역에서 액세스가 가능하기에 정보 공유나 정보를 관리하는 것이 쉽다.

2. 인스턴스가 한 번만 생성됨으로 메모리를 절약할 수 있다.

3. 다시 메모리를 할당하고, 초기화하는 과정이 줄어들기에 매번 객체를 만드는 것보다 효율적이다.

3. 일관성이 있어, 공통된 객체를 여러개 사용해야하는 상황에서 유용하다.

 

싱글톤의 단점

1. 싱글톤 인스턴스가 너무 많은 작업을 하거나, 많은 데이터를 공유할 때 클래스 간의 결합도가 높아져서

객체지향 설계 원칙인 "개방 = 폐쇄" 원칙을 위배한다.

2. 인스턴스가 하나만 존재한다고 가정하기 때문에 설계에 융통성이 없어질 수 있다. 또한 서브클래싱이 어려워짐.

3. 인스턴스를 하나로 생성을 제한하기 때문에 테스트용 객체를 만드는 것이 어렵다. 테스트 코드가 중요한 상황에서는 매우 큰 단점으로 작용할 수 있다.

4. 멀티스레드 환경에서 싱글톤 객체가 여러 개 생기는 문제가 발생할 수 있다. (Thread-Safe 하지 않음.)

싱글톤 객체 내부를 동기적으로 처리하지 않으면, 여러 곳에서 싱글톤 객체를 같이 사용하다가 꼬여버릴 수 있다.

 

 

싱글톤의 주의점

-싱글톤 객체를 만들 때 동시성에 주의하여 설계하고, 객체의 역할을 최소화 시켜 가볍게 유지한다.

 

 

 

Swift에서의 싱글톤

-싱글톤의 단점 중에 멀티 스레드 환경에서 객체가 여러 개 생겨 Thread-Safe 하지 않은 상황이 생길 수 있다고 했다.

그래서 Object-c에서는 dispatch_once 라는 것을 사용하여 싱글톤 객체가 사용시점에 한번만 생성될 수 있도록 만든다.

하지만 Swift에서는 dispatch_once 같은 작업을 하지 않아도, static 키워드의 특성으로 인해 효과를 얻을 수 있다.

 

static의 특성은 객체가 직접 불려지기 전까지 가만히 있다가 불려지는 시점에 초기화되는 지연생성((lazy))이다.

따라서 dispatch_once 작업이 필요없고 Thread-Safe 한 작업이 된다.

 

 

---

"The lazy initializer for a global variable (also for static members of structs and enums) is run the first time that global is accessed, and is launched as dispatch_once to make sure that the initialization is atomic. This enables a cool way to use dispatch_once in your code: just"

---

 

 

 

Reference

 

-https://medium.com/hcleedev/swift-singleton-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4-b84cfe57c541

-https://babbab2.tistory.com/66

-https://medium.com/@jang.wangsu/swfit-thread-safety-%ED%95%9C-%EC%8B%B1%EA%B8%80%ED%86%A4-%EC%82%AC%EC%9A%A9%EC%9D%80-75c43e567acf

'개린이 이야기' 카테고리의 다른 글

Kingfisher 라이브러리에 관하여  (0) 2023.05.28
디자인 패턴 - MVC 패턴에 관하여  (0) 2023.04.04
Infinite Carousel 구현  (0) 2023.01.21
Custom Splash 화면  (0) 2023.01.17
Google AdMob(애드몹)에 관하여  (0) 2023.01.15