목차
- 싱글톤 패턴과 스레드 안전성 설명
- 지연 초기화 예제
- 싱글톤 직렬화 예제
- 싱글톤 패턴의 활용 예제
- 싱글톤 패턴의 주의사항과 대안
1. 싱글톤 패턴과 스레드 안전성 설명
싱글톤 패턴은 객체의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다.
하지만 멀티스레드 환경에서 동시에 getInstance() 메서드를 호출할 경우, 여러 개의 객체 인스턴스가 생성될 수 있습니다.
이를 해결하기 위해 다양한 방식으로 스레드 안전성을 보장하는 싱글톤 패턴을 구현할 수 있습니다.
2. 지연 초기화 예제
싱글톤 객체를 처음부터 생성하는 것이 아니라 처음으로 getInstance() 메서드가 호출될 때 객체를 생성하는 방식입니다.
이를 통해 필요한 시점에 객체를 생성하여 자원을 절약할 수 있습니다.
public class TestSingleton {
private static TestSingleton instance;
private TestSingleton() {
// private 생성자로 외부에서 인스턴스를 생성하지 못하도록 함
}
public static synchronized TestSingleton getInstance() {
if (instance == null) {
instance = new TestSingleton();
}
return instance;
}
}
3. 싱글톤 직렬화 예제
싱글톤 객체가 직렬화되는 경우, 역직렬화 과정에서 객체가 여러 번 생성될 수 있습니다.
이를 방지하기 위해 readResolve() 메서드를 사용하여 이미 생성된 인스턴스를 반환하도록 합니다.
import java.io.Serializable;
public class SerializableSingleton implements Serializable {
private static SerializableSingleton instance;
private SerializableSingleton() {
// private 생성자로 외부에서 인스턴스를 생성하지 못하도록 함
}
public static SerializableSingleton getInstance() {
if (instance == null) {
instance = new SerializableSingleton();
}
return instance;
}
protected Object readResolve() {
return instance;
}
}
4. 싱글톤 패턴의 활용 예제
싱글톤 패턴은 많은 경우에 유용하게 사용됩니다. 예를 들어, 로그 관리자, 설정 정보, 데이터베이스 연결 객체 등을 싱글톤으로 구현하여 전역적으로 접근할 수 있도록 합니다.
public class Logger {
private static Logger instance;
private Logger() {
// private 생성자로 외부에서 인스턴스를 생성하지 못하도록 함
}
public static synchronized Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
public void log(String message) {
// 로그를 기록하는 기능 구현
}
}
5. 싱글톤 패턴의 주의사항과 대안
싱글톤 패턴은 많은 장점을 가지고 있지만, 동시성 문제와 테스트 어려움 등의 단점도 있습니다.
따라서, 다른 디자인 패턴이나 의존성 주입 등을 고려하여 싱글톤 패턴을 대체할 수 있습니다.
예를 들어, 의존성 주입을 사용하면 각 클래스에 대한 테스트가 쉬워지고, 더 유연한 설계가 가능해집니다.
public class SomeClass {
private Logger logger;
public SomeClass(Logger logger) {
this.logger = logger;
}
public void doSomething() {
// 로그를 사용하는 기능 구현
logger.log("Something is done.");
}
}
싱글톤 패턴을 사용할 때에는 상황과 요구사항에 맞게 적절한 방법을 선택하는 것이 중요합니다. 이렇게 하면 자바에서 싱글톤을 구현하고 활용하는데 도움이 될 것입니다.