본문 바로가기
개발 관련 지식/JAVA

싱글톤(Singleton)

by 권태일1147 2020. 3. 31.

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

싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.

생성자를 외부에서 호출할 수 없도록 하려면 생성자 앞에 private 접근 제한자를 붙여주면 된다. 그리고 자신의 클래스 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화 한다. 정적필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막는다. 대신 외부에서 호출 할 수 있는 정적 메소드 getInstance()를 선언하고 정적필드에서 참조하고 있는 자신의 객체를 리턴해준다. 이것이 싱글톤을 만드는 코드이다.

public class Singleton{

    // 생성자
    private Singleton() {} // 외부 클래스에서 호출할 수 없는 생성자
    
    // 필드
    private static Singleton singleton = new Singleton(); // 객체를 생생하는 외부에서 호출 할 수 없는 필드
    
    // 메소드
    static Singleton getInstance() { // 클래스를 통해서 호출할 수 있는 내부에서 생성한 객체를 반환하는 정적 메소드
        return singleton; // 객체 생성 타입이 자기 자신이기 때문에 리턴 타입도 자기 자신
    }
    
}

이렇게 하면 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이다. getInstance() 메소드를 호출하면 클래스 내부에서 만들어져 있는 객체를 호출한다.

public class SingletonExam {
    public static void main(String[] args){
        // private으로 생성자의 외부 호출을 막아놨기 때문에 에러가 난다.
        // Singleton sgt1 = new Singleton();
        
        // getInstance() 메소드는 정적 메소드라서 클래스를 통해 호출하고, 
        // 리턴타입은 Singleton 클래스 내부에서 생성된 객체를 리턴하기 때문에 Singleton 타입이 된다.
        Singleton sgt2 = Singleton.getInstance();
        Singleton sgt3 = Singleton.getInstance();
        // Singleton 클래스 내부에서 생성된 하나의 객체가 호출된다.
        
        if(sgt2 == sgt3){
            System.out.println("같은 객체입니다.");
        } else {
            System.out.println("다른 객체입니다.");
        }
    }
}

'개발 관련 지식 > JAVA' 카테고리의 다른 글

Getter, Setter 메소드  (0) 2020.03.31
import문  (0) 2020.03.31
객체와 클래스  (0) 2020.03.30
객체 지향 프로그래밍  (0) 2020.03.29
Spring boot - 5. JPA test CRUD 만들기  (1) 2020.03.23