Java/[OOP] Design Pattern

Java) Singleton(싱글턴) : 효율적인 객체 관리와 활용

pogun 2025. 1. 13. 19:10

싱글턴 패턴(Singleton Pattern) 이란?

: 하나의 클래스에서 단 하나의 인스턴스만 생성되도록 보장하는 디자인 패턴

 

주요 특징 : 

단일 인스턴스 보장 : 클래스의 인스턴스가 하나만 존재하도록 제한

전역 접근 제공 : 애플리케이션의 어디에서나 동일한 인스턴스를 사용할 수 있다.

Lazy Initialization : 인스턴스가 필요할 때 처음으로 생성되며, 이후에는 동일한 인스턴스를 반환(즉, 계속해서 객체를 생성하지 않는다.)

 

싱글턴 패턴 구현 방식 : 

Private Constructor : 외부에서 인스턴스를 생성하지 못하도록 생성자를 private으로 선언

Static Instance : 클래스의 유일한 인스턴스를 static으로 선언하여 관리

Static Method : 인스턴스를 반환하는 메서드를 static으로 제공


싱글턴 패턴 활용 예

public class Singleton {

    // 싱글턴은 static을 붙여줘야함
    private static Singleton single = null;

    private Singleton() {
    }

    public static Singleton getInstance(){
        if(single == null){
            single = new Singleton();  // 1번만 실행
        }
        return single;
    }
}

private static Singleton single = null :

: Singleton 클래스의 단일 인스턴스를 저장하기 위한 정적 변수

 

private Singleton() : 

: 외부에서 인스턴스를 생성하지 못하도록 생성자를 private으로 선언

 

public static Singleton getInstance() : 

: 싱글턴 인스턴스를 반환하는 정적 메서드

: 내부에서 인스턴스가 null일 경우에만 생성하며, 이미 생성된 경우 기존 인스턴스를 반환

public class MainClass {
    public static void main(String[] args) {

        Singleton sc = Singleton.getInstance();
        System.out.println(sc);

        sc = Singleton.getInstance();
        System.out.println(sc);
        // 이렇게해도 1번만 실행됨. 이미 객체가 생성되었기 때문에 if문은 안돌고 리턴만 계속 된다.
    }
}

: 결과처럼 동일한 주소값이 나온다.

싱글턴을 화용한 외부 클래스 값 출력 방법

public class MyClass {

    public void function(){
        Singleton sc = Singleton.getInstance();
        sc.number = 123;
    }
}

 Singleton sr = Singleton.getInstance() : 해당 코드를 통해서 싱글턴 객체를 생성한다.

public class HeClass {

    public void func(){
        Singleton sr = Singleton.getInstance();
        sr.number = 332;
    }
}
public class YouClass {

    public void function(){
        Singleton sc = Singleton.getInstance();
        int number = sc.number;
        System.out.println("number : " + number);
    }

    public void func(){
        Singleton sr = Singleton.getInstance();
        int number = sr.number;
        System.out.println("number : " + number);
    }
}
public class MainClass {
    public static void main(String[] args) {

        MyClass my = new MyClass();
        my.function();

        YouClass you = new YouClass();
        you.function();

        HeClass he = new HeClass();
        he.func();

        YouClass youu = new YouClass();
        youu.func();
    }
}

: MyClass에서 값을 넣고 함수로 연결된 YouClass에 값을 전달

: HeClass에서 값을 넣고 함수로 연결된 YouClass에 값을 전달

'Java > [OOP] Design Pattern' 카테고리의 다른 글

Java) Factory Pattern : 유연한 객체 생성 예제  (0) 2025.01.15