13-4. 싱글톤 패턴 (Singleton Pattern)

박은서's avatar
Feb 24, 2026
13-4. 싱글톤 패턴 (Singleton Pattern)

1. 싱글톤 패턴 (Singleton Pattern)

1️⃣ 싱글톤 패턴이란?

1) 개념

프로그램 전체에서 특정 객체를 단 하나만 생성하고, 어디서든 그 동일한 객체를 사용하도록 보장하는 설계 방식

2) 핵심 요약

  • 객체는 한 번만 생성
  • 모두가 같은 객체 공유
  • 전역 접근 가능

2️⃣ 비유로 이해하기

1) "회사 대표" 비유

  • 회사에는 대표가 단 1명
  • 직원들이 대표를 필요로 할 때
    • 항상 같은 대표에게 요청
    • 새로운 대표를 만들지 않음
➡️ 싱글톤 객체 = 회사 대표

3️⃣ 싱글톤 패턴이 필요한 이유 (Why)

  • 일부 객체들은 여러 개 존재하면 문제가 발생
  • 예시 상황
    • 설정 관리자 → 값 충돌 발생 가능
    • 로그 기록기 → 로그 분산
    • DB 연결 관리자 → 리소스 낭비
    • 캐시 관리자 → 데이터 불일치
➡️ “이 객체는 하나만 있어야 한다”할 때 싱글톤 패턴 사용

4️⃣ 사용 시점 (When to Use)

  • 다음 조건일 때 적합
    • 공용 자원 관리
    • 상태 공유 필요
    • 생성 비용이 큰 객체
    • 시스템 전체에서 하나만 필요한 객체
  • 대표 사례
    • Logger
    • Configuration Manager
    • Database Connection Manager
    • Cache Manager

5️⃣ 싱글톤 패턴의 장단점

1) 장점

  • 메모리 절약 → 객체 하나만 생성
  • 일관성 유지 → 동일 상태 공유
  • 전역 접근 가능 → 어디서든 사용

2) 단점

  • 테스트 어려움 → 전역 상태 문제
  • 결합도 증가 → 의존성 커짐
  • 멀티스레드 문제 → 동시 생성 위험
➡️ 실무에서는 남용 금지

6️⃣ 싱글톤 패턴의 구조

1) 생성자

  • 외부 접근 차단 (private)

2) 자기 자신 저장 변수

  • 객체 보관

3) 접근 메서드

  • 객체 제공

7️⃣ 구현 방법

1) 동작 원리

객체 요청 발생 ↓ 이미 객체 존재? ↓ YES → 기존 객체 반환 ↓ NO → 객체 생성 후 반환

2) 핵심 전략

  • 생성 제한
  • 단일 인스턴스 저장
  • 접근 통로 제공

8️⃣ 코드 예시 (Java 스타일)

1) 코드

class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }

2) 의미 해석

  • private Singleton() → 외부 생성 금지
  • instance → 단 하나의 객체 저장
  • getInstance() → 객체 요청 창구

2. 실습 (ex04)

1️⃣ 싱글톤 패턴 실습

1) Doorman.java

C:\workspace\java_lab\designapp\src\ex04\Doorman.java
package ex04; public class Doorman { // 1. 이 코드는 단 한 번만 실행된다. public static Doorman instance = new Doorman(); private Doorman() {} // 책임 public void 쫓아내(Animal a) { System.out.println(a.getName() + " 저리가"); } }

2) App.java

C:\workspace\java_lab\designapp\src\ex04\App.java
package ex04; // SOLID : 객체지향원칙 (D, O) // DIP : 추상적인 것에 의존하라! -> 추상적인 것에 의존하면 자동으로 OCP가 됨 // OCP : 새로운 코드에는 OPEN, 기존 코드에는 CLOSE public class App { public static void main(String[] args) { Tiger tiger = new Tiger(); Mouse mouse = new Mouse(); Doorman doorman = Doorman.instance; // 싱글톤 Doorman doorman2 = Doorman.instance; // 싱글톤 System.out.println(doorman.hashCode()); System.out.println(doorman2.hashCode()); doorman.쫓아내(mouse); } }

3) 결과

notion image
 
Share article