๐Ÿƒโ€โ™€๏ธํ”„๋ฆฌ์ฝ”์Šค ๋‹ค์‹œ ํ’€๊ธฐ - ๋กœ๋˜

๊น€์˜์šฐยท2022๋…„ 12์›” 4์ผ
2
post-thumbnail

๐ŸŽฏ ๋ชฉํ‘œ

  • ํ”„๋ฆฌ์ฝ”์Šค 4์ฃผ์ฐจ๊นŒ์ง€์˜ ํ”ผ๋“œ๋ฐฑ ์‚ฌํ•ญ ๋ชจ๋‘ ๋ฐ˜์˜ํ•˜๊ธฐ
  • ํ”ผ์–ด ๋ฆฌ๋ทฐ ์‚ฌํ•ญ ๋ฐ˜์˜ํ•˜๊ธฐ

๐Ÿงฉ MVC ํŒจํ„ด ์ ์šฉ

4์ฃผ์ฐจ์— ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณธ MVC ํŒจํ„ด์„ ์—ฐ์Šตํ•˜๊ณ ์ž ์ง€๋‚˜์˜จ ๋ชจ๋“  ํ”„๋ฆฌ์ฝ”์Šค ๋ฏธ์…˜์— MVC ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด๊ณ  ์žˆ๋‹ค.

์ด์ „ ๋ฏธ์…˜์ด์—ˆ๋˜ ์ˆซ์ž ์•ผ๊ตฌ์— ์ ์šฉํ•œ ๋‚ด์šฉ์€ ๐Ÿƒโ€โ™€๏ธํ”„๋ฆฌ์ฝ”์Šค ๋‹ค์‹œ ํ’€๊ธฐ - ์ˆซ์ž ์•ผ๊ตฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“Š ๋ชจ๋ธ

๋จผ์ € ๋กœ๋˜ ๊ฒŒ์ž„์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

  • ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก
  • ๊ตฌ๋งคํ•œ ๊ฐ ๋กœ๋˜๋“ค์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ
  • ๋‹น์ฒจ ๋ฒˆํ˜ธ
  • ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ
  • ๋‹น์ฒจ ํ†ต๊ณ„ (๋“ฑ์ˆ˜)
  • ์ด ์ˆ˜์ต๋ฅ 

โ—๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก

๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์€ ๊ตฌ์ž…ํ•  ๋กœ๋˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฑฐ๊พธ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ตฌ์ž…ํ•œ ๋กœ๋˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ตณ์ด ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฐ’์ธ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.


โ—๊ตฌ๋งคํ•œ ๊ฐ ๋กœ๋˜๋“ค์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ

๋กœ๋˜ ๊ฒŒ์ž„์—๋Š” #numbers ๋ผ๋Š” ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ Lotto ๊ฐ์ฒด๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ๋‹ค. ์ž…๋ ฅ๋œ ๊ตฌ์ž… ๊ธˆ์•ก์— ๋งž๋Š” ๊ฐœ์ˆ˜์˜ Lotto ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ตฌ์ž…ํ•œ ๋กœ๋˜๋“ค์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.


โ—๋‹น์ฒจ ๋ฒˆํ˜ธ

์ฃผ์–ด์ง„ ๋กœ๋˜ ๊ฒŒ์ž„์—์„œ๋Š” ๊ตฌ์ž…ํ•œ ๋กœ๋˜๋“ค์˜ ๊ฐ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๋‹น์ฒจ๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•ด ๋‹น์ฒจ ๋“ฑ์ˆ˜ ํ†ต๊ณ„, ์ˆ˜์ต๋ฅ ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” ๋”ฐ๋กœ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.


โ—๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ

์•ž์˜ ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹น์ฒจ ๋“ฑ์ˆ˜ ํ†ต๊ณ„, ์ˆ˜์ต๋ฅ ์„ ๊ณ„์‚ฐํ•  ๋•Œ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๊ฐ€ ์“ฐ์ด๋ฏ€๋กœ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ๋˜ํ•œ ๋”ฐ๋กœ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.


โ—๋‹น์ฒจ ํ†ต๊ณ„ (๋“ฑ์ˆ˜)

๋‹น์ฒจ ํ†ต๊ณ„๋Š” ๊ตฌ์ž…ํ•œ ๋กœ๋˜๋“ค์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ, ๋‹น์ฒจ ๋ฒˆํ˜ธ, ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๊ฐ€ ์žˆ์œผ๋ฉด ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.


โ—์ด ์ˆ˜์ต๋ฅ 

์•ž์˜ ๋‹น์ฒจ ํ†ต๊ณ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ์ˆ˜์ต๋ฅ ๋„ ๋‹ค๋ฅธ ๊ฐ’๋“ค๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ๊ฒฐ์ •ํ–ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ๋ชจ๋ธ์— ์ €์žฅํ•  ๊ฐ’์€ ๋กœ๋˜ ๋ฒˆํ˜ธ, ๋‹น์ฒจ ๋ฒˆํ˜ธ, ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.


๐Ÿ–ฅ๏ธ ๋ทฐ

๋จผ์ € ์ฃผ์–ด์ง„ ๋กœ๋˜ ๊ฒŒ์ž„์˜ ์‹คํ–‰ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž

๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
8000

8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]

๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
1,2,3,4,5,6

๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
7

๋‹น์ฒจ ํ†ต๊ณ„
---
3๊ฐœ ์ผ์น˜ (5,000์›) - 1๊ฐœ
4๊ฐœ ์ผ์น˜ (50,000์›) - 0๊ฐœ
5๊ฐœ ์ผ์น˜ (1,500,000์›) - 0๊ฐœ
5๊ฐœ ์ผ์น˜, ๋ณด๋„ˆ์Šค ๋ณผ ์ผ์น˜ (30,000,000์›) - 0๊ฐœ
6๊ฐœ ์ผ์น˜ (2,000,000,000์›) - 0๊ฐœ
์ด ์ˆ˜์ต๋ฅ ์€ 62.5%์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด UI ๋กœ์ง์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

  • ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๊ธฐ๋Šฅ
  • ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๊ธฐ๋Šฅ
  • ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๊ธฐ๋Šฅ
  • ๊ตฌ์ž…ํ•œ ๋กœ๋˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ ๊ธฐ๋Šฅ
  • ๊ตฌ์ž…ํ•œ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ๊ธฐ๋Šฅ
  • ๋‹น์ฒจ ํ†ต๊ณ„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ

โŒจ๏ธ ์ž…๋ ฅ ๊ธฐ๋Šฅ

์ž…๋ ฅ ๊ธฐ๋Šฅ 3๊ฐ€์ง€๋Š” InputView ๊ฐ์ฒด์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

const InputView = {
  readPurchasePrice(callback) {
    this.getUserInput(GuideString.INPUT_PURCHASE_PRICE, callback);
  },

  readWinningNumber(callback) {
    this.getUserInput(GuideString.INPUT_WINNING_NUMBER, callback);
  },

  readBonusNumber(callback) {
    this.getUserInput(GuideString.INPUT_BONUS_NUMBER, callback);
  },

  getUserInput(guide, callback) {
    Console.readLine(guide, (input) => {
      callback(input);
    });
  },
};

์„ธ ์ž…๋ ฅ ๋ชจ๋‘ ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ์— ์žˆ๋˜ Console.readLine์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„์˜จ๋‹ค๋Š” ๊ณตํ†ต ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค. ์ด ๋ถ€๋ถ„์„ getUserInput์œผ๋กœ ๋ฌถ์–ด ์ฒ˜๋ฆฌํ–ˆ๊ณ , ์™ธ๋ถ€ ํ•จ์ˆ˜์—์„œ ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.


๐Ÿ–จ๏ธ ์ถœ๋ ฅ ๊ธฐ๋Šฅ

๊ตฌ์ž…ํ•œ ๋กœ๋˜ ๊ฐœ์ˆ˜์™€ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ฐ๊ฐ ๊ฐœ์ˆ˜, ๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐฐ์—ด์„ ์ž…๋ ฅ ๋ฐ›์•„ ์ฃผ์–ด์ง„ ํ˜•์‹์— ๋งž๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ์–ด ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

printPurchaseAmount(amount) {
  Console.print(`${amount}๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.`);
},

printLottos(lottos) {
  for (let i = 0; i < lottos.length; i++) {
    Console.print(`[${lottos[i].getSortedLottoNumber().join(", ")}]`);
  }
},

๋‹น์ฒจ ํ†ต๊ณ„๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์—์„œ ๋‹น์ฒจ ๋“ฑ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘” ์ถœ๋ ฅ ๋ฌธ๊ตฌ์— ๋‹น์ฒจ ๋“ฑ์ˆ˜ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

printRankStatistic(winningStatistic) {
  const raps = winningStatistic.length;

  for (let i = 0; i < raps; i++) {
    Console.print(
      StatisticString[i] +
      `${winningStatistic[StaticNumber.TOTAL_LOTTO_RANKS - 1 - i]}๊ฐœ`
    );
  }
},

์ด ์ˆ˜์ต๋ฅ ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์€ ์ด ์ˆ˜์ต๋ฅ ์„ ์ž…๋ ฅ๋ฐ›์•„ ์ฃผ์–ด์ง„ ์ถœ๋ ฅ ํ˜•์‹์— ๋งž๋Š” ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๊ณ , ํ”„๋กœ๊ทธ๋žจ์˜ ์ข…๋ฃŒ ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Console.close๋ฅผ ํ˜ธ์ถœํ•ด ์ฝ˜์†”์„ ์ข…๋ฃŒ ์‹œ์ผœ์ฃผ๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

printRevenueRate(revenueRate) {
  Console.print(`์ด ์ˆ˜์ต๋ฅ ์€ ${revenueRate}%์ž…๋‹ˆ๋‹ค.`);
  Console.close();
},

๐ŸŽ›๏ธ ์ปจํŠธ๋กค๋Ÿฌ

๋ชจ๋ธ์€ ๊ตฌ์ž…ํ•œ ๋กœ๋˜ ๊ฐ์ฒด ๋ฐฐ์—ด, ๋‹น์ฒจ ๋ฒˆํ˜ธ, ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ๊ฐ’๋“ค์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ, ๋‹น์ฒจ ๋“ฑ์ˆ˜ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ, ์ˆ˜์ต๋ฅ  ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

  1. InputView ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  2. ๊ตฌ์ž… ๊ธˆ์•ก์— ๋งž๋Š” ๊ฐœ์ˆ˜์˜ Lotto ๊ฐ์ฒด ์ƒ์„ฑ
    - OutputView ๊ตฌ์ž…ํ•œ ๋กœ๋˜ ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  3. InputView ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  4. InputView ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  5. ๋‹น์ฒจ ํ†ต๊ณ„ ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
    - OutputView ๋‹น์ฒจ ํ†ต๊ณ„ ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  6. ์ด ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
    • OutputView ์ด ์ˆ˜์ต๋ฅ  ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

์œ„์—์„œ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒŒ์ž„ ๋กœ์ง์„ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค.


๐Ÿ”ง ํ”ผ์–ด ๋ฆฌ๋ทฐ ์‚ฌํ•ญ ๋ฐ˜์˜ํ•˜๊ธฐ

ํ”„๋ฆฌ์ฝ”์Šค ์ดํ›„ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ”ผ์–ด ๋ฆฌ๋ทฐ๋ฅผ ์‹ ์ฒญํ–ˆ๋Š”๋ฐ ๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ๋ฆฌ๋ทฐ๋ฅผ ๋‚จ๊ฒจ์ค€ ๋ถ„๋“ค์ด ๊ณ„์…จ๋‹ค. ์ฒ˜์Œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ๊ณผ ๊ฐœ์„  ๋ฐฉ์•ˆ์„ ์นœ์ ˆํžˆ ๋‚จ๊ฒจ์ฃผ์–ด ์ด๋ฅผ ์ ์šฉํ•ด๋ณด์•˜๋‹ค.


โ›” getter, setter์˜ ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ

ํ”ผ์–ด ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ์ด์•ผ๊ธฐ ํ•ด์ฃผ์‹  ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์ด ์ด ๋ถ€๋ถ„์ด์—ˆ๋‹ค. setter๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ• ์ˆ˜๋ก ์ €์žฅ๋˜๋Š” ๊ฐ’์˜ ๋ณ€๊ฒฝ ์œ„ํ—˜์„ฑ์ด ๋†’์•„์ง€๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ถœ๋ ฅ์„ ์œ„ํ•œ getter ๋“ฑ๊ณผ ๊ฐ™์ด ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  getter์™€ setter์˜ ์‚ฌ์šฉ์€ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ํ”ผ์–ด ๋ฆฌ๋ทฐ ๋‚ด์šฉ์„ ๋ณด๊ณ ๋‚œ ํ›„ ๋‚ด ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค.

๋จผ์ € ํ”ผ์–ด ๋ฆฌ๋ทฐ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ธฐ ์ „ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

class LottoGame{
  #lottos = [];
  #winningNumber;
  #bonusNumber;
 
  constructor() {}

  getLottos(){
    return this.#lottos;
  }

  setWinningNumber(winningNumber){
    this.#winningNumber = winningNumber;
  }

  setBonusNumber(bonusNumber){
    this.#bonusNumber = bonusNumber;
  }
}

์œ„ ์ฝ”๋“œ๋Š” ๋ชจ๋ธ๋กœ ์‚ฌ์šฉํ–ˆ๋˜ LottoGame ํด๋ž˜์Šค ์ฝ”๋“œ ์ค‘ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค. ๋ชจ๋ธ์˜ ๊ฐ ํ•„๋“œ ๊ฐ’์„ ์™ธ๋ถ€์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์ฑ„์›Œ์ฃผ๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋ชจ๋ธ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ’์˜ ๋ณ€๊ฒฝ ์œ„ํ—˜์„ฑ์ด ๋†’์•„์ง€๊ฒŒ ๋œ๋‹ค.

class LottoGameController{
  #lottoGame = new LottoGame();
  
  constructor() {}

  inputPurchasePrice(){
    InputView.readPurchasePrice((input)=>{
      const purchaseAmount = input / 1000;
      
      for(let i = 0; i < purchaseAmount; i++){
        this.#lottoGame.getLottos()
          .push(new Lotto(LottoNumberGenerator.generate()));
      }  
    })
  }
}

์œ„ ์ฝ”๋“œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ผ๋ถ€์ด๋‹ค. ๋ฐ˜๋ณต๋ฌธ ๋ถ€๋ถ„์„ ๋ณด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ชจ๋ธ์˜ ๊ฐ’์— ์ ‘๊ทผํ•ด ์ง์ ‘์ ์œผ๋กœ Lotto ์ธ์Šคํ„ด์Šค๋ฅผ push ํ•ด์ฃผ๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์•ž์„  ์˜ˆ์‹œ์™€ ๊ฐ™์ด ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋ธ ๋‚ด๋ถ€์˜ ๊ฐ’์— ์–ธ์ œ๋“ ์ง€ ์ ‘๊ทผํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฏ€๋กœ ์ข‹์ง€ ๋ชปํ•œ ์ฝ”๋“œ์ด๋‹ค.


โœ… ๊ฐœ์„  ๋ฐฉ๋ฒ•: ํด๋ž˜์Šค ๋ถ„๋ฆฌ

์•ž์—์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋˜ setter, getter์˜ ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ์„ ๋‚˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ฐœ์„ ํ•ด๋ณด๊ณ ์ž ํ–ˆ๋‹ค.

LottoGame => PurchasedLottos, WinningNumber, BonusNumber

ํฐ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์„ ์—ฌ๋Ÿฌ ๋ชจ๋ธ๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค. ๊ตฌ์ž…๋œ ๋กœ๋˜๋“ค, ๋‹น์ฒจ ๋ฒˆํ˜ธ, ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ๊ฐ๊ฐ์€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋”ฐ๋ผ ์ƒ์„ฑ๋˜์–ด ์ €์žฅ๋˜๋Š” ๊ฐ’๋“ค์ด๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์— ํ•„๋“œ๋งŒ ์„ ์–ธํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋งž์ถ”์–ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์ƒํ•ด ํ•„๋“œ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์•˜๋‹ค. ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

class LottoGameController{
  #lottos;
  #winningNumber;
  #bonusNumber;
  
  constructor() {}
  
  inputPurchasePrice(){
    InputView.readPurchasePrice((input)=>{
      this.#lottos = new PurchasedLottos(input);
    });
  }

  inputWinningNumber(){
    InputView.readWinningNumber((input)=>{
      this.#winningNumber = new WinningNumber(input);
    });
  }

  inputBonusNumber(){
    InputView.readBonusNumber((input)=>{
      this.#bonusNumber = new BonusNumber(input);
    });
  }
}
// ๊ตฌ์ž…ํ•œ ๋กœ๋˜ ๊ฐ์ฒด ๋ฐฐ์—ด ์ €์žฅ ๋ชจ๋ธ
class PurchasedLottos{
  #lottos = [];
  
  constructor(input){
    validate(input);
    
    for(let i = 0; i < input / 1000; i++){
      this.#lottos.push(new Lotto(LottoNumberGenerator.generate());
    }
  }

  validate(input){
    // ๊ตฌ์ž… ๊ธˆ์•ก ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง
  }

  getLottos(){
    return this.#lottos;
  }
}

// ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ €์žฅ ๋ชจ๋ธ
class WinningNumber{
  #winnigNumber;
  
  constructor(input){
    validate(input);
    
    this.#winningNuber = input.split(",");
  }

  validate(input){
    // ๋‹น์ฒจ ๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง
  }

  getWinningNumber(){
    return this.#winningNumber;
  }
}

// ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ €์žฅ ๋ชจ๋ธ
class BonusNumber{
  #bonusNumber;
  
  constructor(input){
    validate(input);
    
    this.#bonusNumber = input;
  }

  validate(input){
    // ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง
  }

  getBonusNumber(){
    return this.#bonusNumber;
  }
}

์ด์ œ๋Š” ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ ๋ชจ๋ธ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด ์ž…๋ ฅ๊ฐ’์„ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•„์š”ํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด์ „ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ผ์ง„ ์ ์€ ๊ฐ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด ์—†์–ด ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


โ›” ํ•˜๋“œ ์ฝ”๋”ฉ

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’์€ ๊ทธ ๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ์•Œ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ๋ณ€๊ฒฝ์ ์ด ์ƒ๊ฒผ์„ ๋•Œ ๋Œ€์ฒ˜ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜๋ฏธ์žˆ๋Š” ๊ฐ’๋“ค์€ ๋ชจ๋‘ ์ƒ์ˆ˜ํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ํ”ผ์–ด ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๋‹ˆ ์ด๋ฒˆ ๋‚ด ์ฝ”๋“œ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ๋ถ€๋ถ„๋“ค์ด ๋ช‡๊ฐ€์ง€ ์žˆ์—ˆ๋‹ค.

๋จผ์ € ํ”ผ์–ด ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์ „ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

class Lotto{
  validate(numbers){
    if (numbers.length !== 6) 
      throw new Error(ErrorString.LOTTO_COUNT_ERROR);
    if (numbers.filter((v) => v > 45 || v < 1).length > 0)
      throw new Error(ErrorString.LOTTO_OUT_OF_RANGE_ERROR);
  }
}

์œ„ ์ฝ”๋“œ๋Š” ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ผ ์ƒ์„ฑ๋˜๋Š” ๋กœ๋˜ ํด๋ž˜์Šค์˜ ์ผ๋ถ€์ด๋‹ค. validate ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋‚ด๋ถ€์— numbers.length๋ฅผ 6์ด๋ผ๋Š” ์ˆซ์ž์™€ ๋น„๊ตํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ด๋•Œ ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์„ ๋ณด์ง€ ์•Š๊ณ  6์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ๋ณด๋ฉด ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๊ฐ’์ธ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋˜, numbers ๋ฐฐ์—ด์— filter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋œ 45, 1์ด๋ผ๋Š” ๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.


validatePurchasePrice(input){
  if (input % 1000 !== 0 || Number(input) === 0)
    throw new Error(ErrorString.PURCHASE_PRICE_UNIT_ERROR);
}

์œ„ ์ฝ”๋“œ๋Š” ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ์ด๋•Œ input % 1000 !== 0์ด๋ผ๋Š” ์กฐ๊ฑด์„ ํ™•์ธํ•  ๋•Œ 1000์ด๋ž€ ์ˆซ์ž์˜ ์˜๋ฏธ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ์•ž์„œ์„œ ์ด์•ผ๊ธฐํ•œ ๊ฐ’๋“ค์„ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์˜จ๋‹ค๋ฉด ์ด๋ฅผ ๋Œ€์ฒ˜ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.


โœ… ๊ฐœ์„  ๋ฐฉ๋ฒ•: ์ƒ์ˆ˜ํ™”

const StaticNumber = Object.freeze({
  PRICE_FOR_ONE_LOTTO: 1_000,
  LOTTO_NUMBER_RANGE_START: 1,
  LOTTO_NUMBER_RANGE_END: 45,
  LOTTO_NUMBER_COUNT: 6,
  TOTAL_LOTTO_RANKS: 5,
  REVENUE_SIGNIFICANT_FIGURES: 1,
});

ํ•˜๋“œ ์ฝ”๋”ฉ๋œ ๊ฐ’๋“ค์„ ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐ’ ๋ณ€๊ฒฝ์— ๋Œ€์ฒ˜ํ•˜๊ธฐ ์‰ฝ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๊ฐ’๋“ค์„ ์‚ฌ์šฉํ•  ๋•Œ ์ง์ ‘์ ์œผ๋กœ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘” ์ƒ์ˆ˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ณ€๊ฒฝ์— ๋Œ€์ฒ˜ํ•˜๊ธฐ ์‰ฝ๊ณ  (์ƒ์ˆ˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง), ์ƒ์ˆ˜์˜ ์ด๋ฆ„์„ ํ†ตํ•ด ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ง€๊ฒŒ ๋œ๋‹ค.

๋‚˜๋ฆ„ ์ƒ์ˆ˜ํ™”๋ฅผ ํ•ด๋ณธ๋‹ค๊ณ  ํ–ˆ์ง€๋งŒ ๋ฏธ์ฒ˜ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„๋“ค์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฒˆ ํ”ผ์–ด ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ์ข€ ๋” ์„ธ์„ธํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ์ƒ์ˆ˜ํ™” ํ•˜๋Š” ์—ฐ์Šต์˜ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.


๐Ÿ‘‹ ๋งˆ๋ฌด๋ฆฌ

์ˆซ์ž ์•ผ๊ตฌ๋ฅผ ๋‹ค์‹œ ํ’€์–ด๋ณด์•˜์„ ๋•Œ ๋Š๋ผ๋Š” ์ ์ด ๋งŽ์•„ ๋กœ๋˜ ๊ฒŒ์ž„ ๋˜ํ•œ ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด์•˜๋‹ค. ์ด๋ฏธ ํ”„๋ฆฌ์ฝ”์Šค ์žฌ์‹œ๋„๊นŒ์ง€ ๊ฒฝํ—˜ํ•ด๋ณธ ํ›„๋ผ ์ด์ „ ํ”ผ๋“œ๋ฐฑ ์‚ฌํ•ญ์„ ์ž˜ ์ง€์ผฐ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”ผ์–ด ๋ฆฌ๋ทฐ๋ฅผ ์‹ ์ฒญํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ์ž˜ ์ง€ํ‚ค์ง€ ๋ชปํ•œ ๋ถ€๋ถ„๋“ค์ด ๋งŽ์ด ๋‚จ์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ฆฌ์ฝ”์Šค๊ฐ€ ๋๋‚˜๊ณ ๋„ ํ”ผ์–ด ๋ฆฌ๋ทฐ๋ฅผ ๋‚จ๊ฒจ์ฃผ์‹  ๋ถ„๋“ค ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

profile
๋ถˆํŽธํ•œ ์ผ๋“ค์„ ๊ฐœ๋ฐœ๋กœ ํ’€์–ด๋‚ด๊ณ  ์‹ถ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€