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();
},
๋ชจ๋ธ์ ๊ตฌ์ ํ ๋ก๋ ๊ฐ์ฒด ๋ฐฐ์ด, ๋น์ฒจ ๋ฒํธ, ๋ณด๋์ค ๋ฒํธ๋ฅผ ์ ์ฅํ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ๊ฐ๋ค์ ๋ฐํํ๋ ๋ฉ์๋, ๋น์ฒจ ๋ฑ์ ๋ฐฐ์ด ๋ฐํ ๋ฉ์๋, ์์ต๋ฅ ๋ฐํ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ปจํธ๋กค๋ฌ์์๋ ์ด๋ฅผ ํ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋๋ก ๊ตฌํํ๋ค.
InputView
๊ตฌ์ ๊ธ์ก ์ ๋ ฅ ๋ฉ์๋ ํธ์ถ
- ๊ตฌ์ ๊ธ์ก์ ๋ง๋ ๊ฐ์์
Lotto
๊ฐ์ฒด ์์ฑ
-OutputView
๊ตฌ์ ํ ๋ก๋ ์ถ๋ ฅ ๋ฉ์๋ ํธ์ถ
InputView
๋น์ฒจ ๋ฒํธ ์ ๋ ฅ ๋ฉ์๋ ํธ์ถ
InputView
๋ณด๋์ค ๋ฒํธ ์ ๋ ฅ ๋ฉ์๋ ํธ์ถ
- ๋น์ฒจ ํต๊ณ ๊ณ์ฐ ๋ฉ์๋ ํธ์ถ
-OutputView
๋น์ฒจ ํต๊ณ ์ถ๋ ฅ ๋ฉ์๋ ํธ์ถ
- ์ด ์์ต๋ฅ ๊ณ์ฐ ๋ฉ์๋ ํธ์ถ
OutputView
์ด ์์ต๋ฅ ์ถ๋ ฅ ๋ฉ์๋ ํธ์ถ
์์์ ๋ณด์ด๋ ๊ฒ๊ณผ ๊ฐ์ด ์ปจํธ๋กค๋ฌ๋ ๋ฉ์๋ ํธ์ถ๋ง์ ์ํํ๋ ๋ฐฉ์์ผ๋ก ๊ฒ์ ๋ก์ง์ ๋์ํ๊ฒ ํ๋ค.
ํ๋ฆฌ์ฝ์ค ์ดํ ์์ฑํ ์ฝ๋์ ๋ํด ํผ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ ์ฒญํ๋๋ฐ ๊ฐ์ฌํ๊ฒ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ฒจ์ค ๋ถ๋ค์ด ๊ณ์ จ๋ค. ์ฒ์ ๋ด๊ฐ ์๊ฐํ๋ ๋ฐฉ์์ ๋ฌธ์ ์ ๊ณผ ๊ฐ์ ๋ฐฉ์์ ์น์ ํ ๋จ๊ฒจ์ฃผ์ด ์ด๋ฅผ ์ ์ฉํด๋ณด์๋ค.
ํผ์ด ๋ฆฌ๋ทฐ๋ฅผ ํตํด ์ด์ผ๊ธฐ ํด์ฃผ์ ๊ฒ ์ค ๊ฐ์ฅ ์ด๋ ค์ ๋ ๋ถ๋ถ์ด ์ด ๋ถ๋ถ์ด์๋ค. 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,
});
ํ๋ ์ฝ๋ฉ๋ ๊ฐ๋ค์ ์๋ฏธ๋ฅผ ํ์ ํ๊ธฐ ์ฝ๊ณ , ๊ฐ ๋ณ๊ฒฝ์ ๋์ฒํ๊ธฐ ์ฝ๋๋ก ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํด๋น ๊ฐ๋ค์ ์ฌ์ฉํ ๋ ์ง์ ์ ์ผ๋ก ์ซ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฏธ๋ฆฌ ์ ์ธํด๋ ์์๊ฐ์ ์ฌ์ฉํ๊ฒ ๋๋ฏ๋ก ๋ณ๊ฒฝ์ ๋์ฒํ๊ธฐ ์ฝ๊ณ (์์ ๊ฐ๋ง ๋ณ๊ฒฝํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ์ด ๊ฐ๋ฅํด์ง), ์์์ ์ด๋ฆ์ ํตํด ์๋ฏธ๋ฅผ ํ์ ํ๊ธฐ๋ ์ฌ์์ง๊ฒ ๋๋ค.
๋๋ฆ ์์ํ๋ฅผ ํด๋ณธ๋ค๊ณ ํ์ง๋ง ๋ฏธ์ฒ ์๊ฐํ์ง ๋ชปํ ๋ถ๋ถ๋ค์ด ํ๋์ฝ๋ฉ๋๊ณ ์๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์๋ค. ์ด๋ฒ ํผ์ด ๋ฆฌ๋ทฐ๋ฅผ ํตํด ์ข ๋ ์ธ์ธํ ๋ถ๋ถ๊น์ง ์์ํ ํ๋ ์ฐ์ต์ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋์๋ค.
์ซ์ ์ผ๊ตฌ๋ฅผ ๋ค์ ํ์ด๋ณด์์ ๋ ๋๋ผ๋ ์ ์ด ๋ง์ ๋ก๋ ๊ฒ์ ๋ํ ๋ค์ ์๋ํด ๋ณด์๋ค. ์ด๋ฏธ ํ๋ฆฌ์ฝ์ค ์ฌ์๋๊น์ง ๊ฒฝํํด๋ณธ ํ๋ผ ์ด์ ํผ๋๋ฐฑ ์ฌํญ์ ์ ์ง์ผฐ๋ค๊ณ ์๊ฐํ์๋ค. ํ์ง๋ง ํผ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ ์ฒญํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ ์๊ฐ๋ณด๋ค ์ ์งํค์ง ๋ชปํ ๋ถ๋ถ๋ค์ด ๋ง์ด ๋จ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
์ ์ฒด ์ฝ๋๋ ๋ค์ ๋งํฌ๋ฅผ ํตํด ํ์ธํด๋ณผ ์ ์๋ค.
ํ๋ฆฌ์ฝ์ค๊ฐ ๋๋๊ณ ๋ ํผ์ด ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ฒจ์ฃผ์ ๋ถ๋ค ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!!