[iOS 7주차] 싱글톤 패턴

황석범·2024년 12월 11일
0

내일배움캠프_iOS_5기

목록 보기
44/76

싱글톤 패턴(Singleton Pattern)

  • 싱글톤 패턴(Singleton Pattern)은 소프트웨어 디자인 패턴 중 하나로, 특정 클래스가 애플리케이션 내에서 단 하나의 인스턴스만 존재하도록 보장하는 패턴입니다. 이 인스턴스는 여러 곳에서 공통으로 사용되며, 인스턴스화가 한 번만 이루어지고 이후에는 그 인스턴스를 재사용합니다.

핵심 특징

1. 단 하나의 인스턴스: 싱글톤 패턴을 적용한 클래스는 애플리케이션에서 하나의 객체만 생성됩니다.

2. 글로벌 접근: 이 인스턴스는 전역적으로 접근이 가능하며, 전역 상태를 유지하는데 유용합니다.

3. 직접적인 인스턴스 생성 불가: 외부에서는 클래스의 인스턴스를 직접 생성할 수 없고, 클래스가 제공하는 특정 메서드를 통해 인스턴스를 얻습니다.


싱글톤 패턴을 사용해야 할 경우

  • 자원 공유가 필요할 때: 예를 들어, 데이터베이스 연결, 네트워크 연결, 로그 기록, 설정 관리 등.
  • 상태 유지가 필요할 때: 여러 컴포넌트가 동일한 상태를 공유해야 할 때 유용합니다.
  • 애플리케이션 전체에서 동일한 인스턴스를 사용해야 할 때.

싱글톤 패턴의 구성 요소

1. 클래스 변수: 클래스 내부에서 유일한 인스턴스를 저장하는 변수.

2. private 생성자: 클래스 외부에서 인스턴스를 생성할 수 없도록 하는 접근 제한자.

3. 공개 메서드: 유일한 인스턴스를 반환하는 메서드. 이 메서드는 클래스 외부에서 인스턴스에 접근할 수 있도록 합니다.


싱글톤 패턴 구현

  1. 기본 구현 (스레드 안전하지 않은 예)
class Singleton {
    static var shared: Singleton?  // 유일한 인스턴스를 저장할 변수
    
    private init() {  // 외부에서 인스턴스를 생성할 수 없도록 private
        print("싱글톤 인스턴스 생성")
    }
    
    // 유일한 인스턴스를 반환하는 메서드
    static func getInstance() -> Singleton {
        if shared == nil {
            shared = Singleton()
        }
        return shared!
    }
}

  1. 스레드 안전한 구현
  • 스레드 안전성을 보장하기 위해 dispatch_once 또는 기본적으로 제공되는 static let을 사용하여 인스턴스를 초기화합니다.
class Singleton {
    static let shared = Singleton()  // 앱이 처음 호출될 때 인스턴스가 생성되고, 이후에는 동일한 인스턴스를 반환
    
    private init() {  // 외부에서 인스턴스를 생성할 수 없도록 private
        print("싱글톤 인스턴스 생성")
    }
}

이 경우 shared는 한 번만 초기화되며, 이후에 호출될 때마다 동일한 인스턴스를 반환합니다.


장점

  1. 메모리 절약: 한 번만 생성된 인스턴스를 재사용하므로 메모리 낭비를 방지할 수 있습니다.
  2. 글로벌 접근: 앱 전체에서 동일한 인스턴스를 사용하므로 여러 클래스에서 같은 데이터를 공유할 수 있습니다.
  3. 상태 관리: 전역 상태를 관리하는 데 유리합니다. 예를 들어, 앱의 설정값, 네트워크 연결 상태 등을 중앙에서 관리할 수 있습니다.

단점

  1. 테스트 어려움: 싱글톤 객체는 전역 상태를 관리하므로 테스트하기 어려울 수 있습니다. 특히 상태가 여러 테스트 간에 공유되기 때문에 의도하지 않은 영향을 미칠 수 있습니다.
  2. 숨겨진 의존성: 싱글톤 패턴은 클래스 간의 의존성을 숨길 수 있어, 의존성 관리가 어렵고, 나중에 코드 변경이 필요할 때 문제가 될 수 있습니다.
  3. 병목 현상: 싱글톤 객체가 하나만 존재하므로, 다수의 클라이언트가 동시에 접근할 때 성능 저하가 발생할 수 있습니다.

싱글톤 패턴의 활용 예시

  1. 네트워크 매니저
  • 네트워크 연결을 하나의 인스턴스에서 관리하고 여러 곳에서 재사용합니다.
class NetworkManager {
    static let shared = NetworkManager()
    
    private init() {}
    
    func fetchData(from url: URL) {
        // 네트워크 요청 코드
    }
}
  1. 앱 설정 관리
  • 앱의 설정 정보를 한 곳에서 관리하며 여러 곳에서 접근합니다.
class AppSettings {
    static let shared = AppSettings()
    
    var theme: String = "light"
    var language: String = "en"
    
    private init() {}
}

결론

싱글톤 패턴은 특정 클래스의 인스턴스가 애플리케이션 내에서 단 하나만 존재해야 할 경우 유용합니다. 하지만 남용할 경우 의존성 관리와 테스트가 어려워질 수 있으므로, 필요할 때만 사용하는 것이 좋습니다.

profile
iOS 공부중...

0개의 댓글

관련 채용 정보