학습목표
- 1. OOP 에서 싱글톤의 개념을 정의하고 이해한다.
- 2. 이해한 개념을 Java 코드로 구현할 수 있다.
* 참고 - 구글 검색, 구글 이미지, 유투브 : www.youtube.com/watch?v=5jgpu9-ywtY
youngjinmo.github.io/2020/04/java-memory/
1. 싱글톤 이해하기
- 싱글톤은 클래스를 객체화 할때, 첫번째 인스턴스가 메모리에 정적으로 할당되어
해당 메모리 위치를 모든 동일한 인스턴스가 참조하여 사용하도록 함
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;
}
}
'객체지향 (OOP)' 카테고리의 다른 글
객체지향(OOP) 4대 특성 (0) | 2021.05.10 |
---|---|
[추상화] abstraction (3) | 2021.05.03 |
Java Application - 싱글톤 패턴(Singleton pattern) (2 - Web 버젼) (0) | 2021.04.30 |