Singleton


출처

이 글은 기본기를 쌓는 정아마추어 코딩블로그 참고하여 쓴 포스트임을 미리 밝힙니다

  • 기본기를 쌓는 정아마추어 코딩블로그 Blog

Singleton Pattern

싱글톤 패턴은 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴.

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다.

즉, 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다 (인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라, 동일(기존) 인스턴스를 사용하게 함)

싱글톤 패턴은 매번 똑같은 하나의 인스턴스만을 반환하도록 하는 클래스 설계 방식

싱글톤 패턴은 가장 사용하기 쉬운 형태의 패턴으로, 프로그램 내에서 단 하나의 인스턴스로만 관리할 클래스에 대해 사용한다.

구현 및 사용이 간단한 만큼 남용하기 쉬운데 한 번 생성된 이후에는 프로그램 종료시까지 항상 메모리에 상주하게 되므로 필요한 경우에만 적절히 활용해야 메모리가 낭비되는 것을 막을 수 있다

iOS에서는 대표적으로 UIApplication, AppDelegate등이 싱글톤 패턴이다.


Singleton Pattern을 사용하는 이유

  • 고정된 메모리 영역을 얻으면서 한번의 새로운 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.

  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

  • 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용(쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체등)

  • 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용.

  • 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아진다


Singleton Pattern의 문제점

  • 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 개방-폐쇄 원칙위배 (= 객체 지향 설계 원칙 위배)

  • 수정, 테스트 하기 어려워진다

  • 멀티 쓰레드 환경에서 동기화처리를 안하면 인스턴스가 두개 생성되는 경우 발생


예제를 통한 설명

외부에서는 클래스에 대한 인스턴스를 직접 생성하지 못하도록 생성자는 private으로 선언

static 전연 변수로 선언한 것은 lazy하게 동작하므로 가장 처음 Singleton을 생성하기 전에는 메모리에 올라가지 않는다

singleton1

초기 설정에 필요한 내용이 있을 시 아래와 같이 구현해 줄 수 있다.

singleton2

싱글톤 클래스에 접근할 때는 아래와 같이 접근한다.

singleton3

생성자(init)을 private로 선언했기 때문에 Error

singleton4