자바의 싱글톤 패턴
포스트
취소

자바의 싱글톤 패턴

우테코 3주차 로또(수동) 미션을 하면서, 1주차에 썼던 enum을 또 어떻게 써먹을 수 있을지 고민을 해 보았다.

프로그래밍 요구사항 중: **java enum을 적용해 프로그래밍을 구현한다.**

우선 생각난 것은 한 번씩만 생성되면 되고 또 숫자 범위 등에 대해 검증이 필요한 로또 번호를 enum으로 만드는 것이었는데, 아무리 생각해도 깔끔한 코드라고 보기엔 어려웠다.

`public enum LottoNumber {
    ONE(1),
    TWO(2),
    THREE(3),
    FOUR(4),
    FIVE(5),
    SIX(6),
    SEVEN(7),

.
.
.`

…그래서 1주차에는 등수와 상금을 표시할 때만 enum을 사용하고 그냥 로또 번호는 원시값인 int로 두고 로또 한 장에 해당하는 Lotto 클래스에서 여섯 개의 번호를 모두 검증하게끔 만들었다.

1주차 마무리와 함께 코로나19로 인한 재택수업이 결정되고, 루터회관에 모인 마지막 날에 1주차 페어였던 시카가 싱글톤 패턴에 대한 이야기를 해 주며 같이 만들었던 LottoMachine 클래스에 적용시킨 모습을 보여 주었다. 싱글톤 객체의 정의가 무엇인가. 찾아 보았다.

싱글톤 패턴이란 **객체를 하나만 생성하여 생성된 하나의 객체를 어디에서든 참조하도록** 하는 것이다.

즉 유틸리티 클래스를 만들거나, 불필요하게 매번마다 45개의 공을 모두 생성할 필요 없이 45개의 공이 포함된 인스턴스를 한 번만 생성하고, 공이 필요할 때 꺼내서 쓰도록 하자는 것이다.

`public class LottoMachine {


     ...

    private final List<LottoNumber> lottoNumbers; // 1번부터 45번까지의 로또번호를 저장할 리스트

	private LottoMachine() { 
		lottoNumbers = new ArrayList<>();
		for (int i = MIN_LOTTO_NUMBER; i <= MAX_LOTTO_NUMBER; i++) {
			lottoNumbers.add(new LottoNumber(i));
		}
	}`

싱글톤 패턴을 적용시킨 클래스는 생성자가 private이어야 한다. 단 하나의 인스턴스 이외의 새로운 인스턴스를 만들지 못하도록!

생성자의 내용을 보다시피 LottoMachine 객체는 단 한 번 생성될 때 1번부터 45번까지의 로또 번호(LottoNumber) 객체를 만들어 리스트에 넣고 가지고 있어야 한다.

생성자가 막혀 있는데 생성은 어떻게 하는가? 이건 이 쪽에서 담당한다.

`	private static class LottoMachineSingletonHolder {
		private static final LottoMachine instance = new LottoMachine();
	}
	
	public static LottoMachine getInstance() {
		return LottoMachineSingletonHolder.instance;
	}`

LottoMachine의 정적 메소드인 LottoMachineSingletonHolder가 인스턴스를 만든다. 이 메소드는 getInstance()를 통해 호출된다.

LottoMachine을 사용할 땐 이렇게 getInstance()를 통해 매번 같은 인스턴스를 불러오게 된다.

`LottoMachine.getInstance().pickBall(1); // 1번 공 뽑기`
This post is licensed under CC BY 4.0 by the author.

씽크패드 X1 Carbon 5세대 액정 4K로 개조하기 - 1. 자료 수집

갤럭시 S20 울트라 체험후기.

Comments powered by Disqus.