스크린샷 2025-08-08 오후 3.59.45.png

package com.haenin.section06.singleton;

import java.util.Calendar;

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

        /* 목표, 싱글톤 패턴에 대해 이해할 수 있다.
        *   설명.
        *    single pattern이란?
        *     애플리케이션이 시작되고 난 후 어떤 클래스가 최초 한번만 메모리에 할당되고
        *     그 메모리에 인스턴스가 단 하나만 생성되어 공유되게 하는 것을 싱글톤 패턴이라고 한다.
        *     (메모리 및 리소스 낭비 방지 목적)
        *
        *   설명.
        *    장점
        *     1. 첫 번째 이용 시 에는 인스턴스를 생성해야 하므로 속도 차이가 나지 않지만
        *        두 번째 이후 이용시에는 인스턴스 생성 시간 없이 바로 사용할 수 있다. (재사용)
        *     2. 인스턴스가 절대적으로 한 개만 할당되는 것을 보증할 수 있다. (같은 주소)
        *    단점
        *     1. 싱글톤 인스턴스가 너무 많은 일을 하거나 데이터를 공유하면 결함도가 높아져서 병목현상을
        *        유발할 수 있다.
        *     2. 동시성 문제를 고려해서 설계해야 하기 때문에 난이도가 높다.
        *
        *   설명.
        *    구현 방법
        *     1. 이른 초기화(Eager Initialization)
        *     2. 늦은 초기화(Lazy Initialization)
        * */

        EagerSingleton eager1 = EagerSingleton.getInstance();
        EagerSingleton eager2 = EagerSingleton.getInstance();

        /* 설명. hashCode는 다른 객체인데 같은 값이 나오는 경우도 있다.
        *       System.identifyHashCode 사용*/
        System.out.println("eager1의 주소: "+ System.identityHashCode(eager1));
        System.out.println("eager1의 주소: "+ eager2.hashCode());

        LazySingleton lazy1 = LazySingleton.getInstance();
        LazySingleton lazy2 = LazySingleton.getInstance();

        System.out.println("lazy1의 주소: "+ System.identityHashCode(lazy1));
        System.out.println("lazy2의 주소: "+ System.identityHashCode(lazy2));

        // 필기. Calendar cal = new Calendar(); 생성자를 쓸 수 없게 되어있음
        Calendar cal = Calendar.getInstance();
    }
}

package com.haenin.section06.singleton;

public class EagerSingleton {

    private static EagerSingleton eager = new EagerSingleton();

    private EagerSingleton(){

    }

    public static EagerSingleton getInstance() {
        return eager;
    }
}

package com.haenin.section06.singleton;

public class LazySingleton {

    private static LazySingleton lazy;

    private LazySingleton() {

    }

    public static LazySingleton getInstance() {
        if (lazy == null) lazy = new LazySingleton();
        return lazy;
        // 필기. static은 스태틱 영역에 처음 생성된 객체가 들어가 있기 때문
    }
}