본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


디자인 패턴

디자인패턴 - 싱글톤 패턴

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 5. 2.

 

 

싱글톤 패턴은..고정된 메모리 영역을 얻으면서 new를 한번만 실행하여 원하는 클래스를 사용하는 것을 의미한다.

이러한 싱글톤 패턴은..메모리 낭비를 방지할 수 있고 전역 객체이기 때문에 다른 클래스들이 데이터를 공유하기 쉽다.

또한 처음 이후에 다음번 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아지는 장점이 있다.

조심할 것은 멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있다라는 점이다.

대표적인 싱글톤 모습으로는 그 유명한 Calendar 클래스가 되겠다.

그리고 스프링 프레임워크나 전자정부 프레임워크가 이러한 방식으로 빈객체를 관리한다.

싱글톤 객체를 활용하는 방법은 아래 예제와 같다.

public class DesignPtn2 {

	static class SingleTon{
		private SingleTon(){}  //new로 객체생성 금지
		private static final SingleTon instance = new SingleTon(); //1번만 선언
		public static SingleTon getInstance(){  //객체 가져가기
			return instance;
		}
		public void print(){
			System.out.println("print");
		}
	}
	
	public static void main(String[] args) {	
		SingleTon.getInstance().print();
	}
}

위 소스코드 처럼 생성자가 private 속성을 지니기 때문에 new로 객체를 선언 하는 것이 금지가 된다.

대신 getInstance 메소드를 통해서 객체를 사용 할 수 있다. 사용자는 해당 메소드를 사용할 때 마다 new를 사용하지 않아도 되므로 메모리관리나 속도 등에서의 보장을 받을 수 있다.

	class SingleTon2{
		private SingleTon2(){}
		private static SingleTon2 instance;
		public static SingleTon2 getInstance(){
			if(instance == null){  //사용하려 하면 로딩시킴
				instance = new SingleTon2();
			}
			return instance;
		}
		public void print(){
			System.out.println("print");
		}
	}

위 방법은 늦은 초기화 방법으로, 굳이 사용하지 않는 경우에는 객체를 만들고 있지 않다가 사용하려 할 때 객체가 없는 경우 불러오는 방법이다. 첫번째와 코드가 다른 것은 if 절이 존재한다는 것이다.

그러나 위 두가지 방법은 멀티쓰레드 환경에서 객체가 2개이상 생성 될 수 있다.

    class SingleTon3{
		private SingleTon3(){}
		private static SingleTon3 instance;
		public static SingleTon3 getInstance(){
			if(instance == null){
	            synchronized (SingleTon3.class) {  //멀티쓰레드 환경에서의 동기화처리
	                if(instance == null){
	                	instance = new SingleTon3();
	                }
	            }
			}
			return instance;
		}
		public void print(){
			System.out.println("print");
		}
	}	

해당방법이 멀티쓰레드 환경에서의 동기화처리를 위해 조건문 이후에서의 synchronized를 선언하는 모습이다.

자주 불러오는 클래스이면서 성능 관리에 초점을 둔다면 싱글톤 패턴을 적용한 클래스를 만드는 것도 좋을 것 같다.

반응형

'디자인 패턴' 카테고리의 다른 글

디자인패턴 - 프로토타입 패턴  (0) 2019.05.02
디자인패턴 - 빌더 패턴  (0) 2019.05.02
디자인패턴 - 팩토리 패턴  (0) 2019.05.02
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글