우테코 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.