Java 싱글톤 패턴이란 무엇입니까?
Java 싱글톤 패턴은 객체를 한 번만 생성하고 어디에서나 참조할 수 있도록 하는 디자인 패턴입니다. 이렇게 하면 메모리 낭비를 줄이고 객체 일관성을 유지할 수 있습니다.
Java의 싱글톤 패턴은 다음과 같이 구현됩니다.
- 디자이너
private
외부에서 직접적인 개체 생성을 방지합니다. - 클래스 내에서 자신의 인스턴스를 만듭니다.
getInstance()
메서드에 의해 생성된 인스턴스를 반환합니다.
public class Singleton {
// 내부에서 자체적으로 인스턴스 생성
private static final Singleton instance = new Singleton();
// 외부에서 인스턴스 생성 불가
private Singleton(){ }
public static Singleton getInstance() {
return instance;
}
}
위의 구현 Singleton
클래스의 인스턴스는 클래스가 선언된 첫 번째 실행문에서 한 번만 생성됩니다. Heap
범위 내에서 생성 후 생성됩니다. getInstance()
메서드를 통해 어디에서나 참조할 수 있습니다.
이제 외부 클래스의 싱글톤 인스턴스가 개체 일관성을 유지하는지 확인하겠습니다.
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
// Object singleton2 = Singleton.getInstance(); // 같은 결과
System.out.println( (singleton1 == singleton2) );
true
결과적으로 singleton1
수업 singleton2
모두 힙 영역에 로드됩니다. Singleton
인스턴스를 가리키고 개체 일관성을 유지합니다.
일반적인 싱글톤 패턴은 Java입니다. Runtime
클래스와 스프링 프레임워크 ApplicationContext
있다
Runtime 클래스는 JVM(Java Virtual Machine)의 인스턴스를 나타내며 ApplicationContext는 Spring Framework의 빈 컨테이너 역할을 합니다.
Runtime 클래스의 인스턴스를 생성하려고 하면 아래와 같이 생성에 실패합니다.
// 'Runtime()' has private access in 'java.lang.Runtime'
Runtime runtime = new Runtime();
다음과 같이 인스턴스를 참조할 수 있습니다.
Runtime runtime = Runtime.getRuntime();
또한 많은 라이브러리와 프레임워크는 싱글톤 패턴을 사용하며 직접 구현할 수 있습니다. 그러나 다중 스레드 환경에서는 동시성 및 동기화 문제와 같은 다양한 문제가 발생할 수 있으며 이를 안전하게 구현하기 위해서는 몇 가지 주의 사항이 필요합니다.
이 문제는 나중에 논의하겠습니다.