본문으로 바로가기

디자인패턴- 싱글톤 패턴

category 프로그래밍 언어/Java 2019. 8. 24. 15:55

싱글톤 패턴

싱글톤 패턴은 하나의 인스턴스만 존재하기 위한 디자인 패턴입니다.

객체에는 클래스와 인스턴스가 있는데 클래스는 구조라고 하면 인스턴스는 구조에 해당하는 실제 존재하는 것입니다.

예를 들어 자동차라는 클래스에 아반떼, 소나타, 람보르기니 등이 인스턴스라고 할 수 있습니다.

즉 하나만 생성해야할 객체를 위한 패턴입니다.

만약 싱글톤 패턴이 없다면 스피커 4억개가 되는 것의 볼륨을 일일이 수정을 해주어야 하기 때문에 낭비가 되겠죠

 

요구사항: 개발중인 시스템에서 스피커에 접근할 수 있는 싱글톤패턴을 적용해서 클래스를 만드시오.

우선 SystemSpeaker 라는 클래스를 만듭시다.

하나의 인스턴스만 사용하기위해서 static으로 getInstance를 통해 생성해줍니다.

그리고 스피커 볼륨을 적용하도록 getVolume과 setVolume 메소드를 추가해줍시다.

 

package com.jeongchan.singleton;
/**
 * 싱클톤 패턴
 * 요구사항: 개발중인 시스템에서 스피커에 접근할 수 있는 클래스를 싱글톤 패턴으로 만드시오.
 * @author dlwjd
 *
 */
public class SystemSpeaker {
	//하나의 인스턴스만 허용(싱글톤 패턴)
	static private SystemSpeaker instance;
	
	private int volume;
	
	
	
	private SystemSpeaker() {
		volume =5;
	}
	
	public static SystemSpeaker getInstance() {
		if(instance == null) {
			//시스템과 스피커가 통신하도록 작업해줄 곳 .
			instance = new SystemSpeaker();
			System.out.println("새로 생성");
		}else {
			System.out.println("이미 생성");
		}
		return instance;
	}

	public int getVolume() {
		return volume;
	}

	public void setVolume(int volume) {
		this.volume = volume;
	}

	
	
	
}

이를 메인에서 사용하는 코드는 아래와 같습니다.

package com.jeongchan.singleton;

public class Main {
	public static void main(String[] args) {
		//하나의 인스턴스만을 사용하는지 확인하기 위함
		SystemSpeaker speaker1 = SystemSpeaker.getInstance();
		SystemSpeaker speaker2 = SystemSpeaker.getInstance();
		
		System.out.println("speaker1: "+speaker1);
		System.out.println("speaker2: "+speaker2);
		
		//5,5
		System.out.println(speaker1.getVolume());
		System.out.println(speaker2.getVolume());

		speaker1.setVolume(11);
		//11,11
		System.out.println(speaker1.getVolume());
		System.out.println(speaker2.getVolume());

		speaker2.setVolume(22);
		//22,22
		System.out.println(speaker1.getVolume());
		System.out.println(speaker2.getVolume());

	}
}

즉 speaker1과 speaker2가 동일 인스턴스를 가지며 수행이 됩니다.

 

새로 생성
이미 생성
speaker1: com.jeongchan.singleton.SystemSpeaker@7852e922
speaker2: com.jeongchan.singleton.SystemSpeaker@7852e922
5
5
11
11
22
22