ddit/Java

싱글톤패턴(Singleton)

ssong2ku 2022. 7. 27. 08:23
728x90

싱글톤패턴

어플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당(static) 그 메모리에 인스터스를 만들어 사용

=> 하나의 인스턴스만을 생성하며, 필요할 때 마다 각자 알아서 기존의 인스턴스를 공유받아 생성

=>생성자가 여러번 호출되도 실제 생성되는 객체는 하나,

    이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴

 

장점

- 한 번의 new로 객체생성이 가능하기 때문에 메모리 낭비방지

- 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터 공유하기 쉬움

- 두번째 이용부터는 객체 로딩시간이 줄어 성능향상

 

단점

- 싱글톤인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유 시킬 경우 다른 클래스 인스턴스들 간의 결합도 증가

=>개방-폐쇄의 원칙 위반

더보기

개방-폐쇄 원칙 (OCP: Open-Closed Principle)


소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.(Bertrand Mayer)

계방 폐쇄 원칙은 기존 코드를 변경하지 않으면서(Close) 기능을 추가(Open)할 수 있도록 설계가 되어야 한다는 원칙

이는 객체 지향 설계에 어긋나며 수정이 어려워지고 유지보수 비용이 높아질 수 있음

 

꼭  필요한 경우가 아니라면 지양

 

싱글톤 패턴 구현하기

package kr.or.ddit.basic.singleton;

/*
 * singleton패턴 ==> 객체가 1개만 만들어지게 하는 방법
 * 					(외부에서 new 명령을 사용하지 못하게 한다.)
 * 
 * - 사용 목적 : 1.메모리 낭비 방지
			  2.데이터의 공유가 쉬움
			  
			  
	- singleton클래스를 만드는 방법(필수 구성 요소)		  
 *	 1. 자신 class의 참조값이 저장될 변수를 private static을 선언한다.
 		단, 1개만 존재해야 해서 static 으로 선언
 *
 *	 2. 생성자의 접근제한자를 private로 한다(외부에서 new명령어를 사용하지 못하게..)
 *		(기본 생성자만 있더라고 반드시 생성자를 작성해야 함.)
 *	 3. 자신 class인스턴스를 생성하고 반환하는 메서드를 public static으로 작성
 *		(이 메서드의 이름은 보통 getInstance로 함.)
 */


public class MySingleton {
	
	//아래의 3가지는 필수!!!
	
	//1번
	private static MySingleton single;
	
	//2번
	private MySingleton(){
		System.out.println("생성자 입니다....");
	}
	
	//3번
	public static MySingleton getInstance() {
		//1번에서 선언한 변수가 null이면 객체를 생성해서
		//1번에서 선언한 변수에 저장.
		
		if(single==null) single= new MySingleton();
		return single;
		
	}
	
	//기타 이 클래스가 처리할 내용을 기술
	public void test() {
		System.out.println("이것은 싱글톤 객체의 메서드 실행입니다!!!");
	}
}
package kr.or.ddit.basic.singleton;

public class SingletonTest {
	//서비스와 DAO는 싱글톤으로 거의 생성
	
	public static void main(String[] args) {
		
		//MySingleton test1 = new MySingleton(); 외부에서 new 명령으로 생성불가
		
		MySingleton test2 = MySingleton.getInstance();//객체생성
		MySingleton test3 = MySingleton.getInstance();//객체생성
		
		
		System.out.println("test2 ==> "+test2.toString());
		System.out.println("test3 ==> "+test3);
		System.out.println();
		
		System.out.println(test2==test3);
		System.out.println(test2.equals(test3));
		
		test2.test();
		test3.test();
	}

}

 

MVC패턴에서 싱글톤패턴사용예제

public class MemberDaoImpl implements IMemberDao{
	
	//1번
	private static MemberDaoImpl dao;
	
	//2번
	private MemberDaoImpl() {}
	
	//3번
	public static MemberDaoImpl getInstance() {
		if(dao==null) dao = new MemberDaoImpl();
		
		return dao;
	}
public class MemberServiceImpl implements IMemberService {
	private IMemberDao dao; // DAO객체가 저장될 변수 선언

	private static MemberServiceImpl service;   //1번
	   
	   
	   //생성자
	   //public MemberServiceImpl () {
	   private MemberServiceImpl () {            //2번
	      //dao = new MemberDaoImpl();   //DAO객체 생성
	      dao = MemberDaoImpl.getInstance();
	   }
	   
	   public static MemberServiceImpl getInstance() {
	      if(service == null) service = new MemberServiceImpl();
	      
	      return service;
	   }
public class MemberController {

	
	   private IMemberService service; // Service객체가 저장될 변수 선언
	   
	   private Scanner sc =  new Scanner(System.in);
	   
	   
	   
	   
	   public MemberController() {
	   //service = new MemberServiceImpl();
		   service = MemberServiceImpl.getInstance();
	}
728x90

'ddit > Java' 카테고리의 다른 글

Swing  (0) 2022.09.05
ibatis  (0) 2022.07.29
MVC패턴(model-view-controller)< VO,DAO,Service,Controller>  (0) 2022.07.26
Stack, Queue, Sort  (0) 2022.06.22
Collection Framework(Array List, Vector...), generic / 문제풀기  (0) 2022.06.22