본문 바로가기

정보

디자인 패턴 - 싱글톤 패턴

https://explorer89.tistory.com/20

 

 

1. 싱글톤 패턴이란?

 싱글톤 패턴은 오직 하나의 객체(인스턴스)만 생성되도록 보장하는 디자인 패턴입니다.

이 패턴을 사용하면 같은 객체에 여러 곳에서 접근할 수 있습니다. 

 

2. 왜 싱글톤 패턴을 사용할까?

 앱이나 프로그램에서 공유된 데이터공통 기능이 필요할 때 사용합니다.

여러 인스턴스가 생기면 데이터가 일관되지 않을 수 있기에, 하나의 인스턴스만 유지하게 해줍니다.

 

3. 싱글톤 패턴의 예시: TV 리모컨

TV 리모컨을 생각해보면, 

  • 리모컨으로 채널을 변경 또는 볼륨을 조절할 수 있습니다. 
  • 리모컨이 여러 개 있다면? TV 채널이나 볼륨 조절이 엉망이 될 수 있습니다. 
  • 따라서 하나의 리모컨 (= 싱글톤 객체) 만 사용하여 TV를 제어합니다. 

 

4. 싱글톤 패턴의 장점

  • 객체가 하나만 존재하기 때문에 메모리 낭비를 줄일 수 있습니다. 
  • 어디서든 같은 인스턴스를 사용할 수 있기에 데이터 일관성이 유지됩니다. 
  • 전역에서 접근하기 쉽습니다. 

 

5. 싱글톤 패턴의 단점

  • 전역 접근이 쉽기 때문에 객체가 여러 곳에서 사용하기에 코드가 복잡해질 수 있습니다. 
  • 테스트하기 어렵습니다. 싱글톤 객체가 계속 유지 되기 때문에, 초기화에 어려움이 있습니다. 
  • 멀티스레드 환경에서는 동기화 문제가 생길 수도 있습니다. 

🔥 멀티스레드 환경에서 동기화 문제여러 스레드가 동시에 싱글톤 객체를 생성하려고 할 때 발생하는 문제예요.
Swift에서는 static let을 사용하면 스레드 세이프하게 싱글톤을 구현할 수 있으므로 이런 문제를 쉽게 해결할 수 있어요.🔥

6. 단점에 대한 개선점

  • 의존성 주입 (DI, Dependency Injection)을 사용하면 객체의 의존성을 줄이고, 테스트하기 쉬워집니다. 
  • 스레드 세이프하게 구현하는 방법을 사용해서 멀티스레드 문제를 해결할 수 있습니다. 

 

7.  싱글톤 패턴이 주로 사용되는 경우 

 

  • 설정 관리: 앱의 공통 설정 정보를 저장하고 읽어올 때
  • 네트워크 관리: 네트워크 연결이나 API 요청을 한 곳에서 관리할 때
  • 로그 관리: 디버깅 정보를 기록하는 로그 시스템
  • 데이터 캐싱: 자주 사용되는 데이터를 저장하고 재사용할 때
  • 리소스 관리: 데이터베이스 연결, 파일 시스템 접근 등

 

8. 싱글톤 패턴과 비교되는 다른 디자인 패턴 

 

  • 팩토리 패턴(Factory Pattern): 객체를 만들 때마다 다른 인스턴스를 반환합니다.
  • 의존성 주입(DI): 싱글톤 객체를 주입해주지만 테스트하기 더 쉽고 유연합니다.

 

9. 간단한 예제: TV 리모컨 

class TVRemote {
    static let shared = TVRemote() // 단 하나의 인스턴스
    
    private init() {} // 다른 곳에서 인스턴스를 생성하지 못하게
    
    private var channel: Int = 1
    private var volume: Int = 10
    
    func changeChannel(to newChannel: Int) {
        channel = newChannel
        print("채널이 \(channel)번으로 변경되었습니다.")
    }
    
    func adjustVolume(to newVolume: Int) {
        volume = newVolume
        print("볼륨이 \(volume)으로 조절되었습니다.")
    }
}

// 사용 예시
let remote1 = TVRemote.shared
remote1.changeChannel(to: 5)
remote1.adjustVolume(to: 15)

let remote2 = TVRemote.shared
remote2.changeChannel(to: 10)  // 다른 객체처럼 보여도 같은 인스턴스임!

// 출력
채널이 5번으로 변경되었습니다.
볼륨이 15으로 조절되었습니다.
채널이 10번으로 변경되었습니다.

 

 

 

10. 주의해야할 상황 

 

  • 전역 상태 관리 주의: 싱글톤을 많이 사용하면 코드의 의존성이 높아져서 유지보수하기 어려워질 수 있습니다
  • 멀티스레드 문제: 여러 스레드가 동시에 접근하면 문제가 생길 수 있으니 static let을 사용하면 안전합니다.
  • 테스트하기 어려움: 싱글톤 객체는 앱 전체에서 하나만 존재해서 단위 테스트를 할 때 격리하기 어렵습니다.

 

11. 정리

  • 싱글톤 패턴은 하나의 객체만 만들어서 여러 곳에서 공유해야 할 때 사용합니다.
  • TV 리모컨처럼 공통된 상태나 동작을 제어할 때 유용합니다.
  • 하지만 너무 많이 사용하면 코드가 복잡해질 수 있으니 필요한 경우에만 사용해야 합니다.

 

'정보' 카테고리의 다른 글

performAction<T: Animal>, animal: Animal 차이?  (0) 2024.12.18
SOLID 원칙이란?  (0) 2024.12.17
Hashable과 Equatable은 밀접한 관계  (0) 2024.12.16
해시란? Hash, Hashable  (1) 2024.12.15
Static Dispatch vs Dynamic Dispatch  (1) 2024.12.13