상세 컨텐츠

본문 제목

자바 디자인 패턴 Singleton pattern ( 싱글톤)

Language/JAVA

by Computer_x86_64 2021. 8. 20. 18:31

본문

package _20_DesignPattern;

class A {
//	SingletonPattern01을 변수로 갖는다.
	private SingletonPattern01 singleA;
	
//	기본생성시 자동생성되게 한다.
	public A() {
		this.singleA = SingletonPattern01.getSingleton();
	}
	
	public SingletonPattern01 getASingleton() {
		return this.singleA;
	}
}
class B {
//	SingletonPattern01을 변수로 갖는다.
	private SingletonPattern01 singleB;
	
//	기본생성시 자동생성되게 한다.
	public B() {
		this.singleB = SingletonPattern01.getSingleton();
	}
	
	public SingletonPattern01 getBSingleton() {
		return this.singleB;
	}
}


public class SingletonPattern01 {
/* Spring @Bean 클래스는 Singleton 클래스가 한개만 존재해야할 때사용...
 * 자원을 공유할때 사용한다.*/
//	자신의 객체를 Private static하게 갖고 있어야한다.
	private static SingletonPattern01 singleton;
	
//	private하게 생성자를 설정한다.
	private SingletonPattern01() {
		//
	}
	public static SingletonPattern01 getSingleton () {
		if(singleton == null) {
			singleton = new SingletonPattern01();
		}
		return singleton;
	}
	
	
	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		
		
		SingletonPattern01 aa = a.getASingleton();
		SingletonPattern01 bb = b.getBSingleton();
		
		System.out.println(aa.equals(bb));
	}

}

먼저 소스를 보여드리겠습니다.

 

1. Singleton패턴을 설명하기위한 소스입니다.

SingletonPattern01클래스를 보면 자신클래스에 자신을 static 에 참조변수로 갖고 있습니다.

그리고 생성자와 변수도 private로 외부에서 생성할수 없게 했습니다.

 

2. 그리고 클래스 A, B에 

각각 A, B 생성자를 만들면 기본으로 SingletonPattern01

인스턴스가 있다면 생성해서 반환거나 있으면 바로 반환합니다.

 

3. 그리고 A와 B에서 각 각 자신의 SingletonPattern01을 반환하는 메소드를 정의해줍니다.

 

4. A와 B의 인스턴스를 각 각 a, b로 생성하고

a, b에서 각각 자신의 SinglethonPattern01을 반환하는 메소드를 호출해 a는 aa에 

b는 bb에 반환합니다.

 

5. 그리고 a와 b의 객체를 비교하는 equals()를 하면 true(같다.) 가 나옵니다.

 

 

싱글톤  동작 정리! 

1. 자신을 static하게 갖고있어 메모리에 상주하게 되며 

 

2. A, B의 객체가 생성시 인스턴스가 생성되게됩니다. 

위에서는 A를 먼저 생성해 SigletonPattern 인스턴스를 만들었고

B는 생성된 주소를 넘겨받습니다.

 

3. 위 SingletonPattern01을 반환하는 메소드를 정의한 메소드에 각각에 참조변수에 자신이 갖고있는 주소값을 전달합니다.

 

4. 두 참조변수는 주소 같은 주소 (동일 인스턴스)  이므로 true가 나오게 됩니다.. 

 

 

관련글 더보기

댓글 영역