싱글톤(Singleton)
하나의 객체만 생성하도록 보장해주며 getInstance() 메서드를 통해서만 다른 클래스에서 객체에 접근할 수 있도록 해주는 클래스
싱글톤 패턴은 생성 패턴 중 하나로 객체를 오직 하나만 생성하여 생성된 객체를 프로그램 어디에서나 접근하여 사용할 수 있도록 하는 패턴이다.
싱글톤 패턴을 왜?
정수기 예시가 정말 쉬운 이해를 돕는 것 같다. 회사 내에 정수기가 한 대 있다고 가정하면, 누가 물을 마시던 그 정수기의 물의 양이 줄어야 한다. 여러 클래스에서 이 정수기 클래스에 생성자를 호출할 때, 그 때마다 객체를 생성한다면 이후 정수기의 물의 양을 제대로 측정할 수 있는가?
싱글톤 패턴을 구현하는 데에는 여러가지 방법이 있지만, 그 중 기본적인 방법으로 예시를 구현하였다.
· 객체는 외부에서 접근할 수 없도록 private으로, 만약 접근하였을 때는 동일한 객체에 접근할 수 있도록 satic으로 생성
· 생성자는 외부에서 호출할 수 없도록 private으로 지정
· getInstance() 메서드 역시 static으로 작성(static으로 선언한 변수는 static 메서드를 통해서만 접근 가능)
public class WaterPurifier {
// 접근하였을 때 동일한 객체를 위해 static으로 생성
private static WaterPurifier waterPurifier;
private int amount;
// 생성자는 외부에서 호출 못하도록 private으로 지정
private WaterPurifier() {
}
// static으로 선언한 변수는 static 메서드를 통해서만 접근 가능
public static WaterPurifier getInstance(){
// 처음 호출 시만 인스턴스 생성
if(waterPurifier == null) {
waterPurifier = new WaterPurifier();
}
return waterPurifier;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount){
this.amount = amount;
}
}
싱글톤 패턴을 사용하면 매번 new 연산을 통해 인스턴스를 생성하지 않아도 되기 때문에 메모리를 효율적으로 사용할 수 있다. 또한, static 객체이기 때문에 외부에서 객체의 데이터를 공유하기 쉽다.
다만, 싱글톤 패턴을 너무 많이 사용하면 클래스의 객체들 간의 결합도가 높아지는 단점이 있고, 다중 스레드 환경에서 동기화 문제가 발생할 수 있다. 또, 싱글톤 인스턴스는 자원을 공유하기 때문에 테스트가 어렵다는 단점도 있다.
이처럼 싱글톤 패턴은 장단점이 분명한 유연성이 많이 떨어지는 패턴이기 때문에 상황에 맞게 잘 사용하는 것이 중요하다.