inblog logo
|
parangdajavous
    Design pattern

    Design pattern 4. Singleton Pattern

    김미숙's avatar
    김미숙
    Jul 22, 2025
    Design pattern 4. Singleton Pattern
    Contents
    ✅ 1. 싱글톤 패턴이란?실습

    ✅ 1. 싱글톤 패턴이란?

    • 소프트웨어 디자인 패턴 중 하나로, 프로그램 전체에서 단 하나의 인스턴스만 생성되도록 보장하는 패턴
    • 어떤 클래스의 인스턴스가 오직 하나만 생성되도록 제한하고, 그 인스턴스에 접근할 수 있는 전역적인 접근 메서드를 제공하는 패턴
     

    🎯 왜 쓰는가?

    • 공통된 자원을 모든 곳에서 동일하게 사용해야 할 때
    • 인스턴스를 공유해야 할 때 (예: DB 연결, 설정 객체, 로그 시스템 등)
    • 메모리 낭비를 막고, 일관된 동작 보장을 위해
     

    🔁 예시 상황

    • Logger: 로그 관리자는 하나만 있어야 일관된 로그 기록 가능
    • DatabaseManager: DB 커넥션 객체를 하나만 만들어 재사용
    • 환경 설정 클래스: 설정 정보를 읽고 캐시
     

    ✅ 2. 구조 요약 (Java 기준)

    public class Singleton { private static Singleton instance; // [1] 유일한 인스턴스를 저장할 변수 private Singleton() {} // [2] 생성자를 private으로 막음 public static Singleton getInstance() { // [3] 인스턴스를 반환하는 정적 메서드 if (instance == null) { instance = new Singleton(); // 처음 한 번만 생성됨 } return instance; } }
     

    ✅ 3. 핵심 포인트

    요소
    설명
    private 생성자
    외부에서 new Singleton()으로 생성 못 하게 막음
    static 인스턴스 변수
    클래스에 하나만 존재하는 공유 인스턴스
    getInstance()
    인스턴스를 반환하는 정적 메서드
     

    ⚠️ 멀티스레드 환경에서는?

    단일 인스턴스 생성 중 동시 접근 문제 발생 가능

    🛡 해결 방법: synchronized 키워드

    public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }
    혹은 Double-Checked Locking + volatile 사용
     

    ✅ 4. 싱글톤의 장단점

    ✅ 장점
    • 인스턴스가 하나만 존재 → 메모리 절약
    • 전역 접근 가능 → 공통 상태 유지 쉬움
    • 클래스간 의존성 낮춤
     
    ❌ 단점
    • 테스트 어려움 (인스턴스 상태 공유)
    • 전역 상태 → 예상치 못한 사이드이펙트
    • 멀티스레드 환경에서 동기화 필요
     

    🧠 싱글톤 사용 시기

    • 전역 설정 클래스
    • 로그 기록기
    • 공통 유틸리티
    • DB 커넥션 풀
    • 쓰레드 풀
     

    📌 정리 문장

    싱글톤 패턴은 프로그램에서 인스턴스를 오직 하나만 생성하고, 그 인스턴스에 어디서든 접근 가능하게 해주는 디자인 패턴
     

    실습

    notion image
    Doorman
    package ex04; public class Doorman { // instance는 static 공간에 저장되고, Doorman의 Heap의 주소를 가진다 public static Doorman instance = new Doorman(); // 상태확인 private Doorman() { } // 객체의 책임 public void 쫓아내(Animal animal) { System.out.println(animal.getName() + " 나가!!"); } }
    • main 시작 전에 한 번만 띄워서 유지
    App
    package ex04; public class App { public static void main(String[] args) { Mouse m1 = new Mouse(); Cat c1 = new Cat(); Doorman d1 = Doorman.instance; d1.쫓아내(m1); d1.쫓아내(c1); } }
    • 상태확인과 책임을 가진 메서드 구분
    package ex04; public class Doorman { // 상태확인 public static Doorman instance = new Doorman(); // 책임을 가진 메서드 - 객체를 생성하는 책임 public static Doorman createInstance() { return new Doorman(); } private Doorman() { } // 객체의 책임 public void 쫓아내(Animal animal) { System.out.println(animal.getName() + " 나가!!"); } }
    Share article
    Contents
    ✅ 1. 싱글톤 패턴이란?실습

    parangdajavous

    RSS·Powered by Inblog