[Java] 싱글톤 패턴

JOY·2023년 3월 28일
0

[Java]

목록 보기
12/15
post-thumbnail

싱글톤 패턴

대상 객체를 외부에서 직접 생성할수 없다
생성자에는 private 접근 제어자를 사용해서 외부에서 노출을 차단

방법
instance 멤버 필드 생성
getInstance() 메서드를 통해 호출
👉 항상 동일한 객체 (객체 생성하는 것이 아님!)

내부에서 자신의 객체를 생성하고 private 멤버 변수에 저장

public class Test{	
	private Test(){    
    }    
}

//new Test(); //객체 생성 불가!
  • 내부에 private 생성자가 있기 때문에 외부에서 직접 생성 불가
public class Test{	
	private Test(){    
    }    
    public static Test getInstance(){
		Test t = new Test();
        return t;
	}
}
  • 현재 객체를 생성해서 리턴하는 메소드를 만들어준다.
  • getInstance() 호출을 어떻게 할까?
    같은 클래스? ❌ static? ❌
    객체 생성❓

그러나 객체 생성 불가
👉 객체 생성하지 않고도 접근할 수 있도록 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);
	}

}
profile
Just Do IT ------- 🏃‍♀️

0개의 댓글