중앙정보기술인재개발원/JAVA

[JAVA] 싱글톤

soidev 2025. 3. 24. 17:31

싱글톤

    전체 프로그램에서 단 하나의 객체만 만들도록 보장해야하는 경우가 있다. 단 하나만 생성된다고 해서 이 객체를 싱글톤이라고함

  • 보통 객체의 생성 비용이 크거나, 공유해야 할 상태가 있는 경우 사용
  1. 핵심 개념
    • 객체 생성 제한  :  private으로 만들어서 외부에서 new 키워드로 객체를 직접 생성하지 못하도록 막음
    • 유일한 인스턴스 관리  :  클래스 내부에서 static 변수로 유일한 객체를 저장
    • 전역 접근 방식 제공  :  static 메서드를 통해 객체를 가져오도록 함
  2. 동작 방식
    • 외부에서 객체를 얻는 유일한 방법 : getInstance() 메서도 호출
    • getInstance()메소드는 단 하나의 객체만 리턴하기 때문에 아래 코드 변수 1,변수2는 동일한 객체를 참조
      클래스 변수1 = 클래스. getInstance();
      클래스 변수2 = 클래스. getInstance();
  3. 싱글톤 패턴의 특징
    • 하나의 객체만 존재 → 메모리 절약, 불피요한 객체 생성을 방지
    • 어디서든 동일한 인스턴스 사용 가능 → 공유 리소스 관리에 유리
    • 멀티스레드 환경에서는 동기화가 필요할 수도 있음
    • 대표적인 싱글톤 패턴 : Runtime.getRuntime(), Desktop.getDesktop()
    • 비슷하게 생긴 패턴 : Calendar() 팩토리 매서드 패턴 사용

 

 


 실습 코드

 

package p5;

import java.util.Calendar;

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

        Calendar aaa=Calendar.getInstance();  //싱글톤 객체

        //총복습(문법만)
        //참조변수를 막을 수 없음??
        SomeComponent sc1 = SomeComponent.getInstance();  
        //아무리 인스턴스를 호출해도 이제 한번만 생성되고 안됨, 두번생성X
        sc1.doProcess();
        sc1.doProcess();
        sc1.doProcess();
        // SomeComponent sc3 = new SomeComponent(); //이건 절대 안됨
        SomeComponent sc2 = SomeComponent.getInstance();  
        sc2.doProcess();
    }
}

//싱글톤 패턴 - 특정 인스턴스는 단 한개만 생성되고 한정 시키고 싶다
//component 기능관련 클래스 .. 일반적으로는 한개의 인스턴스가 활용됨
class SomeComponent{
    //싱글톤 시작
    // 생성자를 프라이비값으로 막아버림

    private SomeComponent(){

    }

    private static final SomeComponent instance = new SomeComponent();
    //get~ : 무조건 싱글톤 패턴임
    public static SomeComponent getInstance(){
        return instance;
    }
    //싱글톤 끝

    //위에 코드를 예전에는 이렇게 썼음 쉽게
    // private static SomeComponent instance = null;

    // public static SomeComponent getInstance(){
    //     if(instance ==null) {
    //         instance = new SomeComponent();
    //     }
    //     return instance;
    // }

    //여기부터는 원래 하던거
    private String name= "한조";
    public void doProcess(){
        //매우 중요한 핵심 로직!!! 구현됨
        System.out.println(name + "핵심로직 실행");
    }
}


📌 네 코드에서의 싱글톤 패턴 설명

네가 작성한 SomeComponent 클래스는 싱글톤 패턴을 적용한 클래스야.
즉, 이 클래스의 인스턴스(객체)는 딱 한 번만 생성되고, 계속 재사용돼!

싱글톤 패턴을 적용한 SomeComponent 분석

1️⃣ 생성자를 private으로 막음

private SomeComponent(){   }

✔ 이렇게 하면 외부에서 new SomeComponent()로 객체를 직접 생성할 수 없음!
✔ 즉, 이 클래스의 인스턴스는 오직 클래스 내부에서만 만들 수 있음.

2️⃣ 유일한 객체를 static final로 생성

private static final SomeComponent instance = new SomeComponent();

✔ 프로그램이 실행될 때 딱 한 번 SomeComponent 객체가 생성됨.
✔ 이후에는 계속 같은 객체를 반환하게 됨.

3️⃣ getInstance()로 객체를 반환

public static SomeComponent getInstance(){
        return instance;
    }

✔ 외부에서 SomeComponent.getInstance()를 호출하면 항상 같은 객체(instance)를 반환!
✔ new SomeComponent()가 막혀 있기 때문에, 이 방법이 유일한 접근 방식!

'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글

[JAVA] 상속, 다형성  (0) 2025.03.27
[JAVA] Depdency, DI, Composition, Aggregation  (1) 2025.03.26
[JAVA] 메소드  (1) 2025.03.21
[JAVA] 클래스  (0) 2025.03.20
[JAVA] 배열  (1) 2025.03.18