싱글톤 패턴(Singleton Pattern)

고라니·2023년 7월 12일
0

TIL

목록 보기
10/67

싱글톤 패턴(Singleton Paturn)?

싱글톤 패턴은 소프트웨어 디자인 패턴의 하나로, 클래스의 인스턴스가 하나만 만들어지도록 설계하는 패턴이다. 즉, 한 클래스에 대해 단 한 번의 객체 생성만 허용하며, 이후에는 이미 생성한 동일한 객체를 반복적으로 재사용한다.이렇게 함으로써 시스템에 해당 클래스의 객체가 단 하나만 존재하게 된다.

iOS에서의 실글톤 패턴

싱글톤 패턴은 iOS에서 많은 곳에 활용되며, 각각 객체가 시스템 내에서 한 개만 존재하도록 보장하여 리소스를 효율적으로 관리하고, 다양한 컴포넌트 간의 통신을 요이하게 한다.
싱글톤 객체는 주로 shared, standard, default 등의 이름으로 접근하는 것을 볼 수 있다.

  1. UIApplication: 앱 자체에 대한 중요 정보를 관리, shared 인스턴스를 통해 앱의 delegate에 접근
let appDelegate = UIApplication.shared.delegate as! AppDelegate
  1. UserDefaults: 앱의 사용자 설정과 같은 간단한 데이터를 저장하고 불러올 때 사용, standard 인스턴스를 통해 접근
let defaults = UserDefaults.standard
  1. NotificationCenter: 이벤트 발생 시 특정 액션을 수행하도록 등록된 옵저버에게 알리는 역할, default 인스턴스를 통해 접근
let notificationCenter = NotificationCenter.default
  1. URLSession: 네트워크와 관련된 작업을 수행하는데 사용되며, HTTP 프로토콜을 사용한 데이터 다운로드, 업로드 등의 작업을 수행, shared 인스턴스를 통해 접근
let session = URLSession.shared

이렇게 싱글톤 패턴은 iOS에서 많은 곳에서 활용되며, 각각의 객체가 시스템 내에서 한 개만 존재하도록 보장함으로써 리소스를 효율적으로 관리하고, 다양한 컴포넌트 간의 통신을 용이하게 한다. 그리고 싱글톤 객체는 주로 shared, standard, default 로 표현하여 접근하는 것을 볼 수 있다.

싱글톤 패턴 구현하기

class Singleton {
    static let shared = Singleton() // 1.

    private init() { // 2.
        // 단 한 개의 인스턴스만 생성되도록 보장하기 위해 초기화를 비공개로 설정
    }
}
  1. 이 클래스는 shared라는 정적 속성을 통해 자신의 단일 인스턴스 객체를 참조한다.

  2. 생성자를 private로 선언하여 클래스 외부에서 초기화 하는것을 방지하여 여러 인스턴스가 생성되는것을 방지한다.

결과적으로 이 클래스의 인스턴스는 프로그램 내에서 단 하나만 존재하게 된다.

static?
알반 인스턴스 프로퍼티는 해당 타입의 인스턴스가 생성될 때마다 인스턴에 대한 별도의 메모리 공간에 할당된다. 반면 static 키워드를 통해 선언하면 해당 타입의 인스턴스와는 독립적으로 존재하며, 프로그램이 시작된 후 해당 타입을 처음으로 사용될 때(런타임 시점) 메모리에 올라간다.

싱글톤 패턴의 장단점

장점

  • 고정된 메모리 영역에 인스턴스를 한 번만 저장하여 메모리 낭비를 줄이고 효율을 높인다.
  • 전역 인스턴스이기 때문에 클래스 간 데이터 공유와 접근이 쉽다.

단점

  • 싱글톤이 전역 변수와 유사하게 작동하여, 잘못 사용하면 코드를 혼란스럽게 만든다.
  • 다른 클래스가 싱글톤에 의존하게 되면 강한 결합이 생긴다. 코드의 유연성을 감소시키고, 유지 보수를 어렵게 만든다.
  • 멀티스레드 환경처럼 한순간에 여러곳에서 싱글톤에 접근하면 동시성 문제가 발생할 수 있다.
  • 싱글톤 패턴의 특성때문에 테스트의 결과가 다른 테스트의 결과에 영향을 줄 수 있다. 이를 '테스트 간 상태 유출'이라고 표현한다.

부작용

장단점을 보면 확실한 장점이 있지만 단점이 상당히 많이 보인다.
그래서 많은 개발자들은 싱글톤 패턴의 부작용에 대해 많이 언급하곤 하는데 그렇기 때문에 싱글톤 패턴은 꼭 필요한 상황에만 제한적으로 사용해야 한다.

Swift환경에서의 싱글톤 동시성 문제
Swift3.0 이후부터 싱글톤 패턴을 구현할 때 'static let' 을 사용했는데 'static let' 은 처음으로 접근될 때까지 초기화 되지 않으며, 'thread safe' 하게 수행되도록 설계되어 있다. 즉 초기화가 한번만 이루어지며 이 과정에서 발생할 수 있는 동시성 문제의 경쟁 상황을 제거하여 동시성 문제가 발생하지 않도록 한다.

결론

싱글톤 패턴은 특정한 상황에 매우 유용하지만, 사용에 있어서는 주의가 필요하다. 결국 싱글톤 패턴의 사용은 꼭 필요한 알맞은 상황에서만 사용하도록 하자

profile
🍎 무럭무럭

0개의 댓글