본문 바로가기
LV3_Advanced/GOF 패턴

Singleton (싱글톤) - 생성 패턴 #1

by 하타라시 2026. 2. 11.

목차

💡
  • 왜 싱글톤 패턴을 사용해야 하는가?
  • 설계도는 어떻게 생겼나?
  • 실제로 어떻게 구현하나?
  • 장점과 단점은 무엇인가?

왜 싱글톤 패턴을 사용해야 하는가?

시스템 전체에서 단 하나의 인스턴스만 존재해야 하고, 이를 어디서든 공유해서 사용해야 할 때, 사용합니다.

  • 같은 객체를 무분별하게 생성하면 메모리가 낭비되고, 데이터 처리가 복잡해 질 수도 있습니다.
  • 게임을 통한 예시 : 온라인 게임을 할 때, 플레이어 객체 한 개 당 서버 관리자 객체도 하나씩 생기면, 데이터 통신의 복잡도가 훨씬 올라갑니다.
    • 간단하게 서버 객체를 단 하나만 만들고, 플레이어와 서버 객체끼리 초기화만 되어진다면, 간단하게 처리가 가능합니다.

설계도는 어떻게 생겼나?

실패

실제로 어떻게 구현하나?

싱글톤 객체 설정

public class SingletonServer {
    // 1. 자신을 담을 static 변수 (아직 생성 안 함)
    private static SingletonServer instance;
    
    // 데이터를 공유하는지 확인하기 위한 테스트 변수
    public int connectedPlayers = 0;

    // 2. 외부 생성 차단 (private 생성자)
    private SingletonServer() {
        System.out.println("서버가 시작되었습니다. (최초 1회만 실행)");
    }

    // 3. 외부에서 접근 가능한 static 메서드 (통로 개방)
    public static SingletonServer getInstance() {
        if (instance == null) {
            instance = new SingletonServer(); // 없을 때만 생성
        }
        return instance;
    }
}

사용 예시

public class Main {
    public static void main(String[] args) {
        // Player A가 서버에 접속
        SingletonServer serverForA = SingletonServer.getInstance();
        serverForA.connectedPlayers++;
        
        // Player B가 서버에 접속
        SingletonServer serverForB = SingletonServer.getInstance();
        serverForB.connectedPlayers++;

        // 결과 확인: 객체는 하나이므로 값은 공유됨 (출력: 2)
        System.out.println("현재 접속자 수: " + SingletonServer.getInstance().connectedPlayers);
    }
}

장점과 단점은 무엇인가?

장점

  • 메모리 절약
    • 객체가 생성하고 소멸할 때 발생하는 메모리 낭비를 방지합니다.
  • 데이터 공유 용이
    • 전역 인스턴스이기 때문에, 타 클래스 간에 데이터를 쉽게 공유할 수 있습니다.

단점

  • 결합도
    • 너무 많은 곳에서 이 객체를 참조하게 되면, 시스템의 구조가 복잡해지고 수정이 어려워집니다.
  • 테스트의 어려움
    • 테스트 때마다, 초기 세팅을 해줘야합니다. 만일 A라는 싱글톤 객체를 호출 했을 시점에 전역 상태에 세팅된 값이 없다면 에러가 뜨게 됩니다.
  • 남용 주의
    • 하나의 객체에 너무 많은 책임을 몰아넣으면 유지보수가 불가능한 상황이 올 수도있습니다.