[Design Pattern] Singleton Pattern


1. 싱글턴 패턴이란?


위키피디아에서 보면 싱글턴 패턴의 정의는 다음과 같이 나와있습니다.


생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 유형의 디자인 유형을 싱글턴 패턴이라고 한다.


즉, 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 프로세스 어느 곳에서든지 그 인스턴스에 하나에 접근할 수 있게 만든 패턴입니다. 클래스가 하나의 인스턴스를 만들게끔 코드 상에서 처리한 후, 프로세스 내에서 그 하나의 인스턴스에 접근하게 만드는 것입니다. 


2. 싱글턴 패턴을 사용하는 이유


위에서 보듯이, 싱글턴 패턴에서는 '하나만, 하나에, 하나의'라는 표현이 반복되는 것을 볼 수 있습니다. 즉, 싱글턴을 사용하는 이유를 보려면 프로세스 내 단 하나의 인스턴스만이 필요할 때가 언제인지 생각해 보면 된다는 것을 알 수 있죠. 그러면 어느 경우에 싱글턴 패턴을 적용할 수 있는 것일까요?


스택오버플로우나 위키피디아의 내용을 정리해보면 다음과 같을 때 싱글턴 패턴을 적용하기 적합한 경우라고 생각할 수 있습니다.


- 프로세스에서 단 하나의 인스턴스만을 필요로 하는 것을 확신할 수 있을 때.

- 멀티스레드를 돌릴 시, 공유 자원의 동시 접근을 필요로 할 때.

- 다중, 이종간 시스템에서 해당 인스턴스의 접근을 필요로 할 때. 


위의 경우에 싱글턴 패턴을 썼을 경우 얻을 수 있는 이점은 다음과 같습니다.


- 해당 클래스를 사용하는 개발자의 실수를 방지하여 필요없는 메모리 누수 및 자원 낭비를 줄일 수 있다.

- 멀티스레드에서 인스턴스 생성 시, 공유 자원 접근 제어를 용이하게 한다

- API 혹은 Framework에서 해당 제품의 사용자인 프로그래머에게 하나의 인스턴스을 사용하도록 추상화하여 노출시킬 수 있다.


대표적으로 로깅과 관련된 클래스가 싱글턴 패턴을 적용하기 좋은 예라 할 수 있습니다. 프로세스 내에서 단 하나의 인스턴스만을 필요로 하는 것을 확신할 수 있고 또한 모든 인스턴스에서 하나의 로깅 인스턴스를 공유하며 사용할 수 있기 때문이죠. 또한 API나 Framework 사용 시, 해당 자원에 접근하기 위한 인터페이스로서 프로그래머에게 필요한 자원을 제공하는 역할을 할 인스턴스를 만들어 용이하게 제어할 수도 있을 것입니다.


3. 싱글턴 패턴 구현 예제 


아래의 코드는 싱글턴 패턴을 자바 언어를 이용하여 간단하게 구현한 것입니다. 눈여겨 봐야할 것은 두 가지입니다. 


첫번째는, 생성자를 private 키워드로 선언하여 new로 해당 클래스의 인스턴스를 생성하지 못하게 하는 것입니다.

두번재는, 클래스의 인스턴스는 static method를 하나 만들어 해당 인스턴스의 접근을 제어하는 것입니다.


이렇게 싱글턴 패턴을 적용한 클래스를 싱글턴 클래스라고 하며 이 싱글턴 클래스는 해당 인스턴스의 생성과 접근을 getInstance() 메서드를 통해서 구현하고 있습니다.


LazyLoading

class SingleTon {

private static SingleTon singleton = null;
private static Object object = new Object();

private SingleTon() {}

public static SingleTon getInstance(){
if(singleton == null){
synchronized (object){
if(singleton == null)
singleton = new SingleTon();
}
}
return singleton;
}
}


Singleton Holder

class SingleTon {

private SingleTon(){}

private static class SingleTonHolder {
private static final SingleTon INSTNACE = new SingleTon();
}

public static SingleTon getInstance(){
return SingleTonHolder.INSTNACE;
}
}


이 글을 공유하기

댓글(0)

Designed by JB FACTORY