본문 바로가기
Back-End/Java

[JAVA] 싱글톤(singleton) 방식으로 객체 생성하기

by 찐코딩 2021. 9. 17.

 * 싱글톤(singleton) 패턴

 싱글톤 패턴을 통해서
하나의 인스턴스만 생성하도록 구현할 수 있다.

https://www.youtube.com/watch?v=5jgpu9-ywtY 

 - 생성자를 private 접근 지정자를 사용하여 외부에서 직접 접근을 못하게 불허하는 방식.
 - 외부에서 해당 클래스의 인스턴스를 new로 생성하지 못하도록 하는 방식.
 - 사용하는 이유 : 매번 객체를 생성하게 되면 메모리 성능이 느려지는 단점이 발생하기 때문.

 

ex1) 데이터베이스를 사용하는 경우, connection 객체는 계속 같은 DB에 연결될 것이기 때문에 connection 객체를 계속해서 생성해내면 메모리 성능 저하가 발생한다.

 

ex2) 공동으로 사용되는 파일 같은 경우, 모든 프로젝트원이 파일을 가져올 때마다 객체를 생성하게 되면 메모리 성능 저하가 발생한다.

 

ex3) 스타크래프트 게임을 설계한다고 가정 할 때, 마린의 체력은 60이라는 고유한 데이터를 가지고 있고, 각 객체 별로 체력바가 제각기 닳아가는 것이기 때문에 첫 체력을 설정할 때 체력이 60으로 설정된 객체를 사용하면 메모리 부하를 줄일 수 있다.

 

 

예제) private 처리된 생성자로 인해 싱글톤 방식의 객체를 생성

public class SystemSpeaker {
	
	// 처음에는 하나만 필요한 스피커가 필요, 하나만 필요하니까 static
	// 외부 접근 차단  ==> private 키워드 사용
	static private SystemSpeaker instance;
	
	private int volume;

	// 외부에서 생성함수 호출하지 않아야 되므로 private 키워드 사용
	private SystemSpeaker() {
		volume = 5;
	}
	
	// instance를 가져와야할 getInstance가 필요
	// getInstance를 받기 위해 static으로 받음
	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;
	}

}

 

public class Main {
	public static void main(String[] args) {
		
		// SystemSpeaker speaker = new SystemSpeaker();
		//  ==> 에러발생. private으로 선언했기 때문에
		
		// getInstance를 사용하면 정말 하나의 인스턴스에만 작용하는지 확인하기 위해
		// 두개의 객체 생성
		SystemSpeaker speaker1 = SystemSpeaker.getInstance();
		SystemSpeaker speaker2 = SystemSpeaker.getInstance();
		
		// 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가 동일한 인스턴스라는게 확인이 되었다.
		System.out.println(speaker1);
		System.out.println(speaker2);
		
	}
}

결과

새로 생성				==> 첫번째 인스턴스 생성 시
이미 생성				==> 두번째 인스턴스 생성 시
5
5
11
11
22
22
SystemSpeaker@15db9742	
SystemSpeaker@15db9742

두 인스턴스의 주소가 같은 것으로 보아 동일한 인스턴스라는게 확인이 되었다.

댓글