[JAVA] 디자인 패턴(Design patterns)::싱글톤(Singleton)::

@욕심쟁이

·

2020. 9. 14. 18:10

반응형

디자인 패턴이란?

 - 소프트웨어 개발시 자주 나타나는 구조나 방식, 패턴을 구체적이고 체계적으로 정의하여 모아둔 것

 - 프로그래밍 형식을 정하는 일종의 약속

 - 어떤 상황의 문제에 대한 해법

   → 프로그램머들이 옛날부터 문제된 코드들을 정리하여 해결할 수있도록 해놓은 해법

 

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

 - 프로그램에서 단 하나뿐인 유일한 객체(인스턴스)= 싱글톤 객체

   → 스턴스가 오직 1개만 생성되어야 할때 사용
 - 싱글톤 객체를 사용하여 프로그램을 작성하는 기법을 싱글톤 디자인 패턴이라고 함
 - 새로운 인스턴스 생성을 불가능하게 하며, 미리 생성된 하나의 인스턴스를 모든 참조변수에서 공유해서 사용   

<작성순서>

 1. 객체가 생성되면 안되기 때문에 외부에서 생성자 호출을 못하도록 생성자 정의시 접근제한자를 private으로 선언
 2. 자신의 클래스 내에서 직접 객체를 생성하여 참조변수에 저장 
   → 참조변수의 접근제한자를 private으로 선언하여 접근제한 (생성자생성)
   → 참조변수를 static변수로 선언하여 객체생성없이 로딩(인스턴스 생성)
 3. 생성된 인스턴스를 외부로 리턴하는 Getter를 정의
   → static변수를 리턴하므로 Getter메서드도 static으로 선언

예제1

public class Ex4 {
		
	//접근제한자가 private이라 외부에서 인스턴스생성 불가능
	//SingletonClass sc = new SingletonClass();
	//SingletonClass sc2 = new SingletonClass();
	
    //statice으로 선언된 정적 멤버변수 instance에 접근하여 미리 생성되어있는 인스턴스를 가져올 수 있다!
	//=> 외부에서 함부로 값을 변경 할 수 없도록 private 접근제한자 적용
	//SingletonClass sc = SingletonClass.instance;
	//SingletonClass.instance = null; //함부로 값변경nono!
	
	//외부에서 접근할 수 있도록 Getter메서드를 제공하므로
	//Getter를 호출하여 생성된 인스턴스를 전달받아 사용할 수 있음
	//=> static메서드인 getInstance()메서드를 호출하여 인스턴스 리턴
	SingletonClass sc = SingletonClass.getInstance();
	//참조변수sc2에도 동일한 인스턴스를 리턴받기
	SingletonClass sc2 = SingletonClass.getInstance();
	
	
}
class  SingletonClass{

	//1. 생성자의 접근제한자를 private으로 선언하여
	//	외부에서 인스턴스 생성을 못하도록(생성자 호출)을 못하도록 제한
	private SingletonClass() {};
	
	//2. 자신의 클래스내에서 직접 인스턴스를 생성하여 참조변수에 저장
	//=> 이때, 인스턴스 생성이 불가능 하므로 인스턴스 변수 접근 불가능
	//   따라서, 인스턴스 생성없이도 접근 가능하도록 static으로 선언
	//=> 또한, 외부에서 변수에 접근하여 함부로 값을 변경하지 못하도록 접근제한자를 private으로 선언
	private static SingletonClass instance = new SingletonClass();
	
	//3. 인스턴스 생성 후 인스턴스가 저장된 멤버변수도 접근제한자로 인해 외부에서 접근이 불가능 하므로 대신 인스턴스를 리턴해주는 Getter메서드 정의(Setter 불필요)
	//이때, 인스턴스 생성 없이도 호출가능하도록 static으로 선언
	public static SingletonClass getInstance() {
		return instance;
	}
	
}

예제2

public class Test4 {
	public static void main(String[] args) {
		
		//생성된 인스턴스를 두번 가져오기
		//SingletonTest st1 = new SingletonTest();//인스턴스 생성불가
		SingletonTest st1 = SingletonTest.getInstance();
		SingletonTest st2 = SingletonTest.getInstance();
		
		System.out.println(st1.num+", " + st2.num);//10,10
		st1.num = 100;
		System.out.println(st1.num+", " + st2.num);//100,100
		
		JavaTeacher jt = JavaTeacher.getInstance();
		JavaTeacher jt2 = JavaTeacher.getInstance();
		System.out.println(jt.i +", "+ jt2.i);//이순신, 이순신
		jt.name = "이진";
		System.out.println(jt.i +", "+ jt2.i); //이진, 이진
		
	}
}

class SingletonTest{

	//1. 생성자 생성
	private SingletonTest() {} 
	// 2. 인스턴스 생성
	private static SingletonTest instance = new SingletonTest(); 
	//3. Getter정의
	public static SingletonTest getInstance() {
		return instance;
	}
	
	//싱글톤 패톤 객체확인을 위한 인스턴스 변수 1개 선언
	int num = 10;
	
}
//2. JavaTeacher클래스정의 => 싱글톤 패턴 적용

class JavaTeacher{
	//1. 생성자정의
	private JavaTeacher() {};
	//2. 인스턴스 생성
	private static JavaTeacher instance = new JavaTeacher();
	//3. Getter 정의
	public static JavaTeacher getInstance() {
		return instance;
	}		
    //=================여기까지 싱글톤================================
	String name = "이순신";
}
반응형