객체지향 (OOP)

Java Application - 싱글톤 패턴(Singleton pattern)

고인돌개발자 2021. 4. 29. 09:10

학습목표 
   - 1. OOP 에서 싱글톤의 개념을 정의하고 이해한다.
   - 2. 이해한 개념을 Java 코드로 구현할 수 있다.
 * 참고 - 구글 검색, 구글 이미지, 유투브 : www.youtube.com/watch?v=5jgpu9-ywtY

                                                             youngjinmo.github.io/2020/04/java-memory/

1. 싱글톤 이해하기
   - 싱글톤은 클래스를 객체화 할때, 첫번째 인스턴스가 메모리에 정적으로 할당되어
     해당 메모리 위치를 모든 동일한 인스턴스가 참조하여 사용하도록 함

 

<Study 자료>

 

<like 여왕벌, 클라스가 다르심>

 

2. Java coding 

 

# 일반 클래스 생성

package singleton.ver1;

public class NaSingleClassNo {
	
	private static String strName;
		
	public NaSingleClassNo() {	
	}	
	
	public String getStrName() {
		return strName;
	}
	
	public void setStrName(String strName) {
		this.strName = strName;
	}

}

# 싱글톤 클래스 생성 

package singleton.ver1;

public class NaSingleClass {
	
	private String strName;
	
	// 클래스 참조 변수 선언 
	// 해당 값을 static 으로 선언하여, 메모리에 올려, 모두가 참조하게 함(포인터)
	private static NaSingleClass singleInstance;
	
	// 생성자가 private , new 접근 할 수 없음
	private NaSingleClass() {		
	}
	
	// 해당 함수를 통해서만, 객체화가능,,,
	//public static NaSingleClass getSingleInstance() {
	//public static synchronized NaSingleClass getSingleInstance() {
	public static synchronized NaSingleClass getSingleInstance() {
		if(singleInstance ==null) {
			synchronized (NaSingleClass.class) {
				if(singleInstance ==null) {
					singleInstance = new NaSingleClass();
				}
			}			
		}
		return singleInstance;
	}
	
	public String getStrName() {
		return strName;
	}
	
	public void setStrName(String strName) {
		this.strName = strName;
	}
}

# 실행 main 클래스

package singleton.ver1;

public class MainNaclass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("\n ================ No Single ==========================");

		// No Single
		NaSingleClassNo na = new NaSingleClassNo();
		NaSingleClassNo na2 = new NaSingleClassNo();
		NaSingleClassNo na3 = new NaSingleClassNo();
		
		na.setStrName("Kim");
		System.out.printf("na ,  %s , %s \n", na, na.getStrName());
		System.out.printf("na2 , %s , %s \n", na2, na2.getStrName());
		System.out.printf("na3 , %s , %s \n", na3, na3.getStrName());
		
		System.out.println("\n ================ No Single ==========================");
		// Single
		NaSingleClass naS = NaSingleClass.getSingleInstance();
		NaSingleClass naS2 = NaSingleClass.getSingleInstance();
		NaSingleClass naS3 = NaSingleClass.getSingleInstance();
		
		naS.setStrName("Lee");
		System.out.printf("naS ,  %s , %s \n", naS, naS.getStrName());
		System.out.printf("naS2 , %s , %s \n", naS2, naS2.getStrName());;
		naS2.setStrName("Lee2");
		System.out.printf("naS2 , %s , %s \n", naS2, naS2.getStrName());;
		System.out.printf("naS3 , %s , %s \n", naS3, naS3.getStrName());;
		System.out.printf("naS ,  %s , %s \n", naS, naS.getStrName());
		
	}

}

#. Bill pugh Singleton - Thread Safe (JVM 이 제공하는 동기화 기법 이용)

package singleton;

public class BillPughSingleton {

	private BillPughSingleton() {}
	
	private static class BillPughSingletonHolder{
		private static BillPughSingleton INSTANCE = new BillPughSingleton();
	}
	
	public static BillPughSingleton getInstance() {
		return BillPughSingletonHolder.INSTANCE;
	}
}

#. 기존 소스 변경 

package singleton.ver1;

public class NaSingleClassBillPugh {
	
	private static String strName="pugh";
	
	// 생성자가 private , new 접근 할 수 없음
	private NaSingleClassBillPugh() {}
	
	private static class NaSingleClassBillPughHolder{
		private static NaSingleClassBillPugh instance = new NaSingleClassBillPugh();
	}
	
	public static NaSingleClassBillPugh getInstance() {
		return NaSingleClassBillPughHolder.instance;
	}
	
	public String getStrName() {
		return strName;
	}
	
	public void setStrName(String strName) {
		this.strName = strName;
	}
	

}