๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค 6๊ธฐ ์ง€์› ๊ธฐ๋ก

[ํ”„๋ฆฌ์ฝ”์Šค] ํ”„๋ฆฌ์ฝ”์Šค 3์ฃผ์ฐจ ํ›„๊ธฐ (๋กœ๋˜ ๐ŸŽฑ)

by dev_writer 2023. 11. 14.

์ด๋ฒˆ์—๋Š” ์ฒ˜์Œ ํ•ด ๋ณด๋Š” ๋ฌธ์ œ์˜€์œผ๋‚˜, ๋‚˜๋ฆ„ ์ถ”์ธกํ–ˆ๋˜ (?) ๋ฌธ์ œ์˜€๋˜ ๋กœ๋˜ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

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์€ ๊ณต๋ถ€ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๊ณ ๋ฏผํ•˜๊ณ  ๊ณต๋ถ€ํ•  ๊ฒŒ ๊ณ„์† ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์—์„œ ์ƒ์ˆ˜์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ๋•Œ์˜ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ•์ด ์ € ๋ฐฉ์‹๋ฐ–์— ์—†์„๊นŒ๋ผ๋Š” ๊ณ ๋ฏผ์ด ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ํ”„๋ฆฌ์ฝ”์Šค๋ฅผ ํ•œ ๋•๋ถ„์— ์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ๋“ค์„ ํ•  ์ˆ˜ ์žˆ๋˜ ๊ฒƒ ๊ฐ™์•„ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

 

์–ด๋Š๋ง ๋งˆ์ง€๋ง‰ ๋ฏธ์…˜์„ ๊ฐœ๋ฐœ ์ค‘์— ์žˆ๋Š”๋ฐ, ์–ผ๋งˆ ๋‚จ์ง€ ์•Š์€ ํ”„๋ฆฌ์ฝ”์Šค๋ฅผ ๋ฌด์‚ฌํžˆ ์™„๋ฃŒํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ํ›„๊ธฐ๋„ ์ด์–ด์„œ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค :)

 

ํ‹€๋ฆฐ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์ง€์ ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!!

์ตœ์ข… ์ œ์ถœ

์ด๊ณณ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.