1. 싱글톤 패턴이란?
싱글톤 패턴은 하나의 클레스에 오직 하나의 인스턴스만을 생성하도록 제한하는 설계 패턴입니다.
주로 인스턴스를 여러 번 생성할 때 자원 낭비가 발생하거나, 인스턴스가 하나만 있어야 하는 경우에 많이 사용됩니다.
- 대표적인 예: DB 연결 모듈, 설정값 관리 객체 등
장점
- 하나의 인스턴스를 기반으로 해당 인스턴스를 다른 모듈들이 공유하여 사용하기 떄문에
인스턴스를 생성할 때 드는 비용이 줄어든다- 인스턴스 생성에 많은 비용이 드는 경우에 특히 효율적
- ex) I/O 바운드 작업
- 인스턴스 생성에 많은 비용이 드는 경우에 특히 효율적
I/O 바운드 : 데이터페이스 연결, 네트워크 통신, 디스크 연결 등 인스턴스 생성에 많은 비용이 드는 작업
단점
- 의존성이 높아지고 TDD(test driven development)를 할 때 걸림돌이 된다.
- TDD의 경우 단위 테스트를 주로 진행 하는데, 단위 테스트는 서로 독립적이어야 하며 테스트를 어떠한 순서로도 진행할 수 있어야 한다.
- 하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 독립적인 인스턴스를 만들기가 어렵다.
2. 싱글톤이 아닌 일반 클래스 예시 (java)
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
User a = new User("Alice", 25);
User b = new User("Alice", 25);
System.out.println(a.hashCode() == b.hashCode()); // false, 서로 다른 인스턴스
}
}
3. 싱글톤 패턴 예시 (java)
public class Singleton {
private static class InstanceHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return InstanceHolder.INSTANCE;
}
}
public class Test {
public static void main(String[] args) {
Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();
System.out.println(a.hashCode() == b.hashCode()); // true, 동일 인스턴스
}
}
설명
- 내부 static 클래스 + final 방식이라 스레드 안전(synchronized 필요 없음)
- 최초 getInstance() 호출 시점에만 인스턴스 생성
4. TDD와 싱글톤 패턴의 단점 예시 (java, assertJ)
테스트할 때 인스턴스의 상태가 공유되어 예측하지 못한 결과가 나올 수 있습니다.
- 순서에 상관없이 테스트가 통과해야하는 TDD에 오류 발생
import org.junit.jupiter.api.*;
import static org.assertj.core.api.Assertions.*;
class ArrayTest {
private int[] a;
@BeforeEach
void setUp() {
a = new int[]{1, 2, 3};
}
@Test
void indexOf_NotPresent_First() {
assertThat(indexOf(a, 4)).isEqualTo(-1);
a[0] = 4; // 상태 변경!
}
@Test
void indexOf_NotPresent_Second() {
assertThat(indexOf(a, 4)).isEqualTo(-1); // 상태에 따라 실패 가능
}
// 배열에서 값의 인덱스 찾기 (없으면 -1)
private int indexOf(int[] arr, int value) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == value) return i;
}
return -1;
}
}
해결 방법
- 테스트마다 싱글톤의 상태를 초기화하거나, 인스턴스를 주입/Mocking 하는 방법을 활용
5. 정리
- 싱글톤 패턴은 인스턴스를 단 하나만 생성하여 동일 객체를 계속 사용함으로써 자원 낭비를 막고 효율을 높입니다.
- 대표적으로 DB 커넥션, 설정 관리에 자주 사용됨
- 하지만 단일 인스턴스에 의존하다 보니 테스트의 독립성, 결합도, 유연성 등에서 단점이 발생할 수 있음
- 실제 사용 시 장점과 단점 모두를 고려하여 적용하는 것이 중요함
'Cs' 카테고리의 다른 글
[Cs, Java] 싱글톤 패턴을 구현하는 방법 정리 (0) | 2025.08.19 |
---|---|
[Cs] 라이브러리와 프레임워크 (0) | 2025.08.12 |
[Cs] 디자인 패턴이란? (0) | 2025.08.12 |
[Cs] 컴파일러와 인터프리터의 차이 (0) | 2025.08.11 |
[Cs] 면접에서 받을 수 있는 질문의 답을 정리해보자 1탄 (0) | 2025.08.09 |