package ex_static;
public class Ex4 {
public static void main(String[] args) {
/*
* 싱글톤 디자인 패턴(Singleton Design Patten)
* - 전체 프로그램에서 단 하나의 객체만 만들도록 보장하는 코딩 기법
*
*/
// SingletonClass sc = new SingletonClass();
// 접근제한자가 private으로 선언된 생성자로써 호출이 불가능하므로
// SingletonClass의 인스턴스 생성이 불가능해짐!
// static으로 선언된 정적 멤버변수 instance에 접근하여
// 미리 생성되어 있는 인스턴스를 가져올 수 있다!
// SingletonClass sc = SingletonClass.instance;
// SingletonClass.instance = null;
// => 외부에서 함부로 값을 변경할 수 없도록 private 접근제한자 적용
// 외부에서 접근할 수 있도록 Getter 메서드를 제공하므로
// Getter를 호출하여 생성된 인스턴스를 전달받아 사용할 수 있음
// => static 메서드인 getInstance() 메서드를 호출하여 인스턴스를 리턴
SingletonClass sc = SingletonClass.getInstance();
SingletonClass sc2 = SingletonClass.getInstance();
// sc / sc2 인스턴스의 주소값 확인
System.out.println("sc 인스턴스의 주소값 : " + sc);
System.out.println("sc2 인스턴스의 주소값 : " + sc2);
System.out.println("sc와 sc2는 같은가? " + (sc == sc2));
}
}
class SingletonClass {
// 1. 생성자의 접근제한자를 private으로 선언하여
// 외부에서 인스턴스 생성을 못하도록 제한
private SingletonClass() {}
// 2. 자신의 클래스 내에서 직접 인스턴스를 생성하여 참조 변수에 저장
// => 이 때, 인스턴스 생성이 불가능하므로 인스턴스 변수 접근 불가능
// 따라서, 인스턴스 생성 없이도 접근 가능하도록 static으로 선언
// => 외부에서 변수에 접근하여 함부로 값을 변경하지 못하도록 접근제한자를 private으로 선언
private static SingletonClass instance = new SingletonClass();
// 3. 인스턴스 생성 후 인스턴스가 저장된 멤버변수도 접근제한자로 인해 외부에서
// 접근이 불가능하므로 대신 인스턴스를 리턴해주는 Getter 메서드 정의(Setter 불필요!)
// => 이 때, 인스턴스 생성 없이도 호출 가능하도록 static 으로 선언
public static SingletonClass getInstance() {
return instance;
}
}