์ด๋ฒ์๋ ์ฒ์ ํด ๋ณด๋ ๋ฌธ์ ์์ผ๋, ๋๋ฆ ์ถ์ธกํ๋ (?) ๋ฌธ์ ์๋ ๋ก๋ ๋ฌธ์ ์์ต๋๋ค.
Enum์ ๋ํด ๋ ๊น์ ๊ด์ฐฐ๊ณผ ๊ณ ๋ฏผ์ ํ๊ฒ ๋จ
1์ฃผ ์ฐจ ๋ ์ดํํฐ๋ธ ์๋ฐ๋ฅผ ๋ณด๋ฉฐ ๊ณต์ฉ ์์๋ Enum์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค๋ ๊ธ์ ์ผ์๋๋ฐ์, ์ด๋ฒ ๋ฏธ์ ์์๋ ์์ ์๊ตฌ์ฌํญ์ผ๋ก Java Enum์ ์ ์ฉํ๋ ๊ฒ ์์์ต๋๋ค! ๊ทธ๋์ ์ดํํฐ๋ธ ์๋ฐ์์ Enum์ ๋ํด ๋ฏธ์ฒ ์์ง ๋ชปํ๋ ๋ถ๋ถ๋ค์ ์ฝ๊ฑฐ๋, ๋ค๋ฅธ ์๋ฃ๋ฅผ ๋ ์ฐพ์๋ณด๊ณค ํ์์ต๋๋ค.
์ธ์ Enum์ ์ฐ๊ณ ์ธ์ private static final์ ์จ์ผ ํ ๊น? (feat. ์์ง๋)
1์ฃผ ์ฐจ ๋ ์์ฑ๋ ๊ธ์ ๋ณด๋ฉด, ๊ฐ์ฒด์ private ํ๊ฒ ์ฌ์ฉ๋๋ ์์๋ ํ์ ๋ฐฉ์์ ์ฐ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด Enum์ ํตํด ๊ด๋ฆฌํ๋๋ก ํ๋ ๊ฒ ์ข๋ค๊ณ ํ์๋๋ฐ์. ์์ฌ์ด ์ ์ ์์ง๋์ ๋ํด์ ์๊ฐํด๋ณด์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๋ค. (Validator์ ๋ํด ์์ง๋๋ฅผ ๊ณต๋ถํ์ผ๋ Enum์ ๋ํด์๋ ์๊ฐํด๋ณด์ง ๋ชปํ๋ ๊ฒ์ด ์ด์ ๊ฐ์ต๋๋ค.)
์ด๋ฒ ๋ฏธ์ ์ ํ๋ฉฐ ๋ด๋ฆฐ ๊ฒฐ๋ก ์ ์ต๋ํ ๊ฐ์ฒด์์๋ง private ํ๊ฒ ์ฌ์ฉ๋์ด์ผ ์์ ๊ด๋ฆฌ์ ์ธ ์ธก๋ฉด์์๋ ๊ฐ์ฒด์ ์์ง๋๊ฐ ์ฌ๋ผ๊ฐ๋ค๋ ์ ์ ๋๋ค. ๊ฐ์ฒด์์๋ง ๊ด๋ฆฌํ๊ณ ์ด ๊ฐ์ ๋ํด ์๊ณ ์์ด์ผ๋ง ์บก์ํ๊ฐ ๋ณด์ฅ๋๋ ํจ๊ณผ๋ ์๊ฒ ์ฃ !
ExceptionMessage์์ ์ฐธ๊ณ ํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
๊ทธ๋ฌ๋ ExceptionMessage ๋ฑ ์์ธ ๋ฉ์์ง์์ ํด๋น ๊ฐ์ฒด์ ์์๋ฅผ ์์์ผ ํ ํ์๊ฐ ์์ ๋๋ ์์ต๋๋ค. ์์๋ก ์ ๋ ๋ก๋์ ์ซ์ ๋ฒ์๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ ์, ์๋์ ๊ฐ์ด ์์ฑํ์์ต๋๋ค.
public enum LottoRule {
MINIMUM_NUMBER(1),
MAXIMUM_NUMBER(45),
LOTTO_NUMBER_LENGTH(6),
...
// ๊ฐ์ฒด์์ LottoRule.validateNumberValue๋ฅผ ํธ์ถํ๋ ์์ผ๋ก ์ด์ฉ
public static void validateNumberValue(final int number) {
if (number > MAXIMUM_NUMBER.value || number < MINIMUM_NUMBER.value) {
throw new IllegalArgumentException(UNVALID_LOTTO_NUMBER.getMessage());
}
}
}
public class LottoMachine {
public static List<Integer> pickNumbers() {
return Randoms.pickUniqueNumbersInRange(MINIMUM_NUMBER.getValue(),
MAXIMUM_NUMBER.getValue(), LOTTO_NUMBER_LENGTH.getValue());
}
}
public enum ExceptionMessage {
UNVALID_LOTTO_NUMBER(
"๋ก๋์์ ์์ฑ๋ ์ ์๋ ์ซ์๊ฐ ์์ต๋๋ค. ๋ก๋ ๋ฒํธ๋ " + MINIMUM_NUMBER.getValue() + " ~ " +
MAXIMUM_NUMBER.getValue() + " ์ฌ์ด์ฌ์ผ ํฉ๋๋ค."
),
...
}
์๋ ๋ก๋ ์ซ์์ ๋ฒ์๋ LottoMachine์์ ๊ด๋ฆฌํ๋ ๊ฒ ์ ํฉํ์ง๋ง, ExceptionMessage์์ ์ฌ์ฉํด์ผ ํ๋ค ๋ณด๋ LottoRule enum์ผ๋ก ๊ด๋ฆฌํ๊ณ ์์์ ๋ณผ ์ ์์ต๋๋ค.
- ๋จ์ํ "๊ฐ์ ๋ฒ์๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค"๋ก ์์ธ ๋ฉ์์ง๋ฅผ ๋์ด๋ค๋ฉด ์์๋ฐฉํธ์ ๋ถ๊ณผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ทฐ๋ ์ธ์ ๋ ์ง ์๊ตฌ์ฌํญ์ด ๋ฐ๋ ์ ์๊ณ , ๊ทธ๋ ๊ธฐ์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์์ธ๋ฅผ ์๋ ค๋ฌ๋ผ๋ ์์ฒญ์ด ๋ค์ด์ฌ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- LottoMachine์์ ์ง์ ์์ธ ๋ฉ์์ง๋ฅผ ๊ด๋ฆฌํ๋ฉด ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ LottoMachine ์ฝ๋๋ฅผ ๋ฐ๊ฟ์ผ ํ ๊ฒ์ ๋๋ค.
- ์์๋ฅผ public์ผ๋ก ์ด์ด๋๋ ๊ฒ์ ์บก์ํ ๊ด์ ์์ ์ ์ข์ ๋ณด์ ๋๋ค.
๊ฒฐ๊ตญ ์ด๋ ๊ฒ ์์ธ ๋ฉ์์ง์์ ์์์ ๋ํด ์์์ผ ํ ๋๊ฐ ์๋ค๋ฉด Enum์ผ๋ก ๋ง๋ค์ด ๊ด๋ฆฌํ๋ ๊ฒ ๋ซ๊ฒ ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ์ต๋๋ค.
์ ๋ค๋ฆญ์ ๋ํ ๊ณ ๋ฏผ & ChatGPT์ ๋ํ ๋ฐ์ฑ
์ด๋ฒ ๋ฏธ์ ๋ถํฐ๋ ์์ธ๊ฐ ๋ฐ์ํ์ ์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ ๊ฒ ์๋, ๊ทธ ์ง์ ๋ถํฐ ๋ค์ ์ ๋ ฅ์ ์์ฒญํ๋ ์์ผ๋ก ์งํํด์ผ ํ์ต๋๋ค.
๋ญ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ค๊ณ ํ์ ๋ ์์ธ๊ฐ ํฐ์ง๋ค๋ฉด ๋ค์ ์์ฑํ๊ฒ๋ ํ๋ฉด ๋ ๊ฒ ๊ฐ์, ์ด ๋ด์ฉ์ ์ฝ๋๋ก ์์ฑํ๋ฉด ๋์ง ์์๊น๋ผ๊ณ ์๊ฐํ์์ต๋๋ค.
ํ์ง๋ง ๋ง๋ ํ ์ ํฉํ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์ ChatGPT๋ฅผ ํ์ฉํ์ฌ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
private Investor initInvestor() {
return createInstance(Investor.class, () -> {
outputView.askInvestMoney();
String investMoneyInput = inputView.readLine();
return Investor.createDefault(investMoneyInput);
});
}
private <T> T createInstance(final Class<T> classType, final Supplier<T> creator) {
T created = null;
while (created == null) {
created = tryGetInstance(creator, created);
}
return created;
}
private <T> T tryGetInstance(final Supplier<T> creator, T created) {
try {
created = creator.get();
} catch (IllegalArgumentException exception) {
outputView.printExceptionMessage(exception.getMessage());
}
return created;
}
- tryGetInstance๋ ํน์ ํด๋์ค๋ฅผ ๋ง๋๋ Supplier ํจ์๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ค๋ ค๊ณ ์๋ํ๊ณ , ์ด ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์์ธ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ ํ created๋ฅผ ๋ฐํํฉ๋๋ค. (์์ธ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด Supplier ํจ์๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ต๋๋ค.)
- createInstance๋ ํน์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ null๋ก ์ค์ ํ ๋ค, ์ด ๊ฐ์ฒด๊ฐ null์ผ ๋๊น์ง tryGetInstance๋ฅผ ํธ์ถํฉ๋๋ค.
- Supplier <T> creator๋ initInvestor์ ๋๋ค์ ๋ถ๋ถ์ ์๋ฏธํฉ๋๋ค. (return Investor.createDefault.. ๋ถ๋ถ)
์ ๋ค๋ฆญ๊ณผ Supplier๋ฅผ ํ์ฉํ์ฌ ๊ตฌํ์ ์๋ฃํ์ง๋ง, ๊ณผ์ ๋ฅผ ์ ์ถํ๋ ์์ ์์๋ ์ ํํ ์๋ฆฌ๋ฅผ ์์ง ๋ชปํ ์ฑ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.
์ด๋ ํ ๊ฒฝ์ฐ์๋ ์ง ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ์๋ฆฌ๋ฅผ ์ตํ ๋ค ๋จ์๊ฒ ์ค๋ช ํ ์ ์์ ๋๋ง ์ธ ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋ค์ ๋๊ผ์ต๋๋ค. ๋ํ์ ์ธ ๋ฌธ์ ๋ก๋ createInstance์์ classType ์ธ์๊ฐ ํ์ ์์ต๋๋ค. initInvestor์์ Investor.class๋ฅผ ์ ์ํ์ง ์์๋ ๋๋ค์ ๋ด๋ถ์์ ์๋ฌต์ ์ผ๋ก ํด๋์ค ํ์ ์ ๋ํ๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฒฐ๋ก
Enum์ ๊ณต๋ถํ ๋๋ง๋ค ๋งค๋ฒ ๊ณ ๋ฏผํ๊ณ ๊ณต๋ถํ ๊ฒ ๊ณ์ ๋์ด๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ํนํ ์์ธ ๋ฉ์์ง์์ ์์์ ๋ํด ์์์ผ ํ ๋์ ๋์ฒ ๋ฐฉ๋ฒ์ด ์ ๋ฐฉ์๋ฐ์ ์์๊น๋ผ๋ ๊ณ ๋ฏผ์ด ๋ญ๋๋ค. ๊ทธ๋ผ์๋ ํ๋ฆฌ์ฝ์ค๋ฅผ ํ ๋๋ถ์ ์ด๋ฌํ ๊ณ ๋ฏผ๋ค์ ํ ์ ์๋ ๊ฒ ๊ฐ์ ์ข์์ต๋๋ค.
์ด๋๋ง ๋ง์ง๋ง ๋ฏธ์ ์ ๊ฐ๋ฐ ์ค์ ์๋๋ฐ, ์ผ๋ง ๋จ์ง ์์ ํ๋ฆฌ์ฝ์ค๋ฅผ ๋ฌด์ฌํ ์๋ฃํ๊ณ ๋ง์ง๋ง ํ๊ธฐ๋ ์ด์ด์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค :)
ํ๋ฆฐ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ์ง์ ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!!
์ต์ข ์ ์ถ
์ด๊ณณ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.