Singleton.java
public class Singleton {
// 클래스의 객체(메모리 주소)를 저장하기 위한 필드 선언
// => static 제한자를 사용하여 정적 필드 선언
private static Singleton _instance;
// 생성자를 은닉화 선언 - 클래스 외부에서 생성자에 접근하지 못하도록 설정
// => 객체 생성 불가능
private Singleton() {
// TODO Auto-generated constructor stub
}
// 정적 영역(Static Block) : 클래스를 읽어 메모리(MethodArea)에 저장된 후 자동으로 실행될
// 명령을 작성하기 위한 영역
// => 프로그램에서 한번만 실행되는 명령
// => 정적 필드 또는 정적 메소드만 사용 가능
static {
// 클래스로 객체를 생성하여 시스템 필드에 저장
// => 프로그램에서 객체를 하나만 생성하여 필드 저장
_instance = new Singleton();
}
// 시스템 필드에 저장된 객체를 반환하는 메소드
public static Singleton getInstance() {
return _instance;
}
// 인스턴스 메소드
public void display() {
System.out.println("Singleton 클래스의 display() 메소드 호출");
}
}
SingletonApp.java
public class SingletonApp {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println("singleton1 = " + singleton1);
System.out.println("singleton2 = " + singleton2);
singleton1.display();
singleton2.display();
System.out.println("==========================================================");
Singleton.getInstance().display();
Singleton.getInstance().display();
System.out.println("==========================================================");
}
}
// singleton1 = oop.Singleton@3b6eb2ec
// singleton2 = oop.Singleton@3b6eb2ec
// Singleton 클래스의 display() 메소드 호출
// Singleton 클래스의 display() 메소드 호출
// ==========================================================
// Singleton 클래스의 display() 메소드 호출
// Singleton 클래스의 display() 메소드 호출
// ==========================================================
싱글톤 클래스는 생성자가 은닉화 선언되어 있어 new 연산자로 생성자를 호출하여 객체 생성이 불가
=> 객체를 반환하는 정적 메소드를 호출하여 참조변수에 반환받은 객체를 저장하여 사용
싱글톤 클래스는 참조변수에 반환받은 객체를 저장하여 메소드를 호출하지 않고 반환받은 객체로 직접 메소드를 호출하여 사용하는 것을 권장