๐Ÿ“–์šฐํ…Œ์ฝ” 5๊ธฐ ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ ํšŒ๊ณ 

๊น€์˜์šฐยท2022๋…„ 11์›” 9์ผ
0
post-thumbnail

๐ŸŽฏ์ฃผ์ œ

ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ ์ฃผ์ œ๋Š” ์ˆซ์ž์•ผ๊ตฌ ๊ฒŒ์ž„์ด์—ˆ๋‹ค. ์‚ฌ์‹ค 4๊ธฐ ํ”„๋ฆฌ์ฝ”์Šค ๋ฏธ์…˜์„ ๋ฏธ๋ฆฌ ํ’€์–ด๋ดค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋ฆ„ ์ต์ˆ™ํ•œ ์ฃผ์ œ์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ ๋ฏธ์…˜์€ 4๊ธฐ ๋ฏธ์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ html์„ ์ „ํ˜€ ๋‹ค๋ฃจ์ง€ ์•Š์•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜์–ด ์กฐ๊ธˆ ์ƒ‰๋‹ค๋ฅธ ๋Š๋‚Œ์ด์—ˆ๋‹ค.


๐Ÿ˜–์–ด๋ ค์› ๋˜ ์ 

โ—ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

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

๋‹คํ–‰ํžˆ๋„ ์ด๋ฏธ ์ฃผ์–ด์ง„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ApplicationTest.js, StringTest.js ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€๋‚˜ ์ฃผ์–ด์ ธ ์žˆ์—ˆ๊ณ 

๋ฆฌ๋“œ๋ฏธ์— ์นœ์ ˆํžˆ ๊ทธ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ผ๋Š” ๋ง๋„ ์ ํ˜€์žˆ์—ˆ๋‹ค. ๊ณต์‹๋ฌธ์„œ๋„ ๋‚˜๋ฆ„ ์ž์„ธํžˆ ๋‚˜์™€์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ์•„์ฃผ ๊ฐ€๋” ๊ณต์‹๋ฌธ์„œ์˜ ๋‚ด์šฉ๋„ ์ฐธ๊ณ ํ–ˆ๋‹ค.


Jest์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์˜ˆ์‹œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค.

์‚ฌ์šฉ ๋ฐฉ์‹์€ ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค. ๋จผ์ € package.json์—

{
  "scripts": {
    "test": "jest"
  }
}

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , npm test๋ฅผ ์‹คํ–‰ํ•˜๋ฉด

์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด test์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด ์–ด๋–ค ํ…Œ์ŠคํŠธ์ธ์ง€๋ฅผ ๋ช…์‹œํ•ด์ฃผ๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ expect์— ์ฐธ๊ฐ’์ด ์ฃผ์–ด์ง€๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋จ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


test('๋ณผ๊ณผ ์ŠคํŠธ๋ผ์ดํฌ๊ฐ€ ํ•จ๊ป˜ ์žˆ์„ ๋•Œ๋Š” "~๋ณผ ~์ŠคํŠธ๋ผ์ดํฌ"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.', () => {
    const correctNumber = ["123", "456", "789", "159", "753"];
    const inputNumber = ["321", "461", "981", "519", "715"];
    const answer = [
      "2๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ",
      "1๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ",
      "1๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ",
      "2๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ",
      "1๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ",
    ];

    for (let i = 0; i < 5; i++) {
      expect(getHint(correctNumber[i], inputNumber[i])).toEqual(answer[i]);
    }
  });

์œ„ ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์ž‘์„ฑํ–ˆ๋˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ผ๋ถ€์ด๋‹ค. ํ…Œ์ŠคํŠธ ํ•˜๊ณ ์ž ํ–ˆ๋˜ ๊ธฐ๋Šฅ์€ ํžŒํŠธ๋ฅผ ์‚ฐ์ถœํ•˜๋Š” getHint ํ•จ์ˆ˜์˜ ์ •์ƒ ๋™์ž‘ ์—ฌ๋ถ€์˜€๋‹ค.

getHint ํ•จ์ˆ˜๋Š” ์ •๋‹ต๊ณผ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„ ํžŒํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ณ ์ž ๊ฐ€์ƒ์˜ ์ •๋‹ต, ์ž…๋ ฅ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ณ , ์ด ๊ฐ’๋“ค์— ํ•ด๋‹นํ•˜๋Š” ํžŒํŠธ ๋˜ํ•œ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ์ž‘์„ฑํ•˜์—ฌ getHint์— ๊ฐ€์ƒ์˜ ์ •๋‹ต, ์ž…๋ ฅ๊ฐ’์„ ์ „๋‹ฌํ•ด ์ฃผ์—ˆ๊ณ  Jest์˜ toEqual matcher๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ๊ฐ’์ด ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•œ ํžŒํŠธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.

๋‹ค ์ ๊ณ  ๋ณด๋‹ˆ ๋ณด์ž˜๊ฒƒ ์—†์–ด ๋ณด์ด๊ธด ํ•˜์ง€๋งŒ ์ € ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์ธ ์‹œ๊ฐ„์ด ์ƒ๊ฐ๋ณด๋‹ค ๊ธธ์—ˆ๋‹ค. ์ €๋Ÿฐ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ด์ œ ์ˆ˜์›”ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ€์ƒ ํ•จ์ˆ˜ mock function์„ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์ด๋ฒˆ์ฃผ ๋ฏธ์…˜์™„๋ฃŒ๊นŒ์ง€ ํ™•์‹คํžˆ ๊ณต๋ถ€ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์˜ค๋Š˜(11/09) ์‚ฌ๋ž‘๋‹ˆ๋ฅผ ๋นผ๋Ÿฌ ๊ฐ€๋Š” ๋‚ ์ด๋ผ ํ†ต์ฆ์ด ์ข€ ์ค„์–ด๋“ค 11/12๊นŒ์ง€ mock function์„ ๋ถ„์„ํ•ด ํฌ์ŠคํŒ… ํ•˜๊ฒ ๋‹ค. (๋ฐ๋“œ๋ผ์ธ์„ ์•ˆ์žก์œผ๋ฉด ์ ˆ๋Œ€ ์•ˆํ•˜๋Š” ์„ฑ๊ฒฉ์ด๋ผ ๋ธ”๋กœ๊ทธ์— ์ ์–ด๋‘์—ˆ๋‹ค)

mock function ๋ถ„์„
์ด์   ์•ˆ์•„ํ”Œ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์•„์ง๋„ ๋ฝ‘์€ ์ž๋ฆฌ๊ฐ€ ๋”ฐ๊ฐ‘๋‹ค... ๋งค๋ณต์ด๋ผ ๊ทธ๋Ÿฐ๊ฐ€ ใ… ใ…  ๊ทธ๋ž˜๋„ ์•ฝ์†ํ•œ ๋‚ด์šฉ์ด๋‹ˆ ์ง€์ผœ ์ ์–ด๋ณด์•˜๋‹ค.(11/12)

์ฐธ๊ณ ๋กœ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋Š” "๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ docs"๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค. ex) "javascript docs", "node.js docs"
์ตœ๊ทผ์— ์•Œ๊ฒŒ๋ผ์„œ ์ ์–ด๋ณธ๋‹ค


โ—๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ

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

export default function ์•„๋ž˜ ์„ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํžŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜(){~~~};
                                                    
function ์ŠคํŠธ๋ผ์ดํฌ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ํ•จ์ˆ˜(){~~~};
function ๋ณผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ํ•จ์ˆ˜(){~~~};
function ์ŠคํŠธ๋ผ์ดํฌ, ๋ณผ ๊ฐœ์ˆ˜๋กœ ํžŒํŠธ ๋ฌธ์ž์—ด ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜(){~~~};
                                      
// ์‚ฌ์šฉํ•  ๋•Œ                                      
import ์•„๋ž˜ ์„ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํžŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ from "๊ฒฝ๋กœ"

์œ„ ์ฝ”๋“œ๋Š” ๊ทธ๋™์•ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ž์ฃผ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ด๋‹ค. ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ด์ง€๋งŒ ์ € ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•„๋ณด๊ธฐ ์œ„ํ•ด node.js์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด์•˜๋‹ค. ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ node.js์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ import, export๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  jsํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ ํ™•์žฅ์ž๋ช…์„ mjs๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ํ˜น์€ package.json์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค๊ณ  ํ•˜์ง€๋งŒ ์ด๋Š” ๋ฏธ์…˜์—์„œ ์ œํ•œ ์‚ฌํ•ญ์— ์žˆ๋Š” ๋‚ด์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐํ–ˆ๋‹ค.

ํ‰์†Œ์—๋Š” js์˜ ES6๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— import, export๋ฅผ ์ง€์›ํ•ด์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๊ณ , node.js ํ™˜๊ฒฝ์—์„œ๋Š” module.exports, require๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ˜น์‹œ๋‚˜ mjs ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฏธ์…˜ ์ง„ํ–‰์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ ๋‘๋ ค์›Œ module.exports, require๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋œ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

function ์•„๋ž˜ ์„ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํžŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜(){~~~};
                                                    
function ์ŠคํŠธ๋ผ์ดํฌ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ํ•จ์ˆ˜(){~~~};
function ๋ณผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ํ•จ์ˆ˜(){~~~};
function ์ŠคํŠธ๋ผ์ดํฌ, ๋ณผ ๊ฐœ์ˆ˜๋กœ ํžŒํŠธ ๋ฌธ์ž์—ด ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜(){~~~};
                                      
module.export = {์•„๋ž˜ ์„ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํžŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜};
                                      
// ์‚ฌ์šฉํ•  ๋•Œ
const {์•„๋ž˜ ์„ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํžŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜} = require("๊ฒฝ๋กœ");

import๋ฅผ ์‚ฌ์šฉํ• ๋ ค๊ณ  ๊ณ ์ง‘๋ถ€๋ฆฐ ๋•์— ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ์•Œ๊ฒŒ๋๋‹ค. (์‚ฌ์‹ค node.js ๊ณต์‹๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ๊นŒ์ง€ ๋‹ค๋ฅธ ๋‚ด์šฉ์œผ๋กœ ์—„์ฒญ ์‚ฝ์งˆํ–ˆ๋‹ค)


โ—MissionUtils์˜ ์‚ฌ์šฉ

์ด๋Ÿฐ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์—ˆ๋‹ค.

ApplicationTest๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์–ด 0์  ์ฒ˜๋ฆฌ๊ฐ€ ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ € ๋…€์„์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„ํš์„ ์งœ๋ดค๋‹ค.


MissionUtils.Console.readLine("์งˆ๋ฌธ ๋‚ด์šฉ",(์ž…๋ ฅ๊ฐ’)=>{
  // ์—ฌ๊ธฐ์„œ ์ž…๋ ฅ๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
});

์š”๋Ÿฐ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ์›๋ž˜ ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด while๋ฌธ์—์„œ ์ € MissionUtils๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

class BaseballGame{
  constructor(){
    this.inputNumber = 0;
  }
  
  handleUserInput(){
    MissionUtils.Console.readLine("์งˆ๋ฌธ ๋‚ด์šฉ",(์ž…๋ ฅ๊ฐ’)=>{
      this.inputNumber = ์ž…๋ ฅ๊ฐ’
  	});  
  }
  
  startGame(){
    while(ํžŒํŠธ๊ฐ€ 3์ŠคํŠธ๋ผ์ดํฌ ์•„๋‹ ๋™์•ˆ ๋ฐ˜๋ณต){
      handleUserInput();
      //๋‹ค์Œ ๋กœ์ง...
    }
  }
}

๊ทธ๋ƒฅ ๋ณด๊ธฐ์—” ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์ด์ง€๋งŒ, ์ด ์ฝ”๋“œ์—” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. readLine์„ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ๋•Œ ์œ„์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ ค์ฃผ์ง€ ์•Š๊ณ  while๋ฌธ์ด ๊ณ„์† ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด์—ˆ๋‹ค.

์‹ค์ œ๋กœ ์ € ๋กœ์ง์„ ๋Œ๋ ค๋ณด๋ฉด ๋‚ด ์ž…๋ ฅ์€ ๊ธฐ๋‹ค๋ฆฌ์ง€๋„ ์•Š๊ณ  ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋ฌดํ•œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ์•„๋ฆ„๋‹ค์šด ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค... ใ… ใ… 

๊ทธ๋ž˜์„œ ๋ฐฉ์‹์„ ๊ณ ๋ฏผํ•˜๋‹ค readLine๋‚ด๋ถ€์—์„œ ๋กœ์ง์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์–ด๋–จ๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

MissionUtils.Console.readLine("์งˆ๋ฌธ ๋‚ด์šฉ",(์ž…๋ ฅ๊ฐ’)=>{
  ์ž…๋ ฅ๊ฐ’ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜(์ž…๋ ฅ๊ฐ’);
});

์ด๋Ÿฐ ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋‹ˆ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ž…๋ ฅ์ด ๋˜๋ฉด ๊ทธ ๊ฐ’์„ ํ†ตํ•ด ๋กœ์ง์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


MissionUtils๋Š” readLine ๋ง๊ณ ๋„ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‚  ๊ดด๋กญํ˜”๋‹ค. ๋ฏธ์…˜์˜ ๋กœ์ง์ด ์™„์„ฑ๋˜๊ณ  npm test๋ฅผ ์‹คํ–‰์‹œ์ผฐ์„ ๋•Œ ๋ชจ๋‘ ์ •์ƒ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด ๊ธฐ๋ถ„ ์ข‹๊ฒŒ ์šฐํ…Œ์ฝ” ์ง€์› ์‚ฌ์ดํŠธ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋ณด์•˜๋‹ค.

๊ฒฐ๊ณผ๋Š”

์ œ์ถœ๋‚  ์ด๋Ÿฐ ๋ฌธ๊ตฌ์™€ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์–ด ์• ๊ฟŽ์€ PR๋งŒ ๋‹ซ์•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ์ œ์ถœํ–ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ฒฐ๊ณผ๋Š” ์œ„์™€ ๊ฐ™์•˜๋‹ค. ์˜ค๋žœ ์‹œ๊ฐ„ ๊ณ ๋ฏผํ•ด๋ณธ ๊ฒฐ๊ณผ ๋ฌธ์ œ์ ์€ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋œ ์ดํ›„ "2"๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋Š” ๋ถ€๋ถ„์— ์žˆ์—ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฒ˜์Œ ์ƒ๊ฐํ•œ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ˆซ์ž๋ฅผ ๋งž์ถฐ ์žฌ์‹œ์ž‘ ์—ฌ๋ถ€ ํŒ๋ณ„ํ•จ์ˆ˜ ์‹คํ–‰
  2. "1"์ด ์ž…๋ ฅ๋˜๋ฉด ์žฌ์‹œ์ž‘
  3. "1", "2"๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ˆซ์ž๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด throw๋กœ Error ๋ฐœ์ƒ
  4. "2"๋Š” ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Œ

์•„๋งˆ๋„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ ์ข…๋ฃŒ๋˜๋Š” ๋ถ€๋ถ„์ด ์—†์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์•˜๋‹ค. MissionUtils์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œํ•œ๋ฒˆ ์ฝ์–ด๋ณด๋‹ˆ

์ด๋Ÿฐ ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค. ํ˜น์‹œ๋‚˜ ์ด ๋…€์„์ด ํ•ด๊ฒฐ์ฑ…์ผ๊นŒ ์‹ถ์–ด ๊ฒŒ์ž„ ์ข…๋ฃŒ ํ›„ "2"๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด Console.close()๋ฅผ ํ˜ธ์ถœํ•ด๋ณด์•˜๋‹ค.

๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ

์•ž์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์กฐ๊ธˆ๋งŒ ๋” ๊ผผ๊ผผํžˆ ๊ณ„ํšํ•˜์ž๋Š” ๋‹ค์ง์„ ํ–ˆ๋‹ค.


๐Ÿ’ช๊ฐ€์žฅ ๊ณต๋“ค์ธ ๋ถ€๋ถ„

๐Ÿ“ƒ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ž‘์„ฑํ•˜๊ธฐ

์œ„ ์‚ฌ์ง„์€ 1์ฃผ์ฐจ ๋ฏธ์…˜ ์ค‘ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ 7๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์ž‘์„ฑํ–ˆ๋˜ ๊ธฐ๋Šฅ๋ชฉ๋ก ๋ฐ ๊ตฌํ˜„ ๋ฐฉํ–ฅ์„ฑ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„ ์‚ฌ์ง„์€ 2์ฃผ์ฐจ ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์ž‘์„ฑํ•œ ๊ธฐ๋Šฅ๋ชฉ๋ก ๋ฐ ๊ตฌํ˜„ ๋ฐฉํ–ฅ์„ฑ์ด๋‹ค. ์ „์ฒด ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ƒฅ ๋ณด๊ธฐ๋งŒ ํ•ด์„œ๋Š” ๊พธ๋ช„๋‹ค๋Š” ๊ฒƒ ์™ธ์— ๋‘˜์˜ ์ฐจ์ด๊ฐ€ ์ž˜ ์•ˆ๋Š๊ปด์ง€๊ฒ ์ง€๋งŒ

์ด ๋ถ€๋ถ„์—์„œ ๋‘˜์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

1์ฃผ์ฐจ์—” ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๋Š” ๋‚˜๋งŒ์˜ ๋ฃจํ‹ด์„ ์žก์•„๊ฐ€๋Š” ๋‹จ๊ณ„์˜€๋‹ค๋ฉด 2์ฃผ์ฐจ๋Š” ๊ทธ๊ฑธ ์ข€ ๋” ๋ฐœ์ „์‹œํ‚ค๋Š” ๋‹จ๊ณ„์˜€๋‹ค. ์ง€๋‚œ 1์ฃผ์ฐจ ํšŒ๊ณ ์—์„œ ๋‚˜๋งŒ์˜ ๊ธฐ๋Šฅ๋ชฉ๋ก ์ž‘์„ฑ ๊ทœ์น™์„ ์ด์•ผ๊ธฐ ํ–ˆ์—ˆ๋Š”๋ฐ

์ด๋•Œ ๋‚˜๋Š” ์ด 5๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ์ด์•ผ๊ธฐ ํ–ˆ๋‹ค. ์ด๋•Œ๋Š” ๋‚˜๋ฆ„ ๊ฐ„๋‹จํ•œ ๋‚ด์šฉ์ด๋ผ ํ•œ๊บผ๋ฒˆ์— ๋ชจ๋“  ๋ฐฉํ–ฅ์„ฑ์„ ์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์ฃผ ๋ฏธ์…˜์—์„œ๋Š” ํ•˜๋‚˜์˜ ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ๋ชฉ๋ก์„ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค. ์ง์ ‘ ํ•ด๋ณด๋‹ˆ ๋‚ด ๋ฃจํ‹ด ์ค‘ ๊ตฌํ˜„ ๋ฐฉํ–ฅ์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋Šฅ๋ชฉ๋ก์„ ์ž‘์„ฑํ•œ ํ›„ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ๊ตฌํ˜„ ๋ฐฉํ–ฅ์„ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋งˆ๋‹ค ์ ์–ด๋ณด์•˜๋‹ค. ์ „์ฒด ๋ฐฉํ–ฅ์„ฑ์„ ์ •ํ•ด๋‘” ํ›„ ์ž‘์€ ๋ฐฉํ–ฅ์„ฑ๋“ค์„ ์žก์•„๊ฐ€๋‹ˆ ํฐ ๋ฌด๋ฆฌ ์—†์ด ๋ฏธ์…˜์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์–ด๋””์„œ ์ฃผ์›Œ๋“ค์€ divide and conquer๊ฐ€ ๋– ์˜ฌ๋ž๋‹ค. ์ด๋ž˜์„œ ์ด์ „ ๊ธฐ์ˆ˜ ๋ถ„๋“ค์˜ ํ›„๊ธฐ๋ฅผ ๋ณด๋ฉด ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ž‘์„ฑ์ด ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๊ณ  ์–˜๊ธฐํ–ˆ๋˜๊ฑด๊ฐ€ ์‹ถ์—ˆ๋‹ค.

1์ฃผ์ฐจ ํšŒ๊ณ ๋Š” ์—ฌ๊ธฐ์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ› ๏ธ๋ฆฌํŒฉํ† ๋ง

์ฒ˜์Œ์— ๋งํ–ˆ๋‹ค์‹œํ”ผ ๋‚˜๋Š” ์ด๋ฏธ ์ด ๋ฏธ์…˜์„ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด๋ณธ ์ ์ด ์žˆ์—ˆ๋‹ค. ๋ฌผ๋ก  ์ง€๊ธˆ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์—ด์‹ฌํžˆ ํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ๊ตฌํ˜„์„ ์ด๋ฏธ ํ•ด๋ณธ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์ฒ˜์Œ ํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—” ๋ฆฌํŒฉํ† ๋ง์„ ๋งŽ์ด ํ•ด๋ณด์ž๋Š” ์ƒ๊ฐ์œผ๋กœ ๋ฏธ์…˜์— ์ž„ํ–ˆ๋‹ค.

ํ•œ๋ฒˆ ๋‹ค ์ง  ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ํ•˜๋‚˜์˜ ์ฝ”๋“œ์— ๋ถ€๋‹ด์ด ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ์ž‘์€ ์กฐ๊ฐ๋“ค์— ์ฑ…์ž„์„ ๋ถ„ํ• ํ•˜๋Š” ๋Š๋‚Œ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

ex)

  • App์—์„œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋‹ค ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ => App์€ BaseballGame์„ ์‹คํ–‰๋งŒ ํ•˜๊ณ , ์‹ค์งˆ์ ์ธ ๊ฒŒ์ž„์˜ ๋กœ์ง์€ BaseballGame์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ.
  • BaseballGame์—์„œ ํ•„์š”ํ•œ ์ž์ž˜ํ•œ ์—ฐ์‚ฐ์€ ๋”ฐ๋กœ module๋กœ ๋ฌถ์–ด ํŒŒ์ผ ๋ถ„๋ฆฌ

์ด๋ ‡๊ฒŒ ํ•ด๋ณด๋‹ˆ ์š”๊ตฌ์‚ฌํ•ญ์— ์ฃผ์–ด์กŒ๋˜ indent depth 2์ดํ•˜๋กœ ์ œํ•œ, ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ž‘์„ฑ ๋“ฑ์˜ ๋‚ด์šฉ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ง€์ผœ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ๋„ ๋‚˜๋ฆ„์˜ ๋ฆฌํŒฉํ† ๋ง์„ ์ž์ฃผ ์ง„ํ–‰ํ–ˆ์—ˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ์„ธ๋ถ€์ ์œผ๋กœ ํ•ด๋ณธ์ ์€ ์—†์—ˆ๋‹ค. ๊ณ ๋ฏผํ•˜๋ฉด ๊ณ ๋ฏผํ• ์ˆ˜๋ก ๋‹จ์ˆœํ•œ ํ‘œํ˜„์œผ๋กœ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋‹ˆ ๊ณ ๋ฏผํ•˜๋Š” ์žฌ๋ฏธ๊ฐ€ ์žˆ์—ˆ๋‹ค.

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

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