언어/java

[Java] 6. 클래스 (6) - singleton

젼젼39 2025. 5. 17. 14:55

6.15 싱글톤 패턴_이어서

* 싱글톤 패턴 : 클래스의 인스턴스를 오직 하나만 생성하고, 이 인스턴스에 전역적으로 접근할 수 있도록 보장하는 디자인 패턴

    - 사용 예시 : 로깅(하나의 로거 인스턴스로 여러 곳에서 로그 기록을 남기고, 일관성을 유지할 때), 설정 관리(시스템 전체에서 하나의 설정 객체만 사용해야 할 때), 자원을 공유해야 할 때 등

예를 들어, 여러 곳에서 사용할 수 있는 공용 카운터가 있을 때.
    (이 카운터는 프로그램 전체에서 단 하나만 존재, 어디서든 할당된 값을 증가시키거나 읽을 수 있어야 함)

public class Counter {
    // 카운터의 유일한 인스턴스를 저장할 변수
    private static Counter instance;

    // 카운터 값 초기화
    private int count = 0;

    // private 생성자를 사용, 외부에서 객체를 생성하지 못하게 막음.
    private Counter() {}

    // 인스턴스 반환 메서드 -> new()가 아니라 이걸 통해 인스턴스를 만든다!!
    // (중요) 이걸 호출하면 항상 같은 인스턴스를 반환함
    //  --> 모두 같은 객체이기 때문에 값을 공유함
    public static Counter getInstance() {
        if (instance == null) {
            instance = new Counter();
        }
        return instance;
    }

    // 카운터 증가 메서드
    public void increment() {
        count++;
    }

    // 현재 카운터 값 반환
    public int getCount() {
        return count;
    }
}


    // 현재 카운터 값 반환
    public int getCount() {
        return count;
    }
}
public class Main {
    public static void main(String[] args) {
        Counter counter1 = Counter.getInstance();
        Counter counter2 = Counter.getInstance();

		// increment 메서드를 통해 증가. 다른 변수를 통해 해당 메서드 사용했음!
        counter1.increment();
        counter2.increment();

		//다른 변수를 통해 increment 메서드 사용했지만 값은 같이 증가함.
        System.out.println(counter1.getCount()); // 출력: 2
        System.out.println(counter2.getCount()); // 출력: 2
    }
}

    - Counter 클래스로는 오직 하나의 인스턴스만 만들 수 있음

    - getInstance()를 호출하면, 항상 같은 인스턴스를 반환하기 때문에, 어디서든 increment(), getCount()로 증가, 읽기 가능

    - counter1, counter2는 모두 같은 객체임 -> 값을 공유하게 됨