[Java] 싱글톤 디자인 패턴 원리 이해하기, final static 메모리 사용영역으로 이해하기

     

     

    싱글톤(Singleton)은 단 하나의 객체만 만들도록 보장하는데 대표적인 디자인 패턴중에 하나이다. 싱글톤을 디자인 패턴을 이해하려면 클래스 정적 멤버와 인스턴스 멤버의 메모리 사용 영역을 이해 해야 한다.

     

    [싱글톤 클래스 생성 단계]

    1. 싱글톤은 만들려면 우선 외부에서 생성자를 호출 할 수 없어야 한다. 클래스 로더 시점에서 생성자를 통해 자동적으로 객체하나가 생성되고 그 후에는 생성되지 않게 하기 위함이다. 그래서 생성자 앞에 private를 붙여준다. 

     

    2. 정적 필드를 만드는데 이것도 다른 클래스에서 사용될수 없도록 private를 붙여주고 클래스로더 시점에 만들어지고 초기화 되어야 하기 때문에 정적 필드 만든다.

     

    3. 마지막으로 만들어진 인스턴스를 가져오는 getInstance() 함수를 만들어서 클래스로더 시점에 생성자로 만들어진 유일한 하나의 객체를 가져올수 있도록 한다. 이 함수의 리턴타입은 Singleton 객체이다.

     

    ex) 싱글톤 클래스 생성

    public class Singleton {
        private static Singleton singleton  = new Singleton();
    
        private Singleton() {};
    
        static Singleton getInstance() {
            return singleton;
        }
    }

     

    위 코드의 클래스 로더 시점에서의 메모리 사용영역이다.

     

    [메소드 영역]

    1. Singleton 클래스

    2. Singleton 클래스의 private Singleton() 생성자

    3. Singleton 클래스의 private static singleton 정적 필드

    4. Singleton 클래스의 static Singleton getinstance() 함수 

     

    [힙 영역]

    new Singleton() 생성자를 통해서 만들어진 Singleton 클래스의 객체(이 객체의 주소는 singleton 필드에 저장됨)

     

    ex) 싱글톤 클래스 사용

    class SingletonExample {
        static void main(String[] args) {
            //Singleton obj1 = new Singleton(); //생성자를 private로 했기때문에 에러 발생
    
            Singleton obj1 = Singleton.getInstance();
            Singleton obj2 = Singleton.getInstance();
    
            if(obj1 == obj2) {
                System.out.println("같은 Singleton 객체 입니다.");
            } else {
                System.out.println("다른 Singleton 객체 입니다");
            }
        }
    }

    다른 클래스에서 Singleton obj1 = new Singleton(); 로 객체를 만드려고 할때 생성자가 private 이기 때문에 생성자 함수를 사용할 수없다. obj1, obj2는 getInstance() 함수로 객체를 가져오는데 이미 힙영역에 만들어진 객체를 가져오는것이기 때문에 == 연산자가 true이다. 만약에 new Singleton() 함수로 객체를 생성했으면 힙 영역에 따로 만들어 졌기 때문에 == 연산자가 false일 것이다. 

     

    참고 : 혼자 공부하는 자바 / 신용권  https://www.yes24.com/Product/Goods/74269939  

    댓글

    Designed by JB FACTORY