우테코 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번 공 뽑기`
Comments powered by Disqus.