1. Singleton 패턴이란?
- Singleton이란 '단독 개체', '정확히 하나의 요소만 갖는 집합' 등의 의미로, 특정 클래스의 객체(인스턴스)가 오직 한 개만 존재하도록 구현한 클래스를 말한다.
- 객체(인스턴스)를 하나만 생성하게 함으로써 프로세스의 메모리 낭비를 방지할 수 있다. 또한, 생성된 객체는 전역성을 띄기 때문에 서로 다른 객체들 간 공유가 가능하다는 장점이 있다.
- 하지만, 싱글톤을 사용함으로써 각 클래스들은 서로에 대한 결합도가 높아져 객체지향 5원칙의 개방-폐쇄 원칙(OCP)에 위배된다는 단점이 있다.
싱글톤 패턴 구현 예제
- 싱글톤 구현 (1) - 동기화의 문제
public class Singleton1 {
private static Singleton1 instance = null;
// 불필요한 메모리 사용을 방지하기 위해 getInstance()를 호출하기 전까지는 null이도록 초기화한다.
public static Singleton1 getInstance() {
if (instance == null) {
instance = new Singleton1();
}
return instance;
}
}
class Other {
Singleton1 singletonExam = new Singleton1();
Singleton1 instance = Singleton1.getInstance();
}
위 코드는 임계 영역이 선언되있지 않기 때문에 서로 다른 쓰레드가 동시에 getInstance()를 호출할 경우, 두 개의 인스턴스가 만들어질 우려가 있다. 이를 Synchronized를 통해 문제를 해결해보자.
- 싱글톤 구현 (2) -동기화로 인한 성능 저하의 문제
public class Singleton2 {
private static Singleton2 instance = null;
public static synchronized Singleton2 getInstance() { // 쓰레드 동기화
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
class Other {
Singleton2 singletonExam = new Singleton2();
Singleton2 instance = Singleton2.getInstance();
}
getInstance() 메소드에 임계영역을 걸어주면서, 더 이상 두 개의 인스턴스가 만들어질 걱정은 없다. 하지만, 쓰레드 포스팅에서 설명했다싶이 동기화를 하게 되면 프로세스의 성능 저하에 대한 우려가 있기에 보다 개선된 코드를 살펴보자.
- 싱글톤 구현 (3) - 문제 개선 코드
public class Singleton3 {
private static class InnerClass { // 내부 클래스로 생성 시점의 문제를 해결
private static final Singleton3 instance = new Singleton3();
}
public static Singleton3 getInstance() {
return InnerClass.instance;
}
}
class Other {
Singleton3 singletonExam = new Singleton3();
Singleton3 instance = Singleton3.getInstance();
}
위 코드는 JVM의 클래스 로드 시점을 고려하여 내부 클래스를 선언함으로써, 쓰레드의 동기화 문제와 동기화로 인한 성능 저하 문제를 동시에 해결한다.
개선된 코드만 보는 것이 아닌 각 코드의 문제점을 기억하고 왜 개선된 코드를 사용해야 하는지를 알아야 한다. 이보다 개선된 코드로 열거형(enum)을 사용하는 코드가 있지만 조금 더 학습 후 올리도록 하겠다.
반응형
'JAVA > CONCEPT' 카테고리의 다른 글
| [JAVA] Layered Pattern (0) | 2023.02.20 |
|---|---|
| [JAVA] Proxy Pattern (0) | 2023.01.27 |
| [JAVA] MVC Pattern (0) | 2023.01.17 |
| [JAVA] 객체 지향 설계의 5가지 원칙 - SOLID 원칙 (0) | 2023.01.16 |
| [JAVA] 객체 지향 프로그래밍 (OOP) - 특징 (0) | 2023.01.15 |
댓글