본문 바로가기

Java

[JAVA]싱글톤(Singleton)과 getInstance()메소드

전체 프로그램에서 단 하나의 객체로만 만드는 경우가 있는데 이 때의 객체를 싱글톤이라 한다. 가끔 이와 같이 프로그램에서 단 하나의 객체만 만들도록 보장해야 되는 경우가 생긴다.

생성자를 외부에서 호출 할 수 없게 하려면 접근을 제한하면 된다. 이 때 사용되는 것이 접근 제한자 private이다. 생성자 앞에 private를 붙여주면 된다. 정적 필드도 외부에서 필드값을 변경하면 안되므로 private를 붙여준다.

public class Singleton {
  //정적 필드
  private static Singleton singleton = new Signleton();
  //생성자
  private Singleton() {}
  //정적 메소드
  static Singleton getInstance() {
    return singleton;
  }
}

getInstance() 메소드

위의 코드를 보면 다음과 같은 코드가 보인다.

  static Singleton getInstance() {
    return singleton;
  }

getInstance()메소드는 싱글톤에서 유일하게 외부에서 객체를 얻는 방법이다.

  • getInstance()는 내부적으로 생성되지 않았다면 생성한다.
  • 기존에 생성된 값이 존재하면 생성된 인스턴스를 리턴하는 형태로 반환한다.
  • 따라서 여러 변수들은 싱글톤에서 동일한 객체를 참조하게 된다.
//변수1과 변수2는 동일한 객체를 참조하게 된다.
클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();

다음 예제 코드를 참고해보자.
Singleton.java

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

Main.java

public class Main {
    public static void main(String[] args) {
        /* 다음과 같이 하면 에러가 발생한다.
        Singleton obj1 = new Singleton();
        Singleton obj2 = new Singleton();
        */
        //외부 객체에서 값을 받아올때는 getInstance() 메소드를 사용한다.
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();

        if(obj1 == obj2){
            System.out.println("두 오브젝트는 같은 객체입니다.");
        }
        else{
            System.out.println("두 오브젝트는 다른 객체입니다.");
        }
    }
}

컴파일 결과

두 오브젝트는 같은 객체입니다.