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) 결과

Share article