대상 객체를 외부에서 직접 생성할수 없다
생성자에는 private
접근 제어자를 사용해서 외부에서 노출을 차단
방법
instance 멤버 필드 생성
getInstance() 메서드를 통해 호출
👉 항상 동일한 객체 (객체 생성하는 것이 아님!)
내부에서 자신의 객체를 생성하고 private
멤버 변수에 저장
public class Test{
private Test(){
}
}
//new Test(); //객체 생성 불가!
public class Test{
private Test(){
}
public static Test getInstance(){
Test t = new Test();
return t;
}
}
그러나 객체 생성 불가
👉 객체 생성하지 않고도 접근할 수 있도록 static
을 붙여줌
Test t1 = Test.getInstance();
Test t2 = Test.getInstance();
Test t3 = Test.getInstance();
t1,t2,t3 가 모두 다른 객체
public class Test{
private static Test instance = new Test();
private Test(){
}
public static Test getInstance(){
return instance;
}
}
getInstance()를 통해 얻어오는 객체가 늘 동일하기를 원한다면 멤버필드로 초기화
여러 유저들이 Test라는 객체를 사용할 때 늘 동일한 객체를 사용하기 위해서는 Singleton
class Test {
// ② 외부에서 직접 접근 불가(private), static끼리 접근 하기 위함(static)
private static Test instance = new Test();
// 외부에서 직접 객체 생성 못하도록 함
private Test() {
}
/**
* 현재 객체내에서 자신을 생성해서 리턴해주는 메소드 제공
*/
public static Test getInstance() {
// Test instance = new Test(); //객체 생성하지 않고도 접근할 수 있도록 static으로 선언①
return instance;
}
}
public class TestMainApp {
public static void main(String[] args) {
// new Test();
Test t1 = Test.getInstance();
Test t2 = Test.getInstance();
Test t3 = Test.getInstance();
// ① t1, t2, t3가 모두 다른 주소값을 가지고 있음(모두 다른 객체)
// ② t1, t2, t3가 모두 같은 주소값을 가지고 있음(모두 같은 객체)
System.out.println("t1 = " + t1);
System.out.println("t2 = " + t2);
System.out.println("t3 = " + t3);
}
}