[Cs] 싱글톤 패턴

2025. 8. 14. 16:55·Cs

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
'Cs' 카테고리의 다른 글
  • [Cs, Java] 싱글톤 패턴을 구현하는 방법 정리
  • [Cs] 라이브러리와 프레임워크
  • [Cs] 디자인 패턴이란?
  • [Cs] 컴파일러와 인터프리터의 차이
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (110) N
      • Backend (15)
        • SpringBoot (0)
        • Java (15)
      • Cs (17) N
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (78)
        • Programmers (78)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    StringTokenizer
    programmers
    switch
    java
    effectivejava
    BufferedReader
    json
    BufferedWriter
    CS
    codingtest
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[Cs] 싱글톤 패턴
상단으로

티스토리툴바