본문 바로가기
Tech/Java

Singleton Design Pattern

by Augustine™ 2019. 3. 14.
반응형

Singleton Design Pattern


Singleton Design Pattern은 소프트웨어 Application 을 개발할 때, 많이 사용하는 디자인 패턴이다. 이 디자인 패턴의 핵심은 메모리에 하나의 인스턴스만 생성하도록 하는 것이다.

생성자가 여러번 호출된다하더라도, 생성되는 객체는 하나다. 또한, 이 후에 호출된 생성자는 최초에 생성한 객체만 반환한다.


패턴 생성

먼저, 클래스의 생성자를 private로 선언하여, Object 생성이 불가하도록 하고, 대신 getInstance()를 이용하여 인스턴스를 생성하도록 한다.

싱글턴 패턴은 하나의 인스턴스만 생성해서 사용하도록 하는 디자인 패턴이다.


사용하는 이유

전역 변수에 객체를 대입하면 애플리케이션이 시작될 때 객체가 생성된다. 그런데 그 객체가 자원을 많이 차지한다고 가정하자.

애플리케이션이 끝날 때까지 그 객체를 한 번도 쓰지 않는다면 괜히 자원만 잡아먹는, 아무 쓸모없는 객체가 된다. 이에 반해 싱글턴 패턴은 특정 클래스에 대해 객체 인스턴스가 하나만 만들어질 수 있도록 해 주고, 필요할 때만 객체를 만들 수 있는 패턴이기에, 객체 생성의 남용으로 인한 메모리 남용을 방지할 수 있다.

또한, 싱글턴으로 만들어진 인스턴스는 전역적이기에, 데이터 공유가 가능하여, 사용자 설정이라든지, 로그 기록용 객체, 스레드 풀 등과 같은 것을 만들 때 활용할 수 있다.


유의할 점

객체지향 프로그래밍의 개방폐쇄원칙에 위배된다.

클래스의 인스턴스들 간에 결합도가 높아지기 때문이다. 다만 이런 경우에서는 synchronized 키워드를 사용해서 방지를 할 수 있다.


예제를 만들어보자.

 방문 숫자를 세는 카운터를 만들자.

생성자를 private 으로 만들고, new를 통해 인스턴스가 생성되는 것을 방지하자.

그리고 getInstance() 메소드를 만들어서, 이 메소드를 통해서만 인스턴스를 생성할 수 있도록 한다.


package com.augustine.singleton;

public class Counter {

	private int cnt = 0;
	
	private static Counter instance;
	
	private Counter() {}
	
	public static Counter getInstance() {
		if(instance == null) {
			instance = new Counter();	
		}
		return instance;
	}
	
	public int getNextCnt() {
		return ++cnt;
	}
}


그리고, 위 싱글턴 클래스를 이용하여, 방문수를 세는 예제 클래스를 만들어보자.


package com.augustine.singleton;

public class CountLogger {

	
	public static void main(String[] args) {
		
		
		Counter cnter1 = Counter.getInstance();
		Counter cnter2 = Counter.getInstance();
		
		System.out.println(cnter1);
		System.out.println(cnter2);
		
		System.out.println(cnter1.getNextCnt());
		System.out.println(cnter2.getNextCnt());
		
	}
}



아래 실형결과를 보면, instance를 두번 생성하였지만, 같은 인스턴스임을 알 수 있다.

com.augustine.singleton.Counter@7852e922

com.augustine.singleton.Counter@7852e922

1

2


반응형

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

Abstract Factory Design Pattern  (0) 2019.03.20
Factory Design Pattern  (0) 2019.03.18
Observer Design Pattern  (0) 2019.03.14
Selenium WebDriver  (0) 2019.03.07
Java collection - Set  (0) 2018.05.09

댓글