[Java] 디자인 패턴 : 싱글톤(Singleton) 패턴

싱글톤 패턴(Singleton Pattern)은 하나의 클래스가 오직 하나의 인스턴스만 가지며, 그 인스턴스를 어디서든지 접근할 수 있도록 하기 위한 디자인 패턴이다.
HootJem's avatar
Aug 14, 2024
[Java] 디자인 패턴 : 싱글톤(Singleton) 패턴
💡
싱글톤 패턴(Singleton Pattern)은 하나의 클래스가 오직 하나의 인스턴스만 가지며, 그 인스턴스를 어디서든지 접근할 수 있도록 하기 위한 디자인 패턴이다. 주로 애플리케이션의 설정을 관리하거나, 로그 관리, 스레드 풀 관리 등에 사용된다.

1. 싱글톤 패턴이란?

싱글톤 패턴은 클래스의 인스턴스가 단 하나만 생성되도록 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접근점을 제공한다. 즉, 애플리케이션 전체에서 하나의 인스턴스를 공유할 수 있도록 하는 패턴.

1.1 예제 1 : 기본적인 싱글톤 패턴 구현

Doorman 클래스가 싱글톤 패턴으로 구현되었습니다. 클래스 내부에 private static으로 선언된 doorman 인스턴스가 클래스 로드 시점에 생성된다.
public class Doorman { private static Doorman doorman = new Doorman(); private Doorman() {} // 생성자를 private으로 선언하여 외부에서 인스턴스를 생성하지 못하게 함 public static Doorman getInstance() { return doorman; // 유일한 인스턴스를 반환 } // 동물 출입 금지 public void getOut(Animal a) { System.out.println(a.getName() + " get out!"); } }
  • private 생성자: 외부에서 인스턴스를 생성할 수 없도록 private으로 선언한다.
  • static getInstance 메서드: 유일한 인스턴스를 반환하는 static 메서드로, 이를 통해 애플리케이션 어디서든지 이 인스턴스에 접근할 수 있다.
 
public class App { public static void main(String[] args) { Doorman d1 = Doorman.getInstance(); Doorman d2 = Doorman.getInstance(); System.out.println(d1.hashCode()); // 793589513 System.out.println(d2.hashCode()); // 793589513 } }
실행결과 주소가 같다. 동일한 인스턴스를 참조하고 있음을 의미한다.
 

1.2 예제 2 : 간단한 싱글톤 패턴 구현

좀 더 간단하게 싱글톤 패턴을 구현합니다. instance 필드를 public으로 선언하여 직접 접근할 수 있도록 한다.
public class Doorman { public static Doorman instance = new Doorman(); private Doorman(){} // 동물 출입 금지 public void getOut(Animal a){ System.out.println(a.getName()+"getOut!"); } }
 
public class App { public static void main(String[] args) { Doorman d1 = Doorman.instance; Doorman d2 = Doorman.instance; System.out.println(d1.hashCode()); // 793589513 System.out.println(d2.hashCode()); // 793589513 } }
 

1.3 싱글톤 패턴의 장점

  • 전역적인 접근성: 싱글톤 인스턴스는 어디서든 접근할 수 있다.
  • 메모리 절약: 인스턴스가 하나만 생성되므로 메모리 낭비를 줄일 수 있다.
  • 데이터 일관성: 애플리케이션 전체에서 동일한 인스턴스를 사용하므로, 데이터의 일관성을 유지할 수 있다.

1.4 싱글톤 패턴의 단점

  • 멀티스레드 환경에서의 문제: 기본적인 싱글톤 패턴은 멀티스레드 환경에서 안전하지 않을 수 있다. 동시에 인스턴스를 생성하려고 할 때, 두 개 이상의 인스턴스가 생성될 가능성이 있다. 이를 해결하려면 synchronized 키워드 등을 사용하여 스레드 안전성을 확보해야 한다.
  • 테스트의 어려움: 싱글톤 패턴은 전역 상태를 가지기 때문에, 단위 테스트에서 모킹(mocking)이 어려울 수 있다.
 

결론

싱글톤 패턴은 유용하지만, 멀티스레드 환경에서의 사용이나 테스트 가능성에 대한 고려가 필요하다. 필요한 상황에서 신중하게 적용해야 하며, 특히 멀티스레드 환경에서는 추가적인 안전 장치를 마련하는 것이 중요함!
Share article

[HootJem] 개발 기록 블로그