From 625e1d6f214f2f8777971368fb4e60336051437b Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Tue, 7 Nov 2023 23:18:37 +0900 Subject: [PATCH 01/23] =?UTF-8?q?chore=20:=20eslint,=20prettier=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 31 ++++++ .prettierrc.js | 11 ++ docs/README.md | 156 +++++++++++++++++++++++++++ docs/StudyLog.md | 270 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 468 insertions(+) create mode 100644 .eslintrc.js create mode 100644 .prettierrc.js create mode 100644 docs/README.md create mode 100644 docs/StudyLog.md diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000..fb72f754c8 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +export default { + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier'], + overrides: [ + { + env: { + jest: true, + node: true, + }, + files: [ + '.eslintrc.{js,cjs}', + ], + parserOptions: { + sourceType: 'script', + }, + }, + ], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + 'max-depth': ['error', 2], + 'max-params': ['error', 3], + 'max-lines-per-function': ['error', { max: 10 }], + 'import/extensions': 'off', + }, +}; diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000000..1b4ce05b28 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,11 @@ +export default { + singleQuote: true, + semi: true, + useTabs: false, + tabWidth: 2, + trailingComma: "all", + printWidth: 80, + bracketSpacing: true, + arrowParens: "always", + endOfLine: "auto", +}; diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..0db87d98c4 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,156 @@ +# ๐Ÿš— ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„ ๐Ÿš— + +``` html + ๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„) + pobi,woni,jun + ์‹œ๋„ํ•  ํšŸ์ˆ˜๋Š” ๋ช‡ ํšŒ์ธ๊ฐ€์š”? + 5 + + ์‹คํ–‰ ๊ฒฐ๊ณผ + pobi : - + woni : + jun : - + + pobi : -- + woni : - + jun : -- + + pobi : --- + woni : -- + jun : --- + + pobi : ---- + woni : --- + jun : ---- + + pobi : ----- + woni : ---- + jun : ----- + + ์ตœ์ข… ์šฐ์Šน์ž : pobi, jun + +``` + +--- + +## โœ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก + +1. [] ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ›๊ธฐ + - 1-1. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ex) "๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)" + - 1-2. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - ์ด๋ฆ„ ์ž…๋ ฅ์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ + - ์ด๋ฆ„์— ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์ œ๊ฑฐ + - ๋นˆ ๋ฌธ์ž์—ด ์ œ๊ฑฐ + - ex) pobi,woni,jun + - 1-3. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - ์ด๋ฆ„์ด ๋‘ ๊ฐœ ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ + - ๊ฐ ์ด๋ฆ„์ด 5๊ธ€์ž ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ + - ์ค‘๋ณต๋˜๋Š” ์ž๋™์ฐจ ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒฝ์šฐ + - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ + - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฆ‰์‹œ ์ข…๋ฃŒ + +2. [] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ + - 2-1. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ex) "์‹œ๋„ํ•  ํšŸ์ˆ˜๋Š” ๋ช‡ ํšŒ์ธ๊ฐ€์š”?" + - 2-2. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์ œ๊ฑฐ + - ex) 3 + - 2-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ + - 1๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ + - ์ž์—ฐ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ˜•์‹์„ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ + - ์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ 10 ์ด์ƒ์ธ ๊ฒฝ์šฐ(์ž„์˜ ์„ค์ •) + - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ + - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฆ‰์‹œ ์ข…๋ฃŒ + +3. [] ์ž๋™์ฐจ ๋งŒ๋“ค๊ธฐ + - 3-1. [โœ”๏ธ] ์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ผ ์ž๋™์ฐจ ์ƒ์„ฑ + +4. [] ์ž๋™์ฐจ ๊ฒฝ์ฃผ + - 4-1. [โœ”๏ธ] 0 ~ 9 ์‚ฌ์ด ๋ฌด์ž‘์œ„ ๊ฐ’ ์ƒ์„ฑ + - 4-2. [โœ”๏ธ] 4 ์ด์ƒ์ผ ๊ฒฝ์šฐ ํ•œ์นธ ์ „์ง„ + - 4-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ๋งŒํผ ๊ฒฝ์ฃผ ์ง„ํ–‰ + - 4-4. [โœ”๏ธ] ๋งˆ์ง€๋ง‰ ๊ฒฝ์ฃผ๋กœ ์ตœ์ข… ์šฐ์Šน์ž ๊ตฌํ•˜๊ธฐ + - ์šฐ์Šน์ž ํ•œ ๋ช… ์ด์ƒ ๊ฐ€๋Šฅ + +5. [] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋‚˜ํƒ€๋‚ด๊ธฐ + - 5-1. [โœ”๏ธ] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - "์‹คํ–‰ ๊ฒฐ๊ณผ" + - 5-2. [โœ”๏ธ] ๊ฐ ์ฐจ์ˆ˜๋ณ„ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + +6. [] ์ตœ์ข… ์šฐ์Šน์ž ๋‚˜ํƒ€๋‚ด๊ธฐ + - 6-1. [โœ”๏ธ] ์ตœ์ข… ์šฐ์Šน์ž ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ์šฐ์Šน์ž๊ฐ€ ์—ฌ๋ ค๋ช…์ผ ๊ฒฝ์šฐ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ + - ex) ์ตœ์ข… ์šฐ์Šน์ž : pobi, jun + +--- + +## โœ”๏ธ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๋ชฉ๋ก + +1. [] ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ›๊ธฐ + - T-1-1. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-1-2. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + - T-1-3. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + +2. [] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ + - T-2-1. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-2-2. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + - T-2-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + +3. [] ์ž๋™์ฐจ ๋งŒ๋“ค๊ธฐ + - T-3-1. [โœ”๏ธ] ์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ฅธ ์ž๋™์ฐจ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ + +4. [] ์ž๋™์ฐจ ๊ฒฝ์ฃผ + - T-4-1. [โœ”๏ธ] 0 ~ 9 ์‚ฌ์ด ๋ฌด์ž‘์œ„ ๊ฐ’ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ + - T-4-2. [โœ”๏ธ] 4 ์ด์ƒ์ผ ๊ฒฝ์šฐ ํ•œ์นธ ์ „์ง„ ํ…Œ์ŠคํŠธ + - T-4-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ๋งŒํผ ๊ฒฝ์ฃผ ์ง„ํ–‰ ํ…Œ์ŠคํŠธ + - T-4-4. [โœ”๏ธ] ๋งˆ์ง€๋ง‰ ๊ฒฝ์ฃผ๋กœ ์ตœ์ข… ์šฐ์Šน์ž ๊ตฌํ•˜๊ธฐ ํ…Œ์ŠคํŠธ + +5. [] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋‚˜ํƒ€๋‚ด๊ธฐ + - T-5-1. [โœ”๏ธ] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-5-2. [โœ”๏ธ] ๊ฐ ์ฐจ์ˆ˜๋ณ„ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + +6. [] ์ตœ์ข… ์šฐ์Šน์ž ๋‚˜ํƒ€๋‚ด๊ธฐ + - T-6-1. [โœ”๏ธ] ์ตœ์ข… ์šฐ์Šน์ž ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + +--- + +## ๐Ÿ–‹๏ธ ์š”๊ตฌ์‚ฌํ•ญ + +- [] Node.js 18.17.1 ๋ฒ„์ „์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. +- [] ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์˜ ์‹œ์ž‘์ ์€ App.js์˜ play ๋ฉ”์„œ๋“œ์ด๋‹ค. +- [] package.json์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. +- [] ์ˆœ์ˆ˜ Vanila JS๋กœ๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค. +- [] ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(jQuery, Lodash ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. +- [] JavaScript ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•œ๋‹ค +- [] ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ process.exit()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค +- [] ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด ApplicationTest์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ ํ•œ๋‹ค +- [] ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. +- [] indent(์ธ๋ดํŠธ, ๋“ค์—ฌ์“ฐ๊ธฐ) 2๊นŒ์ง€๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. + - ์˜ˆ๋ฅผ ๋“ค์–ด while๋ฌธ ์•ˆ์— if๋ฌธ์ด ์žˆ์œผ๋ฉด ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” 2์ด๋‹ค. +- [] jest๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณธ์ธ์ด ์ •๋ฆฌํ•œ ๊ธฐ๋Šฅ ๋ชฉ๋ก์ด ์ •์ƒ ๋™์ž‘ํ•จ์„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ํ™•์ธํ•œ๋‹ค. +- [] @woowacourse/mission-utils์—์„œ ์ œ๊ณตํ•˜๋Š” Random ๋ฐ Console API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค +- [] Random ๊ฐ’ ์ถ”์ถœ์€ Random.pickNumberInRange()๋ฅผ ํ™œ์šฉํ•œ๋‹ค. +- [] ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›๊ณ  ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Console.readLineAsync, Console.print๋ฅผ ํ™œ์šฉํ•œ๋‹ค + +--- + +## ๐Ÿ“ข 1์ฃผ์ฐจ ๊ณตํ†ต ํ”ผ๋“œ๋ฐฑ + +- ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ์ค€์ˆ˜ํ•œ๋‹ค +- ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์˜๋ฏธ ์žˆ๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค +- git์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•  ์ž์›์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ๋ คํ•œ๋‹ค +- Pull Request๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „ ๋ธŒ๋žœ์น˜๋ฅผ ํ™•์ธํ•œ๋‹ค +- PR์„ ํ•œ ๋ฒˆ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ๋‹ซ์ง€ ๋ง๊ณ  ์ถ”๊ฐ€ ์ปค๋ฐ‹์„ ํ•œ๋‹ค +- ์ด๋ฆ„์„ ํ†ตํ•ด ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค +- ์ถ•์•ฝํ•˜์ง€ ์•Š๋Š”๋‹ค +- ๊ณต๋ฐฑ๋„ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์ด๋‹ค +- ๊ณต๋ฐฑ ๋ผ์ธ์„ ์˜๋ฏธ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค +- space์™€ tab์„ ํ˜ผ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค +- ์˜๋ฏธ ์—†๋Š” ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š๋Š”๋‹ค +- linter์™€ Code Formatter์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ๋‹ค +- EOL(End Of Line) +- ๋ถˆํ•„์š”ํ•œ console.log๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค +- JavaScript์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์ ๊ทน ํ™œ์šฉํ•œ๋‹ค + +--- diff --git a/docs/StudyLog.md b/docs/StudyLog.md new file mode 100644 index 0000000000..4ed7ffdbc9 --- /dev/null +++ b/docs/StudyLog.md @@ -0,0 +1,270 @@ +# ๐Ÿ“– ๋ฐฐ์šด ๋‚ด์šฉ ๐Ÿ“– + +## 1. ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ›๊ธฐ + +### 1-1. ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + +- `Class` + - ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ 'ํ‹€' ๋˜๋Š” '์„ค๊ณ„๋„'์˜ ๊ฐœ๋… + - ๋ฐ์ดํ„ฐ(์†์„ฑ or ๋ฉค๋ฒ„ ๋ณ€์ˆ˜) + ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ(ํ•จ์ˆ˜)๋ฅผ ํฌํ•จํ•œ๋‹ค +- `Method` + - ํด๋ž˜์Šค ๋‚ด์—์„œ ์ •์˜๋œ ํ•จ์ˆ˜ + - ๊ฐ์ฒด๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์ด๋‚˜ ํ–‰์œ„ + - ๊ฐ์ฒด์˜ ์†์„ฑ(๋ฐ์ดํ„ฐ)์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•œ๋‹ค + - '๋‹ฌ๋ฆฐ๋‹ค', '๋ฉˆ์ถ˜๋‹ค' ๋“ฑ +- `this ํ‚ค์›Œ๋“œ` + - ํ˜„์žฌ ๊ฐ์ฒด ๋˜๋Š” ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ‚ค์›Œ๋“œ +- `async ์™€ await` + - ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์œผ๋กœ ์–ด๋–ค ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค + - ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ž‘์—…๋“ฑ์€ ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค + - async - ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•จ์„ ์„ ์–ธํ•œ๋‹ค + - await - ๋น„๋™๊ธฐ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค +- `readLine(query, callback)` + + - ์ฃผ์–ด์ง„ ์งˆ๋ฌธ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค + - ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ต๋ณ€์„ ์ž…๋ ฅํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค + - ์ดํ›„ ์ž…๋ ฅ๋œ ๋‹ต๋ณ€์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค + +- `readLineAsync(query)` + - ์ฃผ์–ด์ง„ ์งˆ๋ฌธ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค + - ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‹ต๋ณ€์„ Promise๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค +- `print(message)` + - ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•œ๋‹ค + +### T-1-1. ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + +- `Mocking` + - ์‹ค์ œ ๊ตฌํ˜„์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ ๋„ ํ…Œ์ŠคํŠธ์˜ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค +- `Spy` + - ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์ถ”์ ํ•œ๋‹ค +- `Mocking Clear` + - ๊ฐ ํ…Œ์ŠคํŠธ ์‚ฌ์ด์—์„œ Mock๊ณผ Spy์˜ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค + - ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๋ชฉ์  +- `Describe` + - ๊ด€๋ จ ํ…Œ์ŠคํŠธ๋“ค์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค + - ๋ธ”๋ก ์•ˆ ํ…Œ์ŠคํŠธ๋“ค์ด ํŠน์ • ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜, ๊ธฐ๋Šฅ ๋“ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค +- `Test` + - ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค + - ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ…Œ์ŠคํŠธ์˜ ์ด๋ฆ„ ๋˜๋Š” ์„ค๋ช…์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ›๋Š”๋‹ค + - ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค +- `Expectation` + - ๊ฐ’์— ๋Œ€ํ•œ ํŠน์ • ์กฐ๊ฑด์„ ์„ค์ •ํ•œ๋‹ค. + +### 1-2. ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + +- `this ํ‚ค์›Œ๋“œ` + - ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค + - ์ธ์ž๋ฅผ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์— ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค +- `๊ฐ์ฒด` + - ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ํฌํ•จํ•˜๋Š” ํ•ญ๋ชฉ์„ ์˜๋ฏธ + - ์ƒ์„ฑ์˜ ๊ธฐ์›์ด๋˜๋Š” ์ •๋ณด ๋ช…์‹œ (X) + - ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ธ์Šคํ„ด์Šค (X) +- `์ธ์Šคํ„ด์Šค` + - ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋ฅผ ์˜๋ฏธ + - ํด๋ž˜์Šค - ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“œ๋Š” ํ‹€ + - ์ธ์Šคํ„ด์Šค - ๊ทธ ํ‹€๋กœ ๋งŒ๋“  ์‹ค์ œ ์ฟ ํ‚ค + - ์ƒ์„ฑ์˜ ๊ธฐ์›์ด ๋˜๋Š” ํด๋ž˜์Šค๋‚˜ ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด ๋ช…์‹œ (O) + - ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ์ฒด (O) + - ์ƒ์„ฑ : const ์ธ์Šคํ„ด์Šค๋ช… = new ํด๋ž˜์Šค๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜); +- `ํ™”์‚ดํ‘œ ํ•จ์ˆ˜` + - ES6์—์„œ ๋„์ž…๋œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ํ‘œํ˜„ ๋ฐฉ์‹ + - ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ• - ๋ณธ๋ฌธ์ด ํ•œ ์ค„์ธ ๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ ๋ฐ 'return'๋ฌธ ์ƒ๋žต ๊ฐ€๋Šฅ + - this๋ฐ”์ธ๋”ฉ - ์ž์‹ ๋งŒ์˜ this๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ์ƒ์œ„ ์Šค์ฝ”ํ”„ this ์ฐธ์กฐ +- `์ „์—ญ ๊ฐ์ฒด` + - ๋ธŒ๋ผ์šฐ์ € : window ๊ฐ์ฒด, ์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ + - Node.js : global ๊ฐ์ฒด, ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ + - ๋ชจ๋“  ์Šค์ฝ”ํ”„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค +- `split` + - ๋ฌธ์ž์—ด ๋ฉ”์„œ๋“œ + - ํŠน์ • ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค +- `map` + - ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ + - ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค + - ๊ทธ ๊ฒฐ๊ณผ๋กœ ๊ตฌ์„ฑ๋œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค + - ๋ถˆ๋ณ€์„ฑ - ์›๋ณธ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค + - ์ˆœํšŒ - ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค + +### T-1-2. ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + +- `matcher` + - ํ…Œ์ŠคํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ + - ์‹ค์ œ ๊ฒฐ๊ณผ์™€ ๊ธฐ๋Œ€๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ํ…Œ์ŠคํŠธ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค +- `toBe` + - ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `not` + - matcher์˜ ๋ฐ˜๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค + - ์ฃผ๋กœ ๋‘ ๊ฐ’์ด ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค +- `toBeTruthy` + - ๊ฐ’์ด boolean์—์„œ true๋กœ ํ‰๊ฐ€๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toBeFalsy` + - ๊ฐ’์ด boolean์—์„œ false๋กœ ํ‰๊ฐ€๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toContain` + - ๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด์ด ํŠน์ • ํ•ญ๋ชฉ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค + +### 1-3. ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + +- `Set์˜ ๊ฐœ๋…` + - ES6์—์„œ ๋„์ž…๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ + - ์œ ์ผํ•œ ๊ฐ’๋งŒ ์ €์žฅ๋˜๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค +- `Set์˜ ํŠน์ง•` + - ๊ฐ’์€ ์œ ์ผํ•˜๊ฒŒ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค + - ๊ฐ ์š”์†Œ๋Š” ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค + - ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ์ฃผ์š” ์ฐจ์ด์ ์ด๋‹ค +- `์ค‘๋ณต์ฒดํฌ์™€ Set` + - ๋ฐฐ์—ด์— ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ด ์žˆ๋‹ค๋ฉด, Set์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์„๋•Œ์˜ ๊ธธ์ด์™€ ์›๋ž˜ ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค + - Set์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค + - ๋”ฐ๋ผ์„œ ๋‘ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ ์›๋ž˜ ๋ฐฐ์—ด์— ์ค‘๋ณต ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค +- `_์–ธ๋”์Šค์ฝ”์–ด, #` + - ์ผ๋ฐ˜์ ์œผ๋กœ private ๋˜๋Š” ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค + - ์ฆ‰ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค + - JavaScript์—๋Š” privateํ‚ค์›Œ๋“œ ๋Œ€์‹  ์ปจ๋ฒค์…˜์œผ๋กœ ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•ด์™”๋‹ค + - ES6๋ถ€ํ„ฐ๋Š” #์„ ์‚ฌ์šฉํ•˜์—ฌ privateํ•„๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ์ง€๋งŒ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ ์—ฌ์ „ํžˆ ์–ธ๋”์Šค์ฝ”์–ด ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. + - ์—์–ด๋น„์•ค๋น„ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋Š” ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค + +### T-1-3. ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + +- `Private ๋ฉ”์„œ๋“œ ํ…Œ์ŠคํŠธ` + - Priavate ๋ฉ”์„œ๋“œ๋Š” ์ง์ ‘ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†๋‹ค + - ๊ฐ„์ ‘์ ์œผ๋กœ public ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ด์•ผํ•œ๋‹ค + - ํŠนํžˆ private ๋ฉ”์„œ๋“œ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” public ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ทธ ํšจ๊ณผ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ใ…ฃ์žˆ๋‹ค +- `๋น„๋™๊ธฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ` + - await expect(...).rejects.toThrow(...) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค + - ์ด๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค + - ๊ฒฐ๋ก ์ ์œผ๋กœ, ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋‚˜ ์ƒํ™ฉ๋“ค์—๋„ ๊ฐ„์ ‘์ ์ธ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค + +## 2. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ + +### 2-1. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + +- `parseInt` + - ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ + - ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›๋„๋ก ์š”์ฒญํ•˜๋”๋ผ๋„, ๋ฐ˜ํ™˜๊ฐ’์€ ๋ฌธ์ž์—ด ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค + - ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ์‹ค์ œ ์ •์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, parseIntํ•จ์ˆ˜๊ฐ€ ์“ฐ์ธ๋‹ค + - String - ๋ณ€ํ™˜๋  ๋ฌธ์ž์—ด + - radix - ๊ธฐ์ˆ˜, ๋ฌธ์ž์—ด์ด ํ‘œ์‹œ๋˜๋Š” ์ง„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์—์„œ 36์‚ฌ์ด ์ •์ˆ˜์ด๋‹ค + - ex) 10์€ parseInt์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ, 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค + - radix๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋ฌธ์ž์—ด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ง„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค + - 0x ๋˜๋Š” 0X - 16์ง„์ˆ˜๋กœ ๊ฐ„์ฃผ + - 0o - 8์ง„์ˆ˜๋กœ ๊ฐ„์ฃผ + - ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ - ๊ธฐ๋ณธ์ ์œผ๋กœ 10์ง„์ˆ˜๋กœ ๊ฐ„์ฃผ + - ํ•˜์ง€๋งŒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด radix ๊ฐ’์„ ํ•ญ์ƒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค + +### T-2-1. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + +- `toHaveBeen ๊ด€๋ จ matcher` + - toHaveBeen์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” matcher๋“ค์€ ํŠนํžˆ mockํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ๊ฒ€์ฆ์— ์‚ฌ์šฉ๋œ๋‹ค +- `toHaveBeenCalled` + - mock ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveBeenCalledTimes` + - mock ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ํšŸ์ˆ˜๋งŒํผ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveBeenCalledWith` + - mock ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveBeenLastCalledWith` + - mock ํ•จ์ˆ˜๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ˜ธ์ถœ๋  ๋•Œ ์ฃผ์–ด์ง„ ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveBeenNthCalledWith` + - mock ํ•จ์ˆ˜๊ฐ€ n๋ฒˆ์งธ๋กœ ํ˜ธ์ถœ๋  ๋•Œ ํŠน์ • ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveReturned` + - mock ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveReturnedWith` + - mock ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveBeenLastReturnedWith` + - mock ํ•จ์ˆ˜๊ฐ€ ๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ์—์„œ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค +- `toHaveNthReturnedWith` + - mock ํ•จ์ˆ˜์˜ n๋ฒˆ์งธ ํ˜ธ์ถœ์—์„œ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค + +### 2-2. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + +- `trim` + - ๋ฌธ์ž์—ด์˜ ์•ž ๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด trim() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค +- `parseInt` + - ๋ฌธ์ž์—ด ๋‚ด์— ์ˆซ์ž์™€ ๋ฌธ์ž๊ฐ€ ํ•จ๊ป˜ ์žˆ์„ ๋•Œ + - ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹น ๋ฌธ์ž๊นŒ์ง€๋งŒ ํŒŒ์‹ฑํ•˜๊ณ , ๊ทธ ์ดํ›„์˜ ๋ฌธ์ž๋Š” ๋ฌด์‹œํ•œ๋‹ค + - ๊ณต๋ฐฑ๋งŒ ์žˆ๋Š” ๋ฌธ์ž์—ด ์ผ๋•Œ + - ๊ฒฐ๊ณผ๊ฐ’์€ NaN์ด๋‹ค +- `replace` + - ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค + - ๋‘ ๊ฐ€์ง€ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค + - ๊ฒ€์ƒ‰ ํŒจํ„ด - ๋Œ€์ฒด๋  ๋ฌธ์ž์—ด ๋˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹ + - ๋Œ€์ฒด ๋ฌธ์ž์—ด - ๋Œ€์ฒด๋  ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๋˜๋Š” ํ•จ์ˆ˜ +- `์ •๊ทœํ‘œํ˜„์‹` + - ๋ฌธ์ž์—ด์˜ ํŠน์ • ํŒจํ„ด์„ ์ฐพ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋‹ค + - /.../๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค + - \d: ๋ชจ๋“  ์ˆซ์ž(0-9์™€ ๋™์ผ) + - \s: ๋ชจ๋“  ๊ณต๋ฐฑ ๋ฌธ์ž(์ŠคํŽ˜์ด์Šค, ํƒญ, ์ค„๋ฐ”๊ฟˆ ๋“ฑ) + - \w: ๋ชจ๋“  ๋‹จ์–ด ๋ฌธ์ž(a-z, A-Z, 0-9, \_์™€ ๋™์ผ) + - g: ์ „์—ญ ๊ฒ€์ƒ‰, ๋ฌธ์ž์—ด ๋‚ด์˜ ๋ชจ๋“  ์ผ์น˜ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ + - i: ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๊ฒ€์ƒ‰ +- ๊ฒฐ๋ก  + - ๋ฌธ์ž์—ด์„ ์ ์ ˆํ•˜๊ฒŒ ์ •์ œํ•œ ํ›„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค + +### 2-3. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + +- `includes()` + + - ๋ฌธ์ž์—ด์ด ํŠน์ • ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค + - ์ง€์ •๋œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false ๋ฐ˜ํ™˜ + - ์ •๊ทœ ํ‘œํ˜„์‹ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค + - searchString - ๋ฉ”์ธ ๋ฌธ์ž์—ด์—์„œ ์ฐพ์„ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด + - position - ์„ ํƒ ์‚ฌํ•ญ, ๋ฌธ์ž์—ด ๋‚ด์—์„œ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์œ„์น˜, ๊ธฐ๋ณธ๊ฐ’ 0 + +- `Number.isInteger()` + - ์ „๋‹ฌ๋œ ๊ฐ’์ด ์ •์ˆ˜์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค + - ๊ฐ’์ด ์ •์ˆ˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false ๋ฐ˜ํ™˜ + - ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค + +--- + +## 3. ์ž๋™์ฐจ ๋งŒ๋“ค๊ธฐ + +### 3-1. ์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ฅธ ์ž๋™์ฐจ ์ƒ์„ฑ + +- `constructor` + - ์ƒ์„ฑ์ž + - ํด๋ž˜์Šค ๋‚ด์—์„œ ๊ฐ์ฒด์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ + - ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ constructor๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค + - ์ด๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค + - ์ƒ์„ฑ์ž๋Š” ํ•„์š”์— ๋”ฐ๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค + - ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค + - App ํด๋ž˜์Šค์˜ constructor๋Š” this.car๋ผ๋Š” ๋นˆ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋‹ค + - ์ด๋Š” App ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค this.car๊ฐ€ ๋นˆ ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค + +## 4. ์ž๋™์ฐจ ๊ฒฝ์ฃผ + +### 4-1. 0 ~ 9 ์‚ฌ์ด ๋ฌด์ž‘์œ„ ๊ฐ’ ์ƒ์„ฑ + +- `pickNumberInRange(startInclusive, endInclusive)` + - ์ˆซ์ž ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋ฉด ์‹œ์ž‘ ๋˜๋Š” ๋ ์ˆซ์ž๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฒ”์œ„์˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค +- `pickNumberInList(array)` + - ๋ชฉ๋ก์— ์žˆ๋Š” ์ˆซ์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค + - ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค +- `pickUniqueNumbersInRange(startInclusive, endInclusive, count)` + - ์ˆซ์ž ๋ฒ”์œ„ ๋‚ด์—์„œ ์ง€์ •๋œ ๊ฐœ์ˆ˜๋งŒํผ ๊ฒน์น˜์ง€ ์•Š๋Š” ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค +- `shuffle(array)` + - ๋ฌด์ž‘์œ„๋กœ ์„ž์ธ ์ƒˆ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค + +### T-4-2. ๊ฐ’์ด 4 ์ด์ƒ์ผ ๊ฒฝ์šฐ ํ•œ์นธ ์ „์ง„ ํ…Œ์ŠคํŠธ + +- `jest.fn()` + - Jest์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ์˜ ํ•จ์ˆ˜ + - ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ, ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€, ๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ค ์ธ์ž๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ถ”์ ํ•œ๋‹ค +- `jest.spyOn()` + - ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ŠคํŒŒ์ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ + - ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋ฉด์„œ, ์›๋ž˜์˜ ๊ตฌํ˜„์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ชจ์˜ ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค +- `mockReturnValue(value)` + - ๋ชจ์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค +- `.mockImplementation(fn)` + - ์›๋ž˜์˜ ํ•จ์ˆ˜ ๋Œ€์‹  ์ œ๊ณต๋œ fn ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค +- `.mockImplementationOnce(fn)` + - ๋‹ค์Œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ๋งŒ ์ œ๊ณต๋œ fn ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค + +### T-4-3. ์‹œ๋„ ํšŸ์ˆ˜ ๋งŒํผ ๊ฒฝ์ฃผ ์ง„ํ–‰ ํ…Œ์ŠคํŠธ + +- `๊ธฐ๋ณธ์ ์ธ ์ปจํ…์ŠคํŠธ` + - ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋œ๋‹ค + - ์ฆ‰, ์ผ๋ฐ˜ ํ•จ์ˆ˜์—์„œ this๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ „์—ญ ๊ฐ์ฒด (๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค +- `๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—์„œ์˜ ์ปจํ…์ŠคํŠธ` + - ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, this๋Š” ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค +- `์ปจํ…์ŠคํŠธ ์†์‹ค` + - ํ•˜์ง€๋งŒ, ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด this์˜ ๋ฐ”์ธ๋”ฉ์ด ์†์‹ค๋  ์ˆ˜ ์žˆ๋‹ค +- `๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ` + - ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, bind, call, apply์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜์˜ this ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค From e475c69ee855c72b6f337a05838e68fc6ffb489e Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Tue, 7 Nov 2023 23:20:44 +0900 Subject: [PATCH 02/23] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 318 +++++++++++++++++++++++++++++-------------------- 1 file changed, 190 insertions(+), 128 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0db87d98c4..9e35df690b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,156 +1,218 @@ -# ๐Ÿš— ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„ ๐Ÿš— +# ๐Ÿ’ฒ ๋กœ๋˜ ๊ฒŒ์ž„ ๐Ÿ’ฒ` -``` html - ๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„) - pobi,woni,jun - ์‹œ๋„ํ•  ํšŸ์ˆ˜๋Š” ๋ช‡ ํšŒ์ธ๊ฐ€์š”? - 5 +![image](https://github.com/woowacourse-precourse/javascript-lotto-6/assets/146679818/1a60f055-13bd-41b7-89ab-7fa061216f70) - ์‹คํ–‰ ๊ฒฐ๊ณผ - pobi : - - woni : - jun : - - - pobi : -- - woni : - - jun : -- +
- pobi : --- - woni : -- - jun : --- +--- + +
+ +## ๐Ÿ“ข 3์ฃผ์ฐจ ํ•™์Šต ๋ชฉํ‘œ ๐Ÿ“ข + +1. [] `ํด๋ž˜์Šค (๊ฐ์ฒด)๋ฅผ ๋ถ„๋ฆฌ`ํ•˜๋Š” ์—ฐ์Šต +2. [] ๋„๋ฉ”์ธ ๋กœ์ง์— ๋Œ€ํ•œ `๋‹จ์œ„ ํ…Œ์ŠคํŠธ`๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์—ฐ์Šต +3. [] `ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌ`ํ•˜๋Š” ์—ฐ์Šต +4. [] `ํ•จ์ˆ˜๋ณ„๋กœ ํ…Œ์ŠคํŠธ`๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์—ฐ์Šต + +--- - pobi : ---- - woni : --- - jun : ---- +
- pobi : ----- - woni : ---- - jun : ----- +## ๐Ÿ“– ์‚ฌ์ „ ํ•™์Šต ๋ชฉ๋ก ๐Ÿ“– - ์ตœ์ข… ์šฐ์Šน์ž : pobi, jun +0. [] `ํด๋ž˜์Šค์™€ ๊ฐ์ฒด`์— ๋Œ€ํ•œ ํ•™์Šต + - S-0-1. [] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๊ฐœ๋… + - S-0-2. [] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• -``` +0. [] `๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ`์— ๋Œ€ํ•œ ํ•™์Šต + - S-0-3. [] ๋„๋ฉ”์ธ ๋กœ์ง์˜ ๊ฐœ๋… + - S-0-4. [] ๋„๋ฉ”์ธ ๋กœ์ง์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• --- -## โœ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก - -1. [] ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ›๊ธฐ - - 1-1. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ex) "๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)" - - 1-2. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ - - ์ด๋ฆ„ ์ž…๋ ฅ์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ - - ์ด๋ฆ„์— ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์ œ๊ฑฐ - - ๋นˆ ๋ฌธ์ž์—ด ์ œ๊ฑฐ - - ex) pobi,woni,jun - - 1-3. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - - ์ด๋ฆ„์ด ๋‘ ๊ฐœ ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ - - ๊ฐ ์ด๋ฆ„์ด 5๊ธ€์ž ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ - - ์ค‘๋ณต๋˜๋Š” ์ž๋™์ฐจ ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒฝ์šฐ - - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ - - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฆ‰์‹œ ์ข…๋ฃŒ - -2. [] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ - - 2-1. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ex) "์‹œ๋„ํ•  ํšŸ์ˆ˜๋Š” ๋ช‡ ํšŒ์ธ๊ฐ€์š”?" - - 2-2. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ - - ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์ œ๊ฑฐ - - ex) 3 - - 2-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ - - 1๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ - - ์ž์—ฐ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ˜•์‹์„ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ - - ์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ 10 ์ด์ƒ์ธ ๊ฒฝ์šฐ(์ž„์˜ ์„ค์ •) - - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ - - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฆ‰์‹œ ์ข…๋ฃŒ - -3. [] ์ž๋™์ฐจ ๋งŒ๋“ค๊ธฐ - - 3-1. [โœ”๏ธ] ์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ผ ์ž๋™์ฐจ ์ƒ์„ฑ - -4. [] ์ž๋™์ฐจ ๊ฒฝ์ฃผ - - 4-1. [โœ”๏ธ] 0 ~ 9 ์‚ฌ์ด ๋ฌด์ž‘์œ„ ๊ฐ’ ์ƒ์„ฑ - - 4-2. [โœ”๏ธ] 4 ์ด์ƒ์ผ ๊ฒฝ์šฐ ํ•œ์นธ ์ „์ง„ - - 4-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ๋งŒํผ ๊ฒฝ์ฃผ ์ง„ํ–‰ - - 4-4. [โœ”๏ธ] ๋งˆ์ง€๋ง‰ ๊ฒฝ์ฃผ๋กœ ์ตœ์ข… ์šฐ์Šน์ž ๊ตฌํ•˜๊ธฐ - - ์šฐ์Šน์ž ํ•œ ๋ช… ์ด์ƒ ๊ฐ€๋Šฅ - -5. [] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋‚˜ํƒ€๋‚ด๊ธฐ - - 5-1. [โœ”๏ธ] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - "์‹คํ–‰ ๊ฒฐ๊ณผ" - - 5-2. [โœ”๏ธ] ๊ฐ ์ฐจ์ˆ˜๋ณ„ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - -6. [] ์ตœ์ข… ์šฐ์Šน์ž ๋‚˜ํƒ€๋‚ด๊ธฐ - - 6-1. [โœ”๏ธ] ์ตœ์ข… ์šฐ์Šน์ž ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ์šฐ์Šน์ž๊ฐ€ ์—ฌ๋ ค๋ช…์ผ ๊ฒฝ์šฐ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ - - ex) ์ตœ์ข… ์šฐ์Šน์ž : pobi, jun +
+ +## โœ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก โœ… + +1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ` + - 1-1. [] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ex) "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." + - 1-2. [] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ + - ex) 8000 + - 1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - ๊ธˆ์•ก์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ + - 1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ + - ๊ธˆ์•ก์ด 1,000์› ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ + - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ + - ex) [ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰` + - 2-1. [] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ + - 1,000์› ๋‹จ์œ„๋กœ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ž๋™ ์ƒ์„ฑ + - 2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ + - ์ˆซ์ž ๋ฒ”์œ„ 1~45 + - ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ + - 2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ + - ex) "8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค." + +3. [] `๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ` + - 3-1. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ex) "๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." + - 3-2. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - ๋ฒˆํ˜ธ๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ + - ex) 1,2,3,4,5,6 + - 3-3. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - ๋ฒˆํ˜ธ๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ + - ๋ฒˆํ˜ธ ๋ฒ”์œ„๊ฐ€ 1~45๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ + - ๋ฒˆํ˜ธ๊ฐ€ ์ค‘๋ณต๋œ ๊ฒฝ์šฐ + - ๋ฒˆํ˜ธ๊ฐ€ 6๊ฐœ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ + - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ + - ex) [ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +4. [] `๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ` + - 4-1. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ex) "๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." + - 4-2. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ์ž…๋ ฅ + - 4-3. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - ๋ฒˆํ˜ธ๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ + - ๋ฒˆํ˜ธ ๋ฒ”์œ„๊ฐ€ 1~45๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ + - ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ + - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ + - ex) [ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. + +5. [] `๋‹น์ฒจ ๊ฒฐ๊ณผ ๊ณ„์‚ฐ` + - 5-1. [] ์‚ฌ์šฉ์ž์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๋‹น์ฒจ ๋ฒˆํ˜ธ ๋น„๊ต + - 5-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ๊ณ„์‚ฐ + - ๋“ฑ์ˆ˜๋ณ„ ๋‹น์ฒจ ๊ธฐ์ค€์— ๋”ฐ๋ฅธ ๋‹น์ฒจ ๋‚ด์—ญ ํ™•์ธ + - 5-3. [] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ + - ์ˆ˜์ต๋ฅ ์€ ๊ตฌ์ž… ๊ธˆ์•ก ๋Œ€๋น„ ๋‹น์ฒจ ๊ธˆ์•ก์œผ๋กœ ๊ณ„์‚ฐ + +6. [] `๋‹น์ฒจ ๊ฒฐ๊ณผ ์ถœ๋ ฅ` + - 6-1. [] ๋‹น์ฒจ ํ†ต๊ณ„ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ex) "๋‹น์ฒจ ํ†ต๊ณ„" + - 6-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ์ถœ๋ ฅ + - ex) "3๊ฐœ ์ผ์น˜ (5,000์›) - 1๊ฐœ + - 6-3. [] ์ˆ˜์ต ๋‚ด์—ญ ์ถœ๋ ฅ + - ์†Œ์ˆ˜์  ๋‘˜์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ + - ex) "์ด ์ˆ˜์ต๋ฅ ์€ 62.5%์ž…๋‹ˆ๋‹ค" --- -## โœ”๏ธ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๋ชฉ๋ก +
-1. [] ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ›๊ธฐ - - T-1-1. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - - T-1-2. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - - T-1-3. [โœ”๏ธ] ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ +## ๐Ÿ” ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๋ชฉ๋ก ๐Ÿ” -2. [] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ - - T-2-1. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - - T-2-2. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - - T-2-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ +T-1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` + - T-1-1. [] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-1-2. [] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + - T-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ -3. [] ์ž๋™์ฐจ ๋งŒ๋“ค๊ธฐ - - T-3-1. [โœ”๏ธ] ์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ฅธ ์ž๋™์ฐจ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ +T-2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` + - T-2-1. [] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ + - T-2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ ํ…Œ์ŠคํŠธ + - T-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ -4. [] ์ž๋™์ฐจ ๊ฒฝ์ฃผ - - T-4-1. [โœ”๏ธ] 0 ~ 9 ์‚ฌ์ด ๋ฌด์ž‘์œ„ ๊ฐ’ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ - - T-4-2. [โœ”๏ธ] 4 ์ด์ƒ์ผ ๊ฒฝ์šฐ ํ•œ์นธ ์ „์ง„ ํ…Œ์ŠคํŠธ - - T-4-3. [โœ”๏ธ] ์‹œ๋„ ํšŸ์ˆ˜ ๋งŒํผ ๊ฒฝ์ฃผ ์ง„ํ–‰ ํ…Œ์ŠคํŠธ - - T-4-4. [โœ”๏ธ] ๋งˆ์ง€๋ง‰ ๊ฒฝ์ฃผ๋กœ ์ตœ์ข… ์šฐ์Šน์ž ๊ตฌํ•˜๊ธฐ ํ…Œ์ŠคํŠธ +T-3. [] `๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` + - T-3-1. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-3-2. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + - T-3-3. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ -5. [] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋‚˜ํƒ€๋‚ด๊ธฐ - - T-5-1. [โœ”๏ธ] ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - - T-5-2. [โœ”๏ธ] ๊ฐ ์ฐจ์ˆ˜๋ณ„ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ +T-4. [] `๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` + - T-4-1. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-4-2. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + - T-4-3. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ -6. [] ์ตœ์ข… ์šฐ์Šน์ž ๋‚˜ํƒ€๋‚ด๊ธฐ - - T-6-1. [โœ”๏ธ] ์ตœ์ข… ์šฐ์Šน์ž ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ +T-5. [] `๋‹น์ฒจ ๊ฒฐ๊ณผ ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ` + - T-5-1. [] ์‚ฌ์šฉ์ž์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๋‹น์ฒจ ๋ฒˆํ˜ธ ๋น„๊ต ํ…Œ์ŠคํŠธ + - T-5-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ + - T-5-3. [] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ +T-6. [] `๋‹น์ฒจ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ` + - T-6-1. [] ๋‹น์ฒจ ํ†ต๊ณ„ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-6-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-6-3. [] ์ˆ˜์ต ๋‚ด์—ญ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + --- -## ๐Ÿ–‹๏ธ ์š”๊ตฌ์‚ฌํ•ญ - -- [] Node.js 18.17.1 ๋ฒ„์ „์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. -- [] ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์˜ ์‹œ์ž‘์ ์€ App.js์˜ play ๋ฉ”์„œ๋“œ์ด๋‹ค. -- [] package.json์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. -- [] ์ˆœ์ˆ˜ Vanila JS๋กœ๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค. -- [] ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(jQuery, Lodash ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. -- [] JavaScript ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•œ๋‹ค -- [] ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ process.exit()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค -- [] ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด ApplicationTest์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ ํ•œ๋‹ค -- [] ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. -- [] indent(์ธ๋ดํŠธ, ๋“ค์—ฌ์“ฐ๊ธฐ) 2๊นŒ์ง€๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. +
+ +## ๐Ÿ–‹๏ธ ์š”๊ตฌ์‚ฌํ•ญ ๐Ÿ–‹๏ธ + +- `Node.js 18.17.1 ๋ฒ„์ „`์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. +- ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์˜ `์‹œ์ž‘์ ์€ App.js์˜ play ๋ฉ”์„œ๋“œ`์ด๋‹ค. +- `package.json`์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. +- `์ˆœ์ˆ˜ Vanila JS`๋กœ๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค. +- `์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ`(jQuery, Lodash ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. +- JavaScript `์ฝ”๋“œ ์ปจ๋ฒค์…˜`์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•œ๋‹ค +- ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ `process.exit()`๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค +- ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด `ApplicationTest์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต`ํ•ด์•ผ ํ•œ๋‹ค +- ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ `์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค`. +- `indent(์ธ๋ดํŠธ, ๋“ค์—ฌ์“ฐ๊ธฐ) 2`๊นŒ์ง€๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. - ์˜ˆ๋ฅผ ๋“ค์–ด while๋ฌธ ์•ˆ์— if๋ฌธ์ด ์žˆ์œผ๋ฉด ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” 2์ด๋‹ค. -- [] jest๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณธ์ธ์ด ์ •๋ฆฌํ•œ ๊ธฐ๋Šฅ ๋ชฉ๋ก์ด ์ •์ƒ ๋™์ž‘ํ•จ์„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ํ™•์ธํ•œ๋‹ค. -- [] @woowacourse/mission-utils์—์„œ ์ œ๊ณตํ•˜๋Š” Random ๋ฐ Console API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค -- [] Random ๊ฐ’ ์ถ”์ถœ์€ Random.pickNumberInRange()๋ฅผ ํ™œ์šฉํ•œ๋‹ค. -- [] ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›๊ณ  ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Console.readLineAsync, Console.print๋ฅผ ํ™œ์šฉํ•œ๋‹ค +- `ํ•จ์ˆ˜ (๋˜๋Š” ๋ฉ”์„œ๋“œ)๊ฐ€ ํ•œ๊ฐ€์ง€ ์ผ๋งŒ` ํ•˜๋„๋ก ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ ๋‹ค. +- jest๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณธ์ธ์ด ์ •๋ฆฌํ•œ ๊ธฐ๋Šฅ ๋ชฉ๋ก์ด ์ •์ƒ ๋™์ž‘ํ•จ์„ `ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ํ™•์ธ`ํ•œ๋‹ค. +- `@woowacourse/mission-utils`์—์„œ ์ œ๊ณตํ•˜๋Š” Random ๋ฐ Console API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค +- Random ๊ฐ’ ์ถ”์ถœ์€ `Random.pickNumberInRange()`๋ฅผ ํ™œ์šฉํ•œ๋‹ค. +- ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›๊ณ  ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” `Console.readLineAsync, Console.print`๋ฅผ ํ™œ์šฉํ•œ๋‹ค + +--- + +
+ +## ๐Ÿ–‹๏ธ ์ถ”๊ฐ€๋œ ์š”๊ตฌ์‚ฌํ•ญ ๐Ÿ–‹๏ธ + +- `ํ•จ์ˆ˜(๋˜๋Š” ๋ฉ”์„œ๋“œ)์˜ ๊ธธ์ด๊ฐ€ 15๋ผ์ธ`์„ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค. +- `ํ•จ์ˆ˜(๋˜๋Š” ๋ฉ”์„œ๋“œ)๊ฐ€ ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ` ์ž˜ ํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค. +- `else๋ฅผ ์ง€์–‘`ํ•œ๋‹ค + - if ์กฐ๊ฑด์ ˆ์—์„œ ๊ฐ’์„ returnํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด else๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค +- `๋„๋ฉ”์ธ ๋กœ์ง์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ`๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. +- ๋‹จ UI(Console.readLineAsync, Console.print) ๋กœ์ง์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ œ์™ธํ•œ๋‹ค. + - ํ•ต์‹ฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์™€ UI๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•œ๋‹ค. + +--- + +
+ +## ๐Ÿ“ข 2์ฃผ์ฐจ ๊ณตํ†ต ํ”ผ๋“œ๋ฐฑ ๐Ÿ“ข + +- `README. md`๋ฅผ ์ƒ์„ธํžˆ ์ž‘์„ฑํ•œ๋‹ค +- ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ `์žฌ๊ฒ€ํ† `ํ•œ๋‹ค + - ์—์™ธ ์ƒํ™ฉ๋„ ์ •๋ฆฌํ•œ๋‹ค +- ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ `์—…๋ฐ์ดํŠธ`ํ•œ๋‹ค +- ๊ฐ’์„ `ํ•˜๋“œ ์ฝ”๋”ฉ`ํ•˜์ง€ ์•Š๋Š”๋‹ค + - ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด ๋ณ€์ˆ˜์˜ ์—ญํ• ์ด ๋ฌด์—‡์ธ์ง€ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค +- `๊ตฌํ˜„ ์ˆœ์„œ`๋„ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์ด๋‹ค + - ํด๋ž˜์Šค๋Š” ํ•„๋“œ, ์ƒ์„ฑ์ž, ๋ฉ”์„œ๋“œ ์ˆœ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค +- `ํ•œ ํ•จ์ˆ˜๊ฐ€ ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ`๋งŒ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•œ๋‹ค +- ํ•จ์ˆ˜๊ฐ€ ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ `ํ™•์ธํ•˜๋Š” ๊ธฐ์ค€`์„ ์„ธ์šด๋‹ค + - ํ•จ์ˆ˜์˜ ๊ธธ์ด๋ฅผ 15๋ผ์ธ์ด ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค +- JavaScript์—์„œ `๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•`์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค +- `ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ด์œ `์— ๋Œ€ํ•ด ๋ณธ์ธ์˜ ๊ฒฝํ—˜์„ ํ† ๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ณธ๋‹ค +- ์ฒ˜์Œ๋ถ€ํ„ฐ ํฐ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค --- -## ๐Ÿ“ข 1์ฃผ์ฐจ ๊ณตํ†ต ํ”ผ๋“œ๋ฐฑ - -- ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ์ค€์ˆ˜ํ•œ๋‹ค -- ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์˜๋ฏธ ์žˆ๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค -- git์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•  ์ž์›์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ๋ คํ•œ๋‹ค -- Pull Request๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „ ๋ธŒ๋žœ์น˜๋ฅผ ํ™•์ธํ•œ๋‹ค -- PR์„ ํ•œ ๋ฒˆ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ๋‹ซ์ง€ ๋ง๊ณ  ์ถ”๊ฐ€ ์ปค๋ฐ‹์„ ํ•œ๋‹ค -- ์ด๋ฆ„์„ ํ†ตํ•ด ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค -- ์ถ•์•ฝํ•˜์ง€ ์•Š๋Š”๋‹ค -- ๊ณต๋ฐฑ๋„ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์ด๋‹ค -- ๊ณต๋ฐฑ ๋ผ์ธ์„ ์˜๋ฏธ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค -- space์™€ tab์„ ํ˜ผ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค -- ์˜๋ฏธ ์—†๋Š” ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š๋Š”๋‹ค -- linter์™€ Code Formatter์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ๋‹ค -- EOL(End Of Line) -- ๋ถˆํ•„์š”ํ•œ console.log๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค -- JavaScript์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์ ๊ทน ํ™œ์šฉํ•œ๋‹ค +
+ +## ๐Ÿ“ข 1์ฃผ์ฐจ ๊ณตํ†ต ํ”ผ๋“œ๋ฐฑ ๐Ÿ“ข + +- `์š”๊ตฌ์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ์ค€์ˆ˜`ํ•œ๋‹ค +- `์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€`๋ฅผ ์˜๋ฏธ ์žˆ๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค +- `git`์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•  ์ž์›์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ๋ คํ•œ๋‹ค +- Pull Request๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „ `๋ธŒ๋žœ์น˜๋ฅผ ํ™•์ธ`ํ•œ๋‹ค +- PR์„ ํ•œ ๋ฒˆ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ๋‹ซ์ง€ ๋ง๊ณ  `์ถ”๊ฐ€ ์ปค๋ฐ‹`์„ ํ•œ๋‹ค +- `์ด๋ฆ„์„ ํ†ตํ•ด ์˜๋„`๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค +- `์ถ•์•ฝ`ํ•˜์ง€ ์•Š๋Š”๋‹ค +- `๊ณต๋ฐฑ`๋„ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์ด๋‹ค +- `๊ณต๋ฐฑ ๋ผ์ธ`์„ ์˜๋ฏธ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค +- `space์™€ tab`์„ ํ˜ผ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค +- `์˜๋ฏธ ์—†๋Š” ์ฃผ์„`์„ ๋‹ฌ์ง€ ์•Š๋Š”๋‹ค +- `linter`์™€ `Code Formatter`์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ๋‹ค +- `EOL(End Of Line)` +- `๋ถˆํ•„์š”ํ•œ console.log`๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค +- `JavaScript์—์„œ ์ œ๊ณตํ•˜๋Š” API`๋ฅผ ์ ๊ทน ํ™œ์šฉํ•œ๋‹ค --- From 1121ac7772327a6a3fea77ecaa480ba013dfd737 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 06:04:18 +0900 Subject: [PATCH 03/23] =?UTF-8?q?docs=20:=20(S-0-1)=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=99=80=20=EA=B0=9D=EC=B2=B4=EC=9D=98=20=EA=B0=9C?= =?UTF-8?q?=EB=85=90=20=EC=82=AC=EC=A0=84=20=ED=95=99=EC=8A=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +- docs/StudyLog.md | 288 +++-------------------------------------------- 2 files changed, 20 insertions(+), 272 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9e35df690b..d6325d51d0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# ๐Ÿ’ฒ ๋กœ๋˜ ๊ฒŒ์ž„ ๐Ÿ’ฒ` +# ๐Ÿ’ฒ ๋กœ๋˜ ๊ฒŒ์ž„ ๐Ÿ’ฒ ![image](https://github.com/woowacourse-precourse/javascript-lotto-6/assets/146679818/1a60f055-13bd-41b7-89ab-7fa061216f70) @@ -22,7 +22,7 @@ ## ๐Ÿ“– ์‚ฌ์ „ ํ•™์Šต ๋ชฉ๋ก ๐Ÿ“– 0. [] `ํด๋ž˜์Šค์™€ ๊ฐ์ฒด`์— ๋Œ€ํ•œ ํ•™์Šต - - S-0-1. [] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๊ฐœ๋… + - S-0-1. [โœ…] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๊ฐœ๋… - S-0-2. [] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• 0. [] `๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ`์— ๋Œ€ํ•œ ํ•™์Šต diff --git a/docs/StudyLog.md b/docs/StudyLog.md index 4ed7ffdbc9..672cc3dbbe 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -1,270 +1,18 @@ -# ๐Ÿ“– ๋ฐฐ์šด ๋‚ด์šฉ ๐Ÿ“– - -## 1. ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ›๊ธฐ - -### 1-1. ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - -- `Class` - - ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ 'ํ‹€' ๋˜๋Š” '์„ค๊ณ„๋„'์˜ ๊ฐœ๋… - - ๋ฐ์ดํ„ฐ(์†์„ฑ or ๋ฉค๋ฒ„ ๋ณ€์ˆ˜) + ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ(ํ•จ์ˆ˜)๋ฅผ ํฌํ•จํ•œ๋‹ค -- `Method` - - ํด๋ž˜์Šค ๋‚ด์—์„œ ์ •์˜๋œ ํ•จ์ˆ˜ - - ๊ฐ์ฒด๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์ด๋‚˜ ํ–‰์œ„ - - ๊ฐ์ฒด์˜ ์†์„ฑ(๋ฐ์ดํ„ฐ)์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•œ๋‹ค - - '๋‹ฌ๋ฆฐ๋‹ค', '๋ฉˆ์ถ˜๋‹ค' ๋“ฑ -- `this ํ‚ค์›Œ๋“œ` - - ํ˜„์žฌ ๊ฐ์ฒด ๋˜๋Š” ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ‚ค์›Œ๋“œ -- `async ์™€ await` - - ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์œผ๋กœ ์–ด๋–ค ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค - - ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ž‘์—…๋“ฑ์€ ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค - - async - ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•จ์„ ์„ ์–ธํ•œ๋‹ค - - await - ๋น„๋™๊ธฐ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค -- `readLine(query, callback)` - - - ์ฃผ์–ด์ง„ ์งˆ๋ฌธ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค - - ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ต๋ณ€์„ ์ž…๋ ฅํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค - - ์ดํ›„ ์ž…๋ ฅ๋œ ๋‹ต๋ณ€์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค - -- `readLineAsync(query)` - - ์ฃผ์–ด์ง„ ์งˆ๋ฌธ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค - - ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‹ต๋ณ€์„ Promise๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค -- `print(message)` - - ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•œ๋‹ค - -### T-1-1. ์ด๋ฆ„ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - -- `Mocking` - - ์‹ค์ œ ๊ตฌํ˜„์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ ๋„ ํ…Œ์ŠคํŠธ์˜ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค -- `Spy` - - ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์ถ”์ ํ•œ๋‹ค -- `Mocking Clear` - - ๊ฐ ํ…Œ์ŠคํŠธ ์‚ฌ์ด์—์„œ Mock๊ณผ Spy์˜ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค - - ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๋ชฉ์  -- `Describe` - - ๊ด€๋ จ ํ…Œ์ŠคํŠธ๋“ค์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค - - ๋ธ”๋ก ์•ˆ ํ…Œ์ŠคํŠธ๋“ค์ด ํŠน์ • ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜, ๊ธฐ๋Šฅ ๋“ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค -- `Test` - - ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค - - ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ…Œ์ŠคํŠธ์˜ ์ด๋ฆ„ ๋˜๋Š” ์„ค๋ช…์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ›๋Š”๋‹ค - - ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค -- `Expectation` - - ๊ฐ’์— ๋Œ€ํ•œ ํŠน์ • ์กฐ๊ฑด์„ ์„ค์ •ํ•œ๋‹ค. - -### 1-2. ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ - -- `this ํ‚ค์›Œ๋“œ` - - ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค - - ์ธ์ž๋ฅผ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์— ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค -- `๊ฐ์ฒด` - - ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ํฌํ•จํ•˜๋Š” ํ•ญ๋ชฉ์„ ์˜๋ฏธ - - ์ƒ์„ฑ์˜ ๊ธฐ์›์ด๋˜๋Š” ์ •๋ณด ๋ช…์‹œ (X) - - ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ธ์Šคํ„ด์Šค (X) -- `์ธ์Šคํ„ด์Šค` - - ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋ฅผ ์˜๋ฏธ - - ํด๋ž˜์Šค - ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“œ๋Š” ํ‹€ - - ์ธ์Šคํ„ด์Šค - ๊ทธ ํ‹€๋กœ ๋งŒ๋“  ์‹ค์ œ ์ฟ ํ‚ค - - ์ƒ์„ฑ์˜ ๊ธฐ์›์ด ๋˜๋Š” ํด๋ž˜์Šค๋‚˜ ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด ๋ช…์‹œ (O) - - ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ์ฒด (O) - - ์ƒ์„ฑ : const ์ธ์Šคํ„ด์Šค๋ช… = new ํด๋ž˜์Šค๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜); -- `ํ™”์‚ดํ‘œ ํ•จ์ˆ˜` - - ES6์—์„œ ๋„์ž…๋œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ํ‘œํ˜„ ๋ฐฉ์‹ - - ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ• - ๋ณธ๋ฌธ์ด ํ•œ ์ค„์ธ ๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ ๋ฐ 'return'๋ฌธ ์ƒ๋žต ๊ฐ€๋Šฅ - - this๋ฐ”์ธ๋”ฉ - ์ž์‹ ๋งŒ์˜ this๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ์ƒ์œ„ ์Šค์ฝ”ํ”„ this ์ฐธ์กฐ -- `์ „์—ญ ๊ฐ์ฒด` - - ๋ธŒ๋ผ์šฐ์ € : window ๊ฐ์ฒด, ์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ - - Node.js : global ๊ฐ์ฒด, ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ - - ๋ชจ๋“  ์Šค์ฝ”ํ”„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค -- `split` - - ๋ฌธ์ž์—ด ๋ฉ”์„œ๋“œ - - ํŠน์ • ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค -- `map` - - ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ - - ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค - - ๊ทธ ๊ฒฐ๊ณผ๋กœ ๊ตฌ์„ฑ๋œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค - - ๋ถˆ๋ณ€์„ฑ - ์›๋ณธ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค - - ์ˆœํšŒ - ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค - -### T-1-2. ์ด๋ฆ„ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - -- `matcher` - - ํ…Œ์ŠคํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ - - ์‹ค์ œ ๊ฒฐ๊ณผ์™€ ๊ธฐ๋Œ€๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ํ…Œ์ŠคํŠธ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค -- `toBe` - - ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `not` - - matcher์˜ ๋ฐ˜๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - - ์ฃผ๋กœ ๋‘ ๊ฐ’์ด ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค -- `toBeTruthy` - - ๊ฐ’์ด boolean์—์„œ true๋กœ ํ‰๊ฐ€๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toBeFalsy` - - ๊ฐ’์ด boolean์—์„œ false๋กœ ํ‰๊ฐ€๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toContain` - - ๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด์ด ํŠน์ • ํ•ญ๋ชฉ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค - -### 1-3. ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - -- `Set์˜ ๊ฐœ๋…` - - ES6์—์„œ ๋„์ž…๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ - - ์œ ์ผํ•œ ๊ฐ’๋งŒ ์ €์žฅ๋˜๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค -- `Set์˜ ํŠน์ง•` - - ๊ฐ’์€ ์œ ์ผํ•˜๊ฒŒ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค - - ๊ฐ ์š”์†Œ๋Š” ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค - - ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ์ฃผ์š” ์ฐจ์ด์ ์ด๋‹ค -- `์ค‘๋ณต์ฒดํฌ์™€ Set` - - ๋ฐฐ์—ด์— ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ด ์žˆ๋‹ค๋ฉด, Set์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์„๋•Œ์˜ ๊ธธ์ด์™€ ์›๋ž˜ ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค - - Set์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค - - ๋”ฐ๋ผ์„œ ๋‘ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ ์›๋ž˜ ๋ฐฐ์—ด์— ์ค‘๋ณต ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค -- `_์–ธ๋”์Šค์ฝ”์–ด, #` - - ์ผ๋ฐ˜์ ์œผ๋กœ private ๋˜๋Š” ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค - - ์ฆ‰ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค - - JavaScript์—๋Š” privateํ‚ค์›Œ๋“œ ๋Œ€์‹  ์ปจ๋ฒค์…˜์œผ๋กœ ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•ด์™”๋‹ค - - ES6๋ถ€ํ„ฐ๋Š” #์„ ์‚ฌ์šฉํ•˜์—ฌ privateํ•„๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ์ง€๋งŒ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ ์—ฌ์ „ํžˆ ์–ธ๋”์Šค์ฝ”์–ด ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. - - ์—์–ด๋น„์•ค๋น„ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋Š” ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค - -### T-1-3. ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - -- `Private ๋ฉ”์„œ๋“œ ํ…Œ์ŠคํŠธ` - - Priavate ๋ฉ”์„œ๋“œ๋Š” ์ง์ ‘ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†๋‹ค - - ๊ฐ„์ ‘์ ์œผ๋กœ public ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ด์•ผํ•œ๋‹ค - - ํŠนํžˆ private ๋ฉ”์„œ๋“œ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” public ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ทธ ํšจ๊ณผ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ใ…ฃ์žˆ๋‹ค -- `๋น„๋™๊ธฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ` - - await expect(...).rejects.toThrow(...) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค - - ์ด๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค - - ๊ฒฐ๋ก ์ ์œผ๋กœ, ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋‚˜ ์ƒํ™ฉ๋“ค์—๋„ ๊ฐ„์ ‘์ ์ธ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค - -## 2. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ - -### 2-1. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - -- `parseInt` - - ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ - - ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›๋„๋ก ์š”์ฒญํ•˜๋”๋ผ๋„, ๋ฐ˜ํ™˜๊ฐ’์€ ๋ฌธ์ž์—ด ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค - - ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ์‹ค์ œ ์ •์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, parseIntํ•จ์ˆ˜๊ฐ€ ์“ฐ์ธ๋‹ค - - String - ๋ณ€ํ™˜๋  ๋ฌธ์ž์—ด - - radix - ๊ธฐ์ˆ˜, ๋ฌธ์ž์—ด์ด ํ‘œ์‹œ๋˜๋Š” ์ง„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์—์„œ 36์‚ฌ์ด ์ •์ˆ˜์ด๋‹ค - - ex) 10์€ parseInt์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ, 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค - - radix๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋ฌธ์ž์—ด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ง„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค - - 0x ๋˜๋Š” 0X - 16์ง„์ˆ˜๋กœ ๊ฐ„์ฃผ - - 0o - 8์ง„์ˆ˜๋กœ ๊ฐ„์ฃผ - - ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ - ๊ธฐ๋ณธ์ ์œผ๋กœ 10์ง„์ˆ˜๋กœ ๊ฐ„์ฃผ - - ํ•˜์ง€๋งŒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด radix ๊ฐ’์„ ํ•ญ์ƒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค - -### T-2-1. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - -- `toHaveBeen ๊ด€๋ จ matcher` - - toHaveBeen์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” matcher๋“ค์€ ํŠนํžˆ mockํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ๊ฒ€์ฆ์— ์‚ฌ์šฉ๋œ๋‹ค -- `toHaveBeenCalled` - - mock ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveBeenCalledTimes` - - mock ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ํšŸ์ˆ˜๋งŒํผ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveBeenCalledWith` - - mock ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveBeenLastCalledWith` - - mock ํ•จ์ˆ˜๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ˜ธ์ถœ๋  ๋•Œ ์ฃผ์–ด์ง„ ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveBeenNthCalledWith` - - mock ํ•จ์ˆ˜๊ฐ€ n๋ฒˆ์งธ๋กœ ํ˜ธ์ถœ๋  ๋•Œ ํŠน์ • ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveReturned` - - mock ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveReturnedWith` - - mock ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveBeenLastReturnedWith` - - mock ํ•จ์ˆ˜๊ฐ€ ๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ์—์„œ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค -- `toHaveNthReturnedWith` - - mock ํ•จ์ˆ˜์˜ n๋ฒˆ์งธ ํ˜ธ์ถœ์—์„œ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค - -### 2-2. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ - -- `trim` - - ๋ฌธ์ž์—ด์˜ ์•ž ๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด trim() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค -- `parseInt` - - ๋ฌธ์ž์—ด ๋‚ด์— ์ˆซ์ž์™€ ๋ฌธ์ž๊ฐ€ ํ•จ๊ป˜ ์žˆ์„ ๋•Œ - - ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹น ๋ฌธ์ž๊นŒ์ง€๋งŒ ํŒŒ์‹ฑํ•˜๊ณ , ๊ทธ ์ดํ›„์˜ ๋ฌธ์ž๋Š” ๋ฌด์‹œํ•œ๋‹ค - - ๊ณต๋ฐฑ๋งŒ ์žˆ๋Š” ๋ฌธ์ž์—ด ์ผ๋•Œ - - ๊ฒฐ๊ณผ๊ฐ’์€ NaN์ด๋‹ค -- `replace` - - ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค - - ๋‘ ๊ฐ€์ง€ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค - - ๊ฒ€์ƒ‰ ํŒจํ„ด - ๋Œ€์ฒด๋  ๋ฌธ์ž์—ด ๋˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹ - - ๋Œ€์ฒด ๋ฌธ์ž์—ด - ๋Œ€์ฒด๋  ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๋˜๋Š” ํ•จ์ˆ˜ -- `์ •๊ทœํ‘œํ˜„์‹` - - ๋ฌธ์ž์—ด์˜ ํŠน์ • ํŒจํ„ด์„ ์ฐพ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋‹ค - - /.../๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค - - \d: ๋ชจ๋“  ์ˆซ์ž(0-9์™€ ๋™์ผ) - - \s: ๋ชจ๋“  ๊ณต๋ฐฑ ๋ฌธ์ž(์ŠคํŽ˜์ด์Šค, ํƒญ, ์ค„๋ฐ”๊ฟˆ ๋“ฑ) - - \w: ๋ชจ๋“  ๋‹จ์–ด ๋ฌธ์ž(a-z, A-Z, 0-9, \_์™€ ๋™์ผ) - - g: ์ „์—ญ ๊ฒ€์ƒ‰, ๋ฌธ์ž์—ด ๋‚ด์˜ ๋ชจ๋“  ์ผ์น˜ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ - - i: ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๊ฒ€์ƒ‰ -- ๊ฒฐ๋ก  - - ๋ฌธ์ž์—ด์„ ์ ์ ˆํ•˜๊ฒŒ ์ •์ œํ•œ ํ›„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค - -### 2-3. ์‹œ๋„ ํšŸ์ˆ˜ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - -- `includes()` - - - ๋ฌธ์ž์—ด์ด ํŠน์ • ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค - - ์ง€์ •๋œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false ๋ฐ˜ํ™˜ - - ์ •๊ทœ ํ‘œํ˜„์‹ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค - - searchString - ๋ฉ”์ธ ๋ฌธ์ž์—ด์—์„œ ์ฐพ์„ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด - - position - ์„ ํƒ ์‚ฌํ•ญ, ๋ฌธ์ž์—ด ๋‚ด์—์„œ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์œ„์น˜, ๊ธฐ๋ณธ๊ฐ’ 0 - -- `Number.isInteger()` - - ์ „๋‹ฌ๋œ ๊ฐ’์ด ์ •์ˆ˜์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค - - ๊ฐ’์ด ์ •์ˆ˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false ๋ฐ˜ํ™˜ - - ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค - ---- - -## 3. ์ž๋™์ฐจ ๋งŒ๋“ค๊ธฐ - -### 3-1. ์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ฅธ ์ž๋™์ฐจ ์ƒ์„ฑ - -- `constructor` - - ์ƒ์„ฑ์ž - - ํด๋ž˜์Šค ๋‚ด์—์„œ ๊ฐ์ฒด์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ - - ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ constructor๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค - - ์ด๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค - - ์ƒ์„ฑ์ž๋Š” ํ•„์š”์— ๋”ฐ๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค - - ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค - - App ํด๋ž˜์Šค์˜ constructor๋Š” this.car๋ผ๋Š” ๋นˆ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋‹ค - - ์ด๋Š” App ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค this.car๊ฐ€ ๋นˆ ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค - -## 4. ์ž๋™์ฐจ ๊ฒฝ์ฃผ - -### 4-1. 0 ~ 9 ์‚ฌ์ด ๋ฌด์ž‘์œ„ ๊ฐ’ ์ƒ์„ฑ - -- `pickNumberInRange(startInclusive, endInclusive)` - - ์ˆซ์ž ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋ฉด ์‹œ์ž‘ ๋˜๋Š” ๋ ์ˆซ์ž๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฒ”์œ„์˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค -- `pickNumberInList(array)` - - ๋ชฉ๋ก์— ์žˆ๋Š” ์ˆซ์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - - ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค -- `pickUniqueNumbersInRange(startInclusive, endInclusive, count)` - - ์ˆซ์ž ๋ฒ”์œ„ ๋‚ด์—์„œ ์ง€์ •๋œ ๊ฐœ์ˆ˜๋งŒํผ ๊ฒน์น˜์ง€ ์•Š๋Š” ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค -- `shuffle(array)` - - ๋ฌด์ž‘์œ„๋กœ ์„ž์ธ ์ƒˆ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค - -### T-4-2. ๊ฐ’์ด 4 ์ด์ƒ์ผ ๊ฒฝ์šฐ ํ•œ์นธ ์ „์ง„ ํ…Œ์ŠคํŠธ - -- `jest.fn()` - - Jest์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ์˜ ํ•จ์ˆ˜ - - ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ, ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€, ๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ค ์ธ์ž๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ถ”์ ํ•œ๋‹ค -- `jest.spyOn()` - - ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ŠคํŒŒ์ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ - - ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋ฉด์„œ, ์›๋ž˜์˜ ๊ตฌํ˜„์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ชจ์˜ ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค -- `mockReturnValue(value)` - - ๋ชจ์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค -- `.mockImplementation(fn)` - - ์›๋ž˜์˜ ํ•จ์ˆ˜ ๋Œ€์‹  ์ œ๊ณต๋œ fn ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค -- `.mockImplementationOnce(fn)` - - ๋‹ค์Œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ๋งŒ ์ œ๊ณต๋œ fn ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค - -### T-4-3. ์‹œ๋„ ํšŸ์ˆ˜ ๋งŒํผ ๊ฒฝ์ฃผ ์ง„ํ–‰ ํ…Œ์ŠคํŠธ - -- `๊ธฐ๋ณธ์ ์ธ ์ปจํ…์ŠคํŠธ` - - ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋œ๋‹ค - - ์ฆ‰, ์ผ๋ฐ˜ ํ•จ์ˆ˜์—์„œ this๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ „์—ญ ๊ฐ์ฒด (๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค -- `๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—์„œ์˜ ์ปจํ…์ŠคํŠธ` - - ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, this๋Š” ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค -- `์ปจํ…์ŠคํŠธ ์†์‹ค` - - ํ•˜์ง€๋งŒ, ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด this์˜ ๋ฐ”์ธ๋”ฉ์ด ์†์‹ค๋  ์ˆ˜ ์žˆ๋‹ค -- `๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ` - - ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, bind, call, apply์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜์˜ this ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค +# ๐Ÿ“– ์‚ฌ์ „ ํ•™์Šต ๐Ÿ“– + +## 0. ํด๋ž˜์Šค์™€ ๊ฐ์ฒด + +
+ +### S-0-1. ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๊ฐœ๋… + + - `ํด๋ž˜์Šค` + - ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ‹€ + - ES6์ดํ›„ ๋„์ž… + - constructor() ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ ํ•„์š”ํ•œ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•œ๋‹ค + - ํด๋ž˜์Šค ์•ˆ์—๋Š” ๊ฐ์ฒด์˜ ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์ด ๋“ค์–ด์žˆ๋‹ค + - `๊ฐ์ฒด` + - ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค + - ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด + - new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค + - ํ•ด๋‹น ํด๋ž˜์Šค์— ์ •์˜๋œ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค From a78754e227c45d9bed1283b138387a2aec721f7f Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 06:11:35 +0900 Subject: [PATCH 04/23] =?UTF-8?q?docs=20:=20(S-0-2)=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=99=80=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20=EB=B0=A9=EB=B2=95=20=EC=82=AC?= =?UTF-8?q?=EC=A0=84=20=ED=95=99=EC=8A=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- docs/StudyLog.md | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index d6325d51d0..f5bf8e6175 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,9 +21,9 @@ ## ๐Ÿ“– ์‚ฌ์ „ ํ•™์Šต ๋ชฉ๋ก ๐Ÿ“– -0. [] `ํด๋ž˜์Šค์™€ ๊ฐ์ฒด`์— ๋Œ€ํ•œ ํ•™์Šต +0. [โ˜‘๏ธ] `ํด๋ž˜์Šค์™€ ๊ฐ์ฒด`์— ๋Œ€ํ•œ ํ•™์Šต - S-0-1. [โœ…] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๊ฐœ๋… - - S-0-2. [] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• + - S-0-2. [โœ…] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• 0. [] `๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ`์— ๋Œ€ํ•œ ํ•™์Šต - S-0-3. [] ๋„๋ฉ”์ธ ๋กœ์ง์˜ ๊ฐœ๋… diff --git a/docs/StudyLog.md b/docs/StudyLog.md index 672cc3dbbe..045ff9f2a3 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -16,3 +16,20 @@ - ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด - new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค - ํ•ด๋‹น ํด๋ž˜์Šค์— ์ •์˜๋œ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค + +
+ +### S-0-2. ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• + + - `ํด๋ž˜์Šค ๋ถ„๋ฆฌ` + - ํด๋ž˜์Šค ์ •์˜๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“ ๋‹ค + - ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค import๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜จ๋‹ค + - ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค + - ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๋ฅผ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค + - ๋ณดํ†ต ์†Œํ”„ํŠธ์›จ์–ด์˜ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ๊ณ ๋ ค๋œ๋‹ค + - ๊ตฌ์กฐ์ ์ธ ์ธก๋ฉด์—์„œ ๋ชจ๋“ˆํ™”์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค + - `๊ฐ์ฒด ๋ถ„๋ฆฌ` + - ํŠน์ • ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋‚˜ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค + - ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์บก์Аํ™”ํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค + - ์ƒ์„ฑ ๋กœ์ง์˜ ์บก์Аํ™”์™€ ๊ด€๋ฆฌ์˜ ์šฉ์ด์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค + \ No newline at end of file From f587cad5e98e140dcf572298b3548d5c3ffa4c78 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 06:17:33 +0900 Subject: [PATCH 05/23] =?UTF-8?q?docs=20:=20(S-0-3)=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A1=9C=EC=A7=81=EC=9D=98=20=EA=B0=9C=EB=85=90=20?= =?UTF-8?q?=EC=82=AC=EC=A0=84=20=ED=95=99=EC=8A=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- docs/StudyLog.md | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index f5bf8e6175..566d1a4e12 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,7 +26,7 @@ - S-0-2. [โœ…] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• 0. [] `๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ`์— ๋Œ€ํ•œ ํ•™์Šต - - S-0-3. [] ๋„๋ฉ”์ธ ๋กœ์ง์˜ ๊ฐœ๋… + - S-0-3. [โœ…] ๋„๋ฉ”์ธ ๋กœ์ง์˜ ๊ฐœ๋… - S-0-4. [] ๋„๋ฉ”์ธ ๋กœ์ง์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• --- diff --git a/docs/StudyLog.md b/docs/StudyLog.md index 045ff9f2a3..884661647b 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -32,4 +32,25 @@ - ํŠน์ • ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋‚˜ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค - ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์บก์Аํ™”ํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค - ์ƒ์„ฑ ๋กœ์ง์˜ ์บก์Аํ™”์™€ ๊ด€๋ฆฌ์˜ ์šฉ์ด์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค - \ No newline at end of file + +
+ +## 0. ๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ + +
+ +### S-0-3. ๋„๋ฉ”์ธ ๋กœ์ง์˜ ๊ฐœ๋… + + - `๋„๋ฉ”์ธ ๋กœ์ง` + - ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ์˜์—ญ์— ๋Œ€ํ•œ ๊ทœ์น™, ๊ณ„์‚ฐ, ์ ˆ์ฐจ ๋“ฑ์„ ์˜๋ฏธ + - ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด๋ถ€์˜ ๋กœ์ง + - ex) ์‡ผํ•‘๋ชฐ์˜ ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •, ์žฌ๊ณ  ๊ด€๋ฆฌ, ํ• ์ธ ์ ์šฉ + - ์‹œ์Šคํ…œ์ด ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค + - UI ๋กœ์ง์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์ธํ”„๋ผ ๋กœ์ง๊ณผ ๊ตฌ๋ถ„๋œ๋‹ค + - `๋„๋ฉ”์ธ ๋กœ์ง์˜ ์ค‘์š”์„ฑ` + - ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค + - ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค + - ์ž˜ ์„ค๊ณ„๋œ ๋„๋ฉ”์ธ ๋กœ์ง์€ ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค + - ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค + - ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ , UI๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค + \ No newline at end of file From d29141bfe1f0273c906183f647f82ab92d5a64d6 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 16:23:44 +0900 Subject: [PATCH 06/23] =?UTF-8?q?docs=20:=20(S-0-4)=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A1=9C=EC=A7=81=EC=9D=98=20=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=82=AC=EC=A0=84=20=ED=95=99?= =?UTF-8?q?=EC=8A=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- docs/StudyLog.md | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 566d1a4e12..47198667bc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,9 +25,9 @@ - S-0-1. [โœ…] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๊ฐœ๋… - S-0-2. [โœ…] ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• -0. [] `๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ`์— ๋Œ€ํ•œ ํ•™์Šต +0. [โ˜‘๏ธ] `๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ`์— ๋Œ€ํ•œ ํ•™์Šต - S-0-3. [โœ…] ๋„๋ฉ”์ธ ๋กœ์ง์˜ ๊ฐœ๋… - - S-0-4. [] ๋„๋ฉ”์ธ ๋กœ์ง์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• + - S-0-4. [โœ…] ๋„๋ฉ”์ธ ๋กœ์ง์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• --- diff --git a/docs/StudyLog.md b/docs/StudyLog.md index 884661647b..f9f3ddc362 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -53,4 +53,23 @@ - ์ž˜ ์„ค๊ณ„๋œ ๋„๋ฉ”์ธ ๋กœ์ง์€ ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค - ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค - ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ , UI๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค - \ No newline at end of file + +
+ +### S-0-4. ๋„๋ฉ”์ธ ๋กœ์ง์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ + + - `ํ•จ์ˆ˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ` + - ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ธ ๊ฐœ๋ณ„ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ + - ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ธ์ž๋ฅผ ๋ฐ›๊ณ  ์˜ˆ์ƒ๋Œ€๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€, ์ ์ ˆํ•œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ง€ ๋“ฑ์„ ํ™•์ธ + - ์ฃผ๋กœ ํ•จ์ˆ˜์˜ ๋กœ์ง์ด ์ •ํ™•ํ•œ์ง€, ๊ฒฝ๊ณ„ ์กฐ๊ฑด๊ณผ ์—๋Ÿฌ์ฒ˜๋ฆฌ๊ฐ€ ์ ์ ˆํ•œ์ง€์— ์ค‘์  + - ๊ตฌํ˜„์˜ ์ •ํ™•์„ฑ์— ์ง‘์ค‘ + - ๊ธฐ์ˆ ์ ์ธ ์ธก๋ฉด์—์„œ์˜ ๊ฒ€์ฆ + - `๋„๋ฉ”์ธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ` + - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋˜๋Š” ๋„๋ฉ”์ธ ๋กœ์ง์— ์ดˆ์ ์„ ๋งž์ถ˜ ํ…Œ์ŠคํŠธ + - ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ์„ ๋„˜์–ด์„œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ถฉ์กฑํ•˜๋Š” ์ง€ ๊ฒ€์ฆ + - ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์˜ ํ๋ฆ„์ด๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€ ํ…Œ์ŠคํŠธ + - ์‹œ์Šคํ…œ์ด ์‹ค์ œ ์‚ฌ์šฉ ํ™˜๊ฒฝ์—์„œ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ํ™•์ธ + - ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์ •ํ™•์„ฑ์— ์ง‘์ค‘ + - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฒ€์ฆ + - ์ข…์ข… ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํ†ตํ•ฉ๋˜์–ด ํ•˜๋‚˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค + - ๊ณ ๋ฆฝ๋œ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋„˜์–ด์„ ๋‹ค \ No newline at end of file From 807256a53e830432b27d55bf58b5bc562684c065 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 17:51:21 +0900 Subject: [PATCH 07/23] =?UTF-8?q?feat=20:=20(T-1-1)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/BeforeRefactor.test.js | 26 ++++++++++++++++++++ docs/README.md | 2 +- docs/StudyLog.md | 42 +++++++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 __tests__/BeforeRefactor.test.js diff --git a/__tests__/BeforeRefactor.test.js b/__tests__/BeforeRefactor.test.js new file mode 100644 index 0000000000..d4885b1342 --- /dev/null +++ b/__tests__/BeforeRefactor.test.js @@ -0,0 +1,26 @@ +import InputManager from "../src/InputManager.js"; + +import { Console } from "@woowacourse/mission-utils" + +jest.mock("@woowacourse/mission-utils", () => ({ + Console: { + print: jest.fn(), + } +})); + +describe("InputManager class", () => { + describe("T-1-1 ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ", () => { + let inputManager; + + beforeEach(() => { + jest.clearAllMocks(); + inputManager = new InputManager(); + }); + + test("์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค", async () => { + await inputManager.enterAmount(); + + expect(Console.print).toHaveBeenCalledWith("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + }); + }); +}); \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 47198667bc..e4c9346bf0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -106,7 +106,7 @@ ## ๐Ÿ” ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๋ชฉ๋ก ๐Ÿ” T-1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` - - T-1-1. [] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-1-1. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - T-1-2. [] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - T-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ diff --git a/docs/StudyLog.md b/docs/StudyLog.md index f9f3ddc362..3bcddb1c06 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -72,4 +72,44 @@ - ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์ •ํ™•์„ฑ์— ์ง‘์ค‘ - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฒ€์ฆ - ์ข…์ข… ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํ†ตํ•ฉ๋˜์–ด ํ•˜๋‚˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค - - ๊ณ ๋ฆฝ๋œ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋„˜์–ด์„ ๋‹ค \ No newline at end of file + - ๊ณ ๋ฆฝ๋œ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋„˜์–ด์„ ๋‹ค + +
+ +--- + +
+ +# ๐Ÿ–‹๏ธ ๋ฐฐ์šด ๋‚ด์šฉ ๐Ÿ–‹๏ธ + +## 1. ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ +
+ +### T-1-1. ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + + - `describe` + - ๊ด€๋ จ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค์„ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค + - ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋” ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ตฌ์กฐํ™”๋œ ํ˜•ํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค + - `ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค` + - test ๋˜๋Š” it ๋ธ”๋ก์„ ์‚ฌ์šฉ + - ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค + - ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค + - ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ํ•œ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๋˜๋Š” ์‚ฌ๋ก€๋ฅผ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค + - `๋ชจ์˜ ํ•จ์ˆ˜` + - Jest์˜ jest.fn() ๋˜๋Š” jest.spyOn()์„ ์‚ฌ์šฉ + - ํ•จ์ˆ˜๋ฅผ ๋ชจ์˜ํ•œ๋‹ค + - ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ถ”์ ํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ + - `Mock Module` + - jest.mock()์„ ์‚ฌ์šฉํ•œ๋‹ค + - ํŠน์ • ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์‹ค์ œ ๊ตฌํ˜„ ๋Œ€์‹  ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค + - ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค + - `๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ` + - async/await๋ฅผ ์‚ฌ์šฉ + - Jest๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค + - `์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ` + - beforeEach, beforeAll, afterEach, afterAll + - ํ…Œ์ŠคํŠธ ์ „๊ณผ ํ›„์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค + - ์˜ˆ๋ฅผ ๋“ค์–ด, beforeEach๋Š” ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋ฉฐ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค + - `expect` + - ํ…Œ์ŠคํŠธ์—์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ์กฐ๊ฑด์„ ๋ช…์‹œํ•œ๋‹ค + - Jest๋Š” ๋‹ค์–‘ํ•œ matcher๋ฅผ ํ†ตํ•ด ๊ฐ’์ด๋‚˜ ๊ฐ์ฒด๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค \ No newline at end of file From 9f86b8f95a59c9b28b270816c68226a8f665d7a4 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 17:53:30 +0900 Subject: [PATCH 08/23] =?UTF-8?q?feat=20:=20(C-1-1)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 36 ++++++++++++++++++------------------ src/InputManager.js | 9 +++++++++ 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 src/InputManager.js diff --git a/docs/README.md b/docs/README.md index e4c9346bf0..e801107bbf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -36,12 +36,12 @@ ## โœ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก โœ… 1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ` - - 1-1. [] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - C-1-1. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ex) "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." - - 1-2. [] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - C-1-2. [] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ - ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ - ex) 8000 - - 1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - C-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - ๊ธˆ์•ก์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ - 1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ - ๊ธˆ์•ก์ด 1,000์› ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ @@ -49,21 +49,21 @@ - ex) [ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰` - - 2-1. [] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ + - C-2-1. [] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ - 1,000์› ๋‹จ์œ„๋กœ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ž๋™ ์ƒ์„ฑ - - 2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ + - C-2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ - ์ˆซ์ž ๋ฒ”์œ„ 1~45 - ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ - - 2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ + - C-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ - ex) "8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค." 3. [] `๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ` - - 3-1. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - C-3-1. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ex) "๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." - - 3-2. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - C-3-2. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ - ๋ฒˆํ˜ธ๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ - ex) 1,2,3,4,5,6 - - 3-3. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - C-3-3. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - ๋ฒˆํ˜ธ๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ - ๋ฒˆํ˜ธ ๋ฒ”์œ„๊ฐ€ 1~45๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ - ๋ฒˆํ˜ธ๊ฐ€ ์ค‘๋ณต๋œ ๊ฒฝ์šฐ @@ -72,11 +72,11 @@ - ex) [ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 4. [] `๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ` - - 4-1. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - C-4-1. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ex) "๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." - - 4-2. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - C-4-2. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ - ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ์ž…๋ ฅ - - 4-3. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - C-4-3. [] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - ๋ฒˆํ˜ธ๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ - ๋ฒˆํ˜ธ ๋ฒ”์œ„๊ฐ€ 1~45๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ - ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ @@ -84,18 +84,18 @@ - ex) [ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 5. [] `๋‹น์ฒจ ๊ฒฐ๊ณผ ๊ณ„์‚ฐ` - - 5-1. [] ์‚ฌ์šฉ์ž์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๋‹น์ฒจ ๋ฒˆํ˜ธ ๋น„๊ต - - 5-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ๊ณ„์‚ฐ + - C-5-1. [] ์‚ฌ์šฉ์ž์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๋‹น์ฒจ ๋ฒˆํ˜ธ ๋น„๊ต + - C-5-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ๊ณ„์‚ฐ - ๋“ฑ์ˆ˜๋ณ„ ๋‹น์ฒจ ๊ธฐ์ค€์— ๋”ฐ๋ฅธ ๋‹น์ฒจ ๋‚ด์—ญ ํ™•์ธ - - 5-3. [] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ + - C-5-3. [] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ - ์ˆ˜์ต๋ฅ ์€ ๊ตฌ์ž… ๊ธˆ์•ก ๋Œ€๋น„ ๋‹น์ฒจ ๊ธˆ์•ก์œผ๋กœ ๊ณ„์‚ฐ 6. [] `๋‹น์ฒจ ๊ฒฐ๊ณผ ์ถœ๋ ฅ` - - 6-1. [] ๋‹น์ฒจ ํ†ต๊ณ„ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - C-6-1. [] ๋‹น์ฒจ ํ†ต๊ณ„ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ex) "๋‹น์ฒจ ํ†ต๊ณ„" - - 6-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ์ถœ๋ ฅ + - C-6-2. [] ๋‹น์ฒจ ๋‚ด์—ญ ์ถœ๋ ฅ - ex) "3๊ฐœ ์ผ์น˜ (5,000์›) - 1๊ฐœ - - 6-3. [] ์ˆ˜์ต ๋‚ด์—ญ ์ถœ๋ ฅ + - C-6-3. [] ์ˆ˜์ต ๋‚ด์—ญ ์ถœ๋ ฅ - ์†Œ์ˆ˜์  ๋‘˜์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ - ex) "์ด ์ˆ˜์ต๋ฅ ์€ 62.5%์ž…๋‹ˆ๋‹ค" diff --git a/src/InputManager.js b/src/InputManager.js new file mode 100644 index 0000000000..ca31f6f53f --- /dev/null +++ b/src/InputManager.js @@ -0,0 +1,9 @@ +import { Console } from "@woowacourse/mission-utils"; + +class InputManager { + async enterAmount() { + Console.print("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + } +} + +export default InputManager; \ No newline at end of file From e92f302e466304ef30cca6281eeb3761409da187 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 18:45:59 +0900 Subject: [PATCH 09/23] =?UTF-8?q?feat=20:=20(T-1-2)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EC=B2=98=EB=A6=AC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/BeforeRefactor.test.js | 32 +++++++++++++++++++++----------- docs/README.md | 2 +- docs/StudyLog.md | 11 ++++++++++- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/__tests__/BeforeRefactor.test.js b/__tests__/BeforeRefactor.test.js index d4885b1342..bb74dd468e 100644 --- a/__tests__/BeforeRefactor.test.js +++ b/__tests__/BeforeRefactor.test.js @@ -4,23 +4,33 @@ import { Console } from "@woowacourse/mission-utils" jest.mock("@woowacourse/mission-utils", () => ({ Console: { - print: jest.fn(), + readLineAsync: jest.fn() } })); describe("InputManager class", () => { + let inputManager; + + beforeEach(() => { + jest.clearAllMocks(); + inputManager = new InputManager(); + }); + describe("T-1-1 ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ", () => { - let inputManager; - - beforeEach(() => { - jest.clearAllMocks(); - inputManager = new InputManager(); - }); - - test("์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค", async () => { - await inputManager.enterAmount(); + test("์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค", async () => { + await inputManager.enterAmount(); + expect(Console.readLineAsync).toHaveBeenCalledWith("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + }); + }); - expect(Console.print).toHaveBeenCalledWith("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + describe("T-1-2 ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ", () => { + test("์ž…๋ ฅ๋ฐ›์€ ๊ธˆ์•ก์ด 1,000์› ๋‹จ์œ„์ผ ๋•Œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค", async () => { + const validAmount = "8000"; + Console.readLineAsync.mockResolvedValue(validAmount); + + const amount = await inputManager.enterAmount(); + expect(Console.readLineAsync).toHaveBeenCalled(); + expect(amount).toBe(validAmount); }); }); }); \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index e801107bbf..3cf1211190 100644 --- a/docs/README.md +++ b/docs/README.md @@ -107,7 +107,7 @@ T-1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` - T-1-1. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - - T-1-2. [] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + - T-1-2. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - T-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ T-2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` diff --git a/docs/StudyLog.md b/docs/StudyLog.md index 3bcddb1c06..a0eafb6168 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -83,6 +83,7 @@ # ๐Ÿ–‹๏ธ ๋ฐฐ์šด ๋‚ด์šฉ ๐Ÿ–‹๏ธ ## 1. ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ +
### T-1-1. ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ @@ -112,4 +113,12 @@ - ์˜ˆ๋ฅผ ๋“ค์–ด, beforeEach๋Š” ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋ฉฐ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค - `expect` - ํ…Œ์ŠคํŠธ์—์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ์กฐ๊ฑด์„ ๋ช…์‹œํ•œ๋‹ค - - Jest๋Š” ๋‹ค์–‘ํ•œ matcher๋ฅผ ํ†ตํ•ด ๊ฐ’์ด๋‚˜ ๊ฐ์ฒด๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค \ No newline at end of file + - Jest๋Š” ๋‹ค์–‘ํ•œ matcher๋ฅผ ํ†ตํ•ด ๊ฐ’์ด๋‚˜ ๊ฐ์ฒด๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค + +
+ +### T-1-2. ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + + - `dmockResolvedValue` + - ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค + - ์ด๋ฅผ ํ†ตํ•ด Console.readLineAsync๊ฐ€ ๋งˆ์น˜ ์‚ฌ์šฉ์ž๊ฐ€ '8000'๊ณผ ๊ฐ™์€ ์œ ํšจํ•œ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค \ No newline at end of file From 83b0e2bb9035e1fcce52445e5a8829664f1ca144 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 18:52:05 +0900 Subject: [PATCH 10/23] =?UTF-8?q?feat=20:=20(C-1-2)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/App.js | 7 ++++++- src/InputManager.js | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3cf1211190..085bb830b7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -38,7 +38,7 @@ 1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ` - C-1-1. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ex) "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." - - C-1-2. [] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ + - C-1-2. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ - ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ - ex) 8000 - C-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ diff --git a/src/App.js b/src/App.js index c38b30d5b2..a356f0bdb2 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,10 @@ +import InputManager from './InputManager.js'; + class App { - async play() {} + async play() { + const inputManager = new InputManager(); + await inputManager.enterAmount(); + } } export default App; diff --git a/src/InputManager.js b/src/InputManager.js index ca31f6f53f..3a80fae390 100644 --- a/src/InputManager.js +++ b/src/InputManager.js @@ -2,7 +2,8 @@ import { Console } from "@woowacourse/mission-utils"; class InputManager { async enterAmount() { - Console.print("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + const inputAmount = await Console.readLineAsync("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + return inputAmount; } } From fa5f3eef250c032bd3ac6f4b9949151627f3828d Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 18:58:57 +0900 Subject: [PATCH 11/23] =?UTF-8?q?docs=20:=20(C-1-2)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/README.md b/docs/README.md index 085bb830b7..72692e0e26 100644 --- a/docs/README.md +++ b/docs/README.md @@ -40,6 +40,7 @@ - ex) "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." - C-1-2. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ - ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ + - ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์ œ๊ฑฐ - ex) 8000 - C-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - ๊ธˆ์•ก์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ From beee62994abc3ce9e462f1010202531a89b1dc71 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 19:17:16 +0900 Subject: [PATCH 12/23] =?UTF-8?q?feat=20:=20(C-1-2)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EA=B3=B5=EB=B0=B1=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/InputManager.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/InputManager.js b/src/InputManager.js index 3a80fae390..6c74c0ecf2 100644 --- a/src/InputManager.js +++ b/src/InputManager.js @@ -3,7 +3,8 @@ import { Console } from "@woowacourse/mission-utils"; class InputManager { async enterAmount() { const inputAmount = await Console.readLineAsync("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); - return inputAmount; + const cleanedAmount = inputAmount.replace(/\s+/g, ''); + return cleanedAmount; } } From 2f442f8bedbb5c3e1a91fb823b6a550801e14c69 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 19:32:51 +0900 Subject: [PATCH 13/23] =?UTF-8?q?feat=20:=20(T-1-3)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/BeforeRefactor.test.js | 19 ++++++++++++++++++- docs/README.md | 4 ++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/__tests__/BeforeRefactor.test.js b/__tests__/BeforeRefactor.test.js index bb74dd468e..b5e03a0d7f 100644 --- a/__tests__/BeforeRefactor.test.js +++ b/__tests__/BeforeRefactor.test.js @@ -18,6 +18,7 @@ describe("InputManager class", () => { describe("T-1-1 ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ", () => { test("์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค", async () => { + Console.readLineAsync.mockResolvedValue("1000"); await inputManager.enterAmount(); expect(Console.readLineAsync).toHaveBeenCalledWith("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); }); @@ -30,7 +31,23 @@ describe("InputManager class", () => { const amount = await inputManager.enterAmount(); expect(Console.readLineAsync).toHaveBeenCalled(); - expect(amount).toBe(validAmount); + expect(amount).toBe(parseInt(validAmount, 10)); + }); + }); + + describe("T-1-3 ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ", () => { + test("๊ธˆ์•ก์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค", async () => { + const invalidAmount = "abc"; + Console.readLineAsync.mockResolvedValue(invalidAmount); + + await expect(inputManager.enterAmount()).rejects.toThrow("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + }); + + test("1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค", async () => { + const invalidAmount = "1500"; + Console.readLineAsync.mockResolvedValue(invalidAmount); + + await expect(inputManager.enterAmount()).rejects.toThrow("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); }); }); }); \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 72692e0e26..4fb06fa732 100644 --- a/docs/README.md +++ b/docs/README.md @@ -106,10 +106,10 @@ ## ๐Ÿ” ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๋ชฉ๋ก ๐Ÿ” -T-1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` +T-1. [โ˜‘๏ธ] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` - T-1-1. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - T-1-2. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - - T-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ + - T-1-3. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ T-2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` - T-2-1. [] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ From c9d5c0d2a533dec0ae63d4f0de4ad634f73c0c00 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 19:39:55 +0900 Subject: [PATCH 14/23] =?UTF-8?q?feat=20:=20(C-1-3)=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- docs/StudyLog.md | 42 ++++++++++++++++++++++++++++++++++++++++-- src/InputManager.js | 20 ++++++++++++++++++-- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 4fb06fa732..05212b894a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,14 +35,14 @@ ## โœ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก โœ… -1. [] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ` +1. [โ˜‘๏ธ] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ` - C-1-1. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ex) "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”." - C-1-2. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ - ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ - ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์ œ๊ฑฐ - ex) 8000 - - C-1-3. [] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + - C-1-3. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - ๊ธˆ์•ก์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ - 1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ - ๊ธˆ์•ก์ด 1,000์› ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ diff --git a/docs/StudyLog.md b/docs/StudyLog.md index a0eafb6168..b1cb6f648c 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -119,6 +119,44 @@ ### T-1-2. ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - - `dmockResolvedValue` + - `mockResolvedValue` - ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค - - ์ด๋ฅผ ํ†ตํ•ด Console.readLineAsync๊ฐ€ ๋งˆ์น˜ ์‚ฌ์šฉ์ž๊ฐ€ '8000'๊ณผ ๊ฐ™์€ ์œ ํšจํ•œ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค \ No newline at end of file + - ์ด๋ฅผ ํ†ตํ•ด Console.readLineAsync๊ฐ€ ๋งˆ์น˜ ์‚ฌ์šฉ์ž๊ฐ€ '8000'๊ณผ ๊ฐ™์€ ์œ ํšจํ•œ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค + +
+ +### C-1-3. ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + + - `์ •๊ทœ ํ‘œํ˜„์‹` + - ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํŠน์ • ํŒจํ„ด์œผ๋กœ ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋ฅผ ๊ฒ€์ƒ‰, ๋Œ€์ฒด, ์ถ”์ถœํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ˜•์‹ ์–ธ์–ด + - ๋ณต์žกํ•œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐ„๋‹จํ•œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋กœ ๊ฐ•๋ ฅํ•œ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ๋ฐ ๋Œ€์ฒด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค + + - `๋ฌธ์ž์—ด ๊ฒ€์ฆ` + - ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ํŠน์ • ํ˜•์‹์„ ๋”ฐ๋ฅด๋Š”์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉ (์˜ˆ: ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ) + + - `๋ฌธ์ž์—ด ๊ฒ€์ƒ‰` + - ๋Œ€๋Ÿ‰์˜ ํ…์ŠคํŠธ์—์„œ ํŒจํ„ด์— ๋งž๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ + + - `๋ฌธ์ž์—ด ๋Œ€์ฒด` + - ํ…์ŠคํŠธ ๋‚ด์—์„œ ํŠน์ • ํŒจํ„ด์„ ์ฐพ์•„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•  ๋•Œ ์‚ฌ์šฉ + + - `๋ฌธ์ž์—ด ์ถ”์ถœ` + - ํ…์ŠคํŠธ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉ + + - `์ •๊ทœ ํ‘œํ˜„์‹์˜ ๋ฉ”์†Œ๋“œ` + - test() + - ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์ด ์ •๊ทœ ํ‘œํ˜„์‹์„ ๋งŒ์กฑํ•˜๋Š”์ง€ boolean์œผ๋กœ ๋ฐ˜ํ™˜ + - exec() + - ์ •๊ทœ ํ‘œํ˜„์‹์— ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์•„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ + - match() + - ๋ฌธ์ž์—ด์— ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ ์šฉํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ๋Š”๋‹ค + - replace() + - ๋ฌธ์ž์—ด์—์„œ ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒด + + - `์ •๊ทœ ํ‘œํ˜„์‹์˜ ํ”Œ๋ž˜๊ทธ` + - g (global) + - ์ „์—ญ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋ฌธ์ž์—ด ๋‚ด์˜ ๋ชจ๋“  ์ผ์น˜ ํ•ญ๋ชฉ์„ ์ฐพ๋Š”๋‹ค + - i (ignore case) + - ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๊ฒ€์ƒ‰ + - m (multiline) + - ์—ฌ๋Ÿฌ ์ค„์˜ ๋ฌธ์ž์—ด์—์„œ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ diff --git a/src/InputManager.js b/src/InputManager.js index 6c74c0ecf2..08a4dada3d 100644 --- a/src/InputManager.js +++ b/src/InputManager.js @@ -3,8 +3,24 @@ import { Console } from "@woowacourse/mission-utils"; class InputManager { async enterAmount() { const inputAmount = await Console.readLineAsync("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); - const cleanedAmount = inputAmount.replace(/\s+/g, ''); - return cleanedAmount; + const cleanedAmount = this.cleanInput(inputAmount); + this.validateAmount(cleanedAmount); + return parseInt(cleanedAmount, 10); + } + + cleanInput(input) { + return input.replace(/\s+/g, ''); + } + + validateAmount(amount) { + if (!/^\d+$/.test(amount)) { + throw new Error("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + + const numericAmount = parseInt(amount, 10); + if (numericAmount % 1000 !== 0) { + throw new Error("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } } } From 6b9e8cff2bdd07f1927541784267588333364ca9 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 20:04:42 +0900 Subject: [PATCH 15/23] =?UTF-8?q?chore=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/InputManagerTest.js | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 __tests__/InputManagerTest.js diff --git a/__tests__/InputManagerTest.js b/__tests__/InputManagerTest.js new file mode 100644 index 0000000000..3c1318aa27 --- /dev/null +++ b/__tests__/InputManagerTest.js @@ -0,0 +1,52 @@ +import InputManager from "../src/InputManager.js"; +import { Console } from "@woowacourse/mission-utils" + +jest.mock("@woowacourse/mission-utils", () => ({ + Console: { + readLineAsync: jest.fn() + } +})); + +describe("InputManager class", () => { + let inputManager; + + beforeEach(() => { + jest.clearAllMocks(); + inputManager = new InputManager(); + }); + + describe("T-1-1 ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ", () => { + test("์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค", async () => { + Console.readLineAsync.mockResolvedValue("1000"); + await inputManager.enterAmount(); + expect(Console.readLineAsync).toHaveBeenCalledWith("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + }); + }); + + describe("T-1-2 ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ", () => { + test("์ž…๋ ฅ๋ฐ›์€ ๊ธˆ์•ก์ด 1,000์› ๋‹จ์œ„์ผ ๋•Œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค", async () => { + const validAmount = "8000"; + Console.readLineAsync.mockResolvedValue(validAmount); + + const amount = await inputManager.enterAmount(); + expect(Console.readLineAsync).toHaveBeenCalled(); + expect(amount).toBe(parseInt(validAmount, 10)); + }); + }); + + describe("T-1-3 ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ", () => { + test("๊ธˆ์•ก์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค", async () => { + const invalidAmount = "abc"; + Console.readLineAsync.mockResolvedValue(invalidAmount); + + await expect(inputManager.enterAmount()).rejects.toThrow("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + }); + + test("1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค", async () => { + const invalidAmount = "1500"; + Console.readLineAsync.mockResolvedValue(invalidAmount); + + await expect(inputManager.enterAmount()).rejects.toThrow("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + }); + }); +}); \ No newline at end of file From e8a9cacffe782ddc1e744cd58f8e8b9b59049b45 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 20:06:27 +0900 Subject: [PATCH 16/23] =?UTF-8?q?feat=20:=20(T-2-1)=20=EA=B5=AC=EC=9E=85?= =?UTF-8?q?=20=EA=B8=88=EC=95=A1=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EB=B0=9C=ED=96=89=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/LottoTest.js | 8 +++++++- docs/README.md | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/__tests__/LottoTest.js b/__tests__/LottoTest.js index 97bd457659..802cb1293d 100644 --- a/__tests__/LottoTest.js +++ b/__tests__/LottoTest.js @@ -14,5 +14,11 @@ describe("๋กœ๋˜ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ", () => { }).toThrow("[ERROR]"); }); - // ์•„๋ž˜์— ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๊ฐ€๋Šฅ + describe("T-2-1 ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ", () => { + test("์ž…๋ ฅ๋ฐ›์€ ๊ธˆ์•ก์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ˆ˜์˜ ๋กœ๋˜๊ฐ€ ๋ฐœํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค", () => { + const amount = 5000; + const lottos = Lotto.generateMultipleLottos(amount); + expect(lottos).toHaveLength(amount / 1000); + }); + }); }); diff --git a/docs/README.md b/docs/README.md index 05212b894a..ea238aca3c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -112,7 +112,7 @@ T-1. [โ˜‘๏ธ] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` - T-1-3. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ T-2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` - - T-2-1. [] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ + - T-2-1. [โœ…] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ - T-2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ ํ…Œ์ŠคํŠธ - T-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ From 6c3084757e10bc706713557f7e84160a28b1aba8 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 20:15:07 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat=20:=20(C-2-1)=20=EA=B5=AC=EC=9E=85?= =?UTF-8?q?=20=EA=B8=88=EC=95=A1=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EB=B0=9C=ED=96=89=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- docs/StudyLog.md | 16 ++++++++++++++++ src/Lotto.js | 27 ++++++++++++++++++++++++--- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index ea238aca3c..a16a5b9a9b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -50,12 +50,12 @@ - ex) [ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰` - - C-2-1. [] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ + - C-2-1. [โœ…] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ - 1,000์› ๋‹จ์œ„๋กœ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ž๋™ ์ƒ์„ฑ - C-2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ - ์ˆซ์ž ๋ฒ”์œ„ 1~45 - - ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ - C-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ + - ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ - ex) "8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค." 3. [] `๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ` diff --git a/docs/StudyLog.md b/docs/StudyLog.md index b1cb6f648c..0f6a3551fe 100644 --- a/docs/StudyLog.md +++ b/docs/StudyLog.md @@ -160,3 +160,19 @@ - ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๊ฒ€์ƒ‰ - m (multiline) - ์—ฌ๋Ÿฌ ์ค„์˜ ๋ฌธ์ž์—ด์—์„œ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ + +
+ +## 2. ๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ + +
+ +### C-2-1. ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ + + - `Set` + - ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•˜๋‹ค + - ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๊ฐ™์ด ๊ณ ์œ ํ•œ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•  ๋•Œ Set์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต์„ ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค + + - `static` + - ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค + - ์ฃผ๋กœ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋‚˜, ํŠน์ • ์ธ์Šคํ„ด์Šค์— ์ข…์†๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค diff --git a/src/Lotto.js b/src/Lotto.js index cb0b1527e9..745ee1c858 100644 --- a/src/Lotto.js +++ b/src/Lotto.js @@ -1,9 +1,32 @@ +import { Random } from "@woowacourse/mission-utils" + class Lotto { #numbers; constructor(numbers) { this.#validate(numbers); - this.#numbers = numbers; + this.#numbers = numbers.sort((a, b) => a - b); + } + + get numbers() { + return this.#numbers; + } + + static generateNumbers() { + const numbers = new Set(); + while (numbers.size < 6) { + numbers.add(Random.pickNumberInRange(1, 45)); + } + return [...numbers].sort((a, b) => a - b); + } + + static generateMultipleLottos(amount) { + const numberOfLottos = Math.floor(amount / 1000); + const lottos = []; + for (let i = 0; i < numberOfLottos; i++) { + lottos.push(new Lotto(Lotto.generateNumbers())); + } + return lottos; } #validate(numbers) { @@ -11,8 +34,6 @@ class Lotto { throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } } - - // TODO: ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ } export default Lotto; From c12553b36e24ee34dfcdae52ec04458aa7a4567d Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 20:22:24 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat=20:=20(T-2-2)=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=A4=91=EB=B3=B5=20=EC=97=86=EC=9D=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/LottoTest.js | 8 ++++++++ docs/README.md | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/__tests__/LottoTest.js b/__tests__/LottoTest.js index 802cb1293d..ccd61c2860 100644 --- a/__tests__/LottoTest.js +++ b/__tests__/LottoTest.js @@ -21,4 +21,12 @@ describe("๋กœ๋˜ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ", () => { expect(lottos).toHaveLength(amount / 1000); }); }); + + describe("T-2-2 ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ ํ…Œ์ŠคํŠธ", () => { + test("๊ฐ ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์ด๋ฉฐ ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค", () => { + const numbers = Lotto.generateNumbers(); + expect(numbers).toHaveLength(6); + expect(new Set(numbers).size).toBe(6); + }); + }); }); diff --git a/docs/README.md b/docs/README.md index a16a5b9a9b..0816a29917 100644 --- a/docs/README.md +++ b/docs/README.md @@ -113,7 +113,7 @@ T-1. [โ˜‘๏ธ] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` T-2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` - T-2-1. [โœ…] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ - - T-2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ ํ…Œ์ŠคํŠธ + - T-2-2. [โœ…] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ ํ…Œ์ŠคํŠธ - T-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ T-3. [] `๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` From ca6a68be7a80b6e4d1148c5722865d9bbe0060c6 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 20:23:09 +0900 Subject: [PATCH 19/23] =?UTF-8?q?feat=20:=20(C-2-2)=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=A4=91=EB=B3=B5=20=EC=97=86=EC=9D=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/Lotto.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 0816a29917..6cc8a0a2d4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -52,7 +52,7 @@ 2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰` - C-2-1. [โœ…] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ - 1,000์› ๋‹จ์œ„๋กœ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ž๋™ ์ƒ์„ฑ - - C-2-2. [] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ + - C-2-2. [โœ…] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ - ์ˆซ์ž ๋ฒ”์œ„ 1~45 - C-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ - ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ diff --git a/src/Lotto.js b/src/Lotto.js index 745ee1c858..ebb59cca68 100644 --- a/src/Lotto.js +++ b/src/Lotto.js @@ -33,6 +33,12 @@ class Lotto { if (numbers.length !== 6) { throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } + if (new Set(numbers).size !== 6) { + throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต์ด ์žˆ์Šต๋‹ˆ๋‹ค."); + } + if (numbers.some(num => num < 1 || num > 45)) { + throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } } } From 4c012a643d7dcad304ee4ad0bfc1235fcd0df913 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 20:30:10 +0900 Subject: [PATCH 20/23] =?UTF-8?q?feat=20:=20(T-2-3)=20=EB=B0=9C=ED=96=89?= =?UTF-8?q?=ED=95=9C=20=EB=A1=9C=EB=98=90=20=EC=88=98=EB=9F=89=20=EB=B0=8F?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=B6=9C=EB=A0=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/LottoTest.js | 13 +++++++++++++ docs/README.md | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/__tests__/LottoTest.js b/__tests__/LottoTest.js index ccd61c2860..19f632fb24 100644 --- a/__tests__/LottoTest.js +++ b/__tests__/LottoTest.js @@ -29,4 +29,17 @@ describe("๋กœ๋˜ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ", () => { expect(new Set(numbers).size).toBe(6); }); }); + + describe("T-2-3 ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ", () => { + test("๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰๊ณผ ๋ฒˆํ˜ธ๊ฐ€ ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค", () => { + const consoleSpy = jest.spyOn(console, 'log'); + const lottos = Lotto.generateMultipleLottos(3000); + Lotto.printLottos(lottos); + expect(consoleSpy).toHaveBeenCalledWith("3๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."); + lottos.forEach(lotto => { + expect(consoleSpy).toHaveBeenCalledWith(`[ ${lotto.numbers.join(', ')} ]`); + }); + consoleSpy.mockRestore(); + }); + }); }); diff --git a/docs/README.md b/docs/README.md index 6cc8a0a2d4..8c6e7ce9ec 100644 --- a/docs/README.md +++ b/docs/README.md @@ -111,10 +111,10 @@ T-1. [โ˜‘๏ธ] `๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` - T-1-2. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - T-1-3. [โœ…] ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ -T-2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` +T-2. [โ˜‘๏ธ] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` - T-2-1. [โœ…] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ - T-2-2. [โœ…] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ ํ…Œ์ŠคํŠธ - - T-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-2-3. [โœ…] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ T-3. [] `๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` - T-3-1. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ From 67d9662d75b6e3437250c5577b8c0aa65f675a16 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 21:59:53 +0900 Subject: [PATCH 21/23] =?UTF-8?q?refactor=20:=20(T-2-3)=20=EB=B0=9C?= =?UTF-8?q?=ED=96=89=ED=95=9C=20=EB=A1=9C=EB=98=90=20=EC=88=98=EB=9F=89=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B2=88=ED=98=B8=20=EC=B6=9C=EB=A0=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/LottoTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/LottoTest.js b/__tests__/LottoTest.js index 19f632fb24..8da9a15c06 100644 --- a/__tests__/LottoTest.js +++ b/__tests__/LottoTest.js @@ -37,7 +37,7 @@ describe("๋กœ๋˜ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ", () => { Lotto.printLottos(lottos); expect(consoleSpy).toHaveBeenCalledWith("3๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."); lottos.forEach(lotto => { - expect(consoleSpy).toHaveBeenCalledWith(`[ ${lotto.numbers.join(', ')} ]`); + expect(consoleSpy).toHaveBeenCalledWith(`[${lotto.numbers.join(', ')}]`); }); consoleSpy.mockRestore(); }); From ff660fb5abee3f078d5bf6fea112d57fa8dfb584 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 22:01:04 +0900 Subject: [PATCH 22/23] =?UTF-8?q?feat=20:=20(C-2-3)=20=EB=B0=9C=ED=96=89?= =?UTF-8?q?=ED=95=9C=20=EB=A1=9C=EB=98=90=20=EC=88=98=EB=9F=89=20=EB=B0=8F?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- src/App.js | 6 +++++- src/InputManager.js | 18 ++++++++++++------ src/Lotto.js | 45 +++++++++++++++++++++++++++++---------------- 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8c6e7ce9ec..ed413cf289 100644 --- a/docs/README.md +++ b/docs/README.md @@ -49,12 +49,12 @@ - throw๋ฌธ์„ ์‚ฌ์šฉํ•ด "[ERROR]" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ - ex) [ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -2. [] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰` +2. [โ˜‘๏ธ] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰` - C-2-1. [โœ…] ๊ตฌ์ž… ๊ธˆ์•ก์— ๋”ฐ๋ฅธ ๋กœ๋˜ ๋ฐœํ–‰ - 1,000์› ๋‹จ์œ„๋กœ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ž๋™ ์ƒ์„ฑ - C-2-2. [โœ…] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ค‘๋ณต ์—†์ด ์ƒ์„ฑ - ์ˆซ์ž ๋ฒ”์œ„ 1~45 - - C-2-3. [] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ + - C-2-3. [โœ…] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ - ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ - ex) "8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค." diff --git a/src/App.js b/src/App.js index a356f0bdb2..4d9efcbb21 100644 --- a/src/App.js +++ b/src/App.js @@ -1,9 +1,13 @@ import InputManager from './InputManager.js'; +import Lotto from './Lotto.js'; class App { async play() { const inputManager = new InputManager(); - await inputManager.enterAmount(); + const amount = await inputManager.enterAmount(); + const lottos = Lotto.generateMultipleLottos(amount); + + Lotto.printLottos(lottos); } } diff --git a/src/InputManager.js b/src/InputManager.js index 08a4dada3d..ced3a8f7de 100644 --- a/src/InputManager.js +++ b/src/InputManager.js @@ -4,24 +4,30 @@ class InputManager { async enterAmount() { const inputAmount = await Console.readLineAsync("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); const cleanedAmount = this.cleanInput(inputAmount); - this.validateAmount(cleanedAmount); - return parseInt(cleanedAmount, 10); + return this.validateAmount(cleanedAmount); } cleanInput(input) { - return input.replace(/\s+/g, ''); + return input.replace(/\s+/g, '').replace(/,/g, ''); } validateAmount(amount) { - if (!/^\d+$/.test(amount)) { + const numericAmount = Number(amount); + + if (isNaN(numericAmount)) { throw new Error("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } - const numericAmount = parseInt(amount, 10); + if (numericAmount <= 0) { + throw new Error("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + if (numericAmount % 1000 !== 0) { throw new Error("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } + + return numericAmount; } } -export default InputManager; \ No newline at end of file +export default InputManager; diff --git a/src/Lotto.js b/src/Lotto.js index ebb59cca68..d250061350 100644 --- a/src/Lotto.js +++ b/src/Lotto.js @@ -1,4 +1,5 @@ import { Random } from "@woowacourse/mission-utils" +import { Console } from "@woowacourse/mission-utils" class Lotto { #numbers; @@ -12,33 +13,45 @@ class Lotto { return this.#numbers; } - static generateNumbers() { - const numbers = new Set(); - while (numbers.size < 6) { - numbers.add(Random.pickNumberInRange(1, 45)); + #validate(numbers) { + if (numbers.length !== 6) { + throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } - return [...numbers].sort((a, b) => a - b); + + if (new Set(numbers).size !== 6) { + throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต์ด ์žˆ์Šต๋‹ˆ๋‹ค."); + } + + numbers.forEach((number) => { + if (isNaN(number)) { + throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + + if (number < 1 || number > 45) { + throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + }); + } + + static generateNumbers() { + const numbers = Random.pickUniqueNumbersInRange(1, 45, 6); + return numbers.sort((a, b) => a - b); } static generateMultipleLottos(amount) { const numberOfLottos = Math.floor(amount / 1000); const lottos = []; for (let i = 0; i < numberOfLottos; i++) { - lottos.push(new Lotto(Lotto.generateNumbers())); + lottos.push(new Lotto(this.generateNumbers())); } return lottos; } - #validate(numbers) { - if (numbers.length !== 6) { - throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); - } - if (new Set(numbers).size !== 6) { - throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต์ด ์žˆ์Šต๋‹ˆ๋‹ค."); - } - if (numbers.some(num => num < 1 || num > 45)) { - throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); - } + static printLottos(lottos) { + Console.print(`${lottos.length}๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.`); + lottos.forEach(lotto => { + Console.print(`[${lotto.numbers.join(', ')}]`); + }); } } From 4fce34d39f5e8d99c6df0e347e07aed7496f4ad4 Mon Sep 17 00:00:00 2001 From: lucia0929 Date: Wed, 8 Nov 2023 23:56:35 +0900 Subject: [PATCH 23/23] =?UTF-8?q?feat=20:=20=EB=82=98=EB=A8=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/BeforeRefactor.test.js | 53 -------------------- __tests__/LottoTest.js | 1 + docs/README.md | 2 +- src/App.js | 11 +++++ src/{InputManager.js => InputAmount.js} | 2 +- src/InputLotto.js | 65 +++++++++++++++++++++++++ src/Lotto.js | 4 ++ src/OutputLotto.js | 65 +++++++++++++++++++++++++ 8 files changed, 148 insertions(+), 55 deletions(-) delete mode 100644 __tests__/BeforeRefactor.test.js rename src/{InputManager.js => InputAmount.js} (99%) create mode 100644 src/InputLotto.js create mode 100644 src/OutputLotto.js diff --git a/__tests__/BeforeRefactor.test.js b/__tests__/BeforeRefactor.test.js deleted file mode 100644 index b5e03a0d7f..0000000000 --- a/__tests__/BeforeRefactor.test.js +++ /dev/null @@ -1,53 +0,0 @@ -import InputManager from "../src/InputManager.js"; - -import { Console } from "@woowacourse/mission-utils" - -jest.mock("@woowacourse/mission-utils", () => ({ - Console: { - readLineAsync: jest.fn() - } -})); - -describe("InputManager class", () => { - let inputManager; - - beforeEach(() => { - jest.clearAllMocks(); - inputManager = new InputManager(); - }); - - describe("T-1-1 ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ", () => { - test("์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธˆ์•ก ์ž…๋ ฅ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค", async () => { - Console.readLineAsync.mockResolvedValue("1000"); - await inputManager.enterAmount(); - expect(Console.readLineAsync).toHaveBeenCalledWith("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); - }); - }); - - describe("T-1-2 ๊ธˆ์•ก ์ž…๋ ฅ ์ฒ˜๋ฆฌ", () => { - test("์ž…๋ ฅ๋ฐ›์€ ๊ธˆ์•ก์ด 1,000์› ๋‹จ์œ„์ผ ๋•Œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค", async () => { - const validAmount = "8000"; - Console.readLineAsync.mockResolvedValue(validAmount); - - const amount = await inputManager.enterAmount(); - expect(Console.readLineAsync).toHaveBeenCalled(); - expect(amount).toBe(parseInt(validAmount, 10)); - }); - }); - - describe("T-1-3 ๊ธˆ์•ก ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ", () => { - test("๊ธˆ์•ก์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค", async () => { - const invalidAmount = "abc"; - Console.readLineAsync.mockResolvedValue(invalidAmount); - - await expect(inputManager.enterAmount()).rejects.toThrow("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); - }); - - test("1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค", async () => { - const invalidAmount = "1500"; - Console.readLineAsync.mockResolvedValue(invalidAmount); - - await expect(inputManager.enterAmount()).rejects.toThrow("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); - }); - }); -}); \ No newline at end of file diff --git a/__tests__/LottoTest.js b/__tests__/LottoTest.js index 8da9a15c06..14281fcf5b 100644 --- a/__tests__/LottoTest.js +++ b/__tests__/LottoTest.js @@ -43,3 +43,4 @@ describe("๋กœ๋˜ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ", () => { }); }); }); + diff --git a/docs/README.md b/docs/README.md index ed413cf289..1f99952366 100644 --- a/docs/README.md +++ b/docs/README.md @@ -117,7 +117,7 @@ T-2. [โ˜‘๏ธ] `๋กœ๋˜ ๋ฒˆํ˜ธ ๋ฐœํ–‰ ํ…Œ์ŠคํŠธ` - T-2-3. [โœ…] ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ T-3. [] `๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฐ›๊ธฐ ํ…Œ์ŠคํŠธ` - - T-3-1. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ + - T-3-1. [โœ…] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ - T-3-2. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ - T-3-3. [] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ diff --git a/src/App.js b/src/App.js index 4d9efcbb21..1a4898247e 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,8 @@ import InputManager from './InputManager.js'; import Lotto from './Lotto.js'; +import { inputBonusNumber, inputWinningNumbers } from "./InputLotto"; +import { printResult, printProfit } from "./OutputLotto"; + class App { async play() { @@ -8,6 +11,14 @@ class App { const lottos = Lotto.generateMultipleLottos(amount); Lotto.printLottos(lottos); + + await Lotto.inputWinningNumbers(); + + const lotto = await inputWinningNumbers(); + const bonusNumber = await inputBonusNumber(lotto); + const matchedData = lottoChecker(randomNumbers, lotto, bonusNumber); + const winningData = printResult(matchedData); + printProfit(amount, winningData); } } diff --git a/src/InputManager.js b/src/InputAmount.js similarity index 99% rename from src/InputManager.js rename to src/InputAmount.js index ced3a8f7de..e9d2577102 100644 --- a/src/InputManager.js +++ b/src/InputAmount.js @@ -10,7 +10,7 @@ class InputManager { cleanInput(input) { return input.replace(/\s+/g, '').replace(/,/g, ''); } - + validateAmount(amount) { const numericAmount = Number(amount); diff --git a/src/InputLotto.js b/src/InputLotto.js new file mode 100644 index 0000000000..4a48066744 --- /dev/null +++ b/src/InputLotto.js @@ -0,0 +1,65 @@ +import { Console } from "@woowacourse/mission-utils"; + +class InputLotto { + async inputWinningNumbers() { + const inputNumbers = await Console.readLineAsync("๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + const winningNumbers = this.validateWinningNumbers(inputNumbers).split(',').map(Number); + return winningNumbers; + } + + validateWinningNumbers(winningNumbers) { + if (!winningNumbers) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."); + } + + const commaNumbers = winningNumbers.split(','); + if (commaNumbers.length !== 6) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + + if (new Set(commaNumbers).size !== 6) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ์— ์ค‘๋ณต์ด ์žˆ์Šต๋‹ˆ๋‹ค."); + } + + commaNumbers.forEach((number) => { + if (isNaN(Number(number))) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + + if (Number(number) < 1 || Number(number) > 45) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + }); + + return commaNumbers; + } + + async inputBonusNumber(winningNumbers) { + while (true) { + try { + const bonusInput = await Console.readLineAsync("๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + const bonusNumber = this.validateBonusNumber(winningNumbers, bonusInput); + + return bonusNumber; + } catch (error) { + Console.print(error.message); + } + } + } + + validateBonusNumber(winningNumbers, bonusInput) { + const bonusNumber = parseInt(bonusInput, 10); + + if (isNaN(bonusNumber)) { + throw new Error("[ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } else if (bonusNumber < 1 || bonusNumber > 45) { + throw new Error("[ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } else if (new Set([...winningNumbers, bonusNumber]).size !== 7) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋˜๋Š” ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ์ž…๋ ฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + + return bonusNumber; + } +} + +export default InputLotto; \ No newline at end of file diff --git a/src/Lotto.js b/src/Lotto.js index d250061350..0d91f2f08e 100644 --- a/src/Lotto.js +++ b/src/Lotto.js @@ -33,6 +33,10 @@ class Lotto { }); } + get validate() { + return this.#validate; + } + static generateNumbers() { const numbers = Random.pickUniqueNumbersInRange(1, 45, 6); return numbers.sort((a, b) => a - b); diff --git a/src/OutputLotto.js b/src/OutputLotto.js new file mode 100644 index 0000000000..4a48066744 --- /dev/null +++ b/src/OutputLotto.js @@ -0,0 +1,65 @@ +import { Console } from "@woowacourse/mission-utils"; + +class InputLotto { + async inputWinningNumbers() { + const inputNumbers = await Console.readLineAsync("๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + const winningNumbers = this.validateWinningNumbers(inputNumbers).split(',').map(Number); + return winningNumbers; + } + + validateWinningNumbers(winningNumbers) { + if (!winningNumbers) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."); + } + + const commaNumbers = winningNumbers.split(','); + if (commaNumbers.length !== 6) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + + if (new Set(commaNumbers).size !== 6) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ์— ์ค‘๋ณต์ด ์žˆ์Šต๋‹ˆ๋‹ค."); + } + + commaNumbers.forEach((number) => { + if (isNaN(Number(number))) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + + if (Number(number) < 1 || Number(number) > 45) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + }); + + return commaNumbers; + } + + async inputBonusNumber(winningNumbers) { + while (true) { + try { + const bonusInput = await Console.readLineAsync("๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + const bonusNumber = this.validateBonusNumber(winningNumbers, bonusInput); + + return bonusNumber; + } catch (error) { + Console.print(error.message); + } + } + } + + validateBonusNumber(winningNumbers, bonusInput) { + const bonusNumber = parseInt(bonusInput, 10); + + if (isNaN(bonusNumber)) { + throw new Error("[ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } else if (bonusNumber < 1 || bonusNumber > 45) { + throw new Error("[ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } else if (new Set([...winningNumbers, bonusNumber]).size !== 7) { + throw new Error("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋˜๋Š” ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ์ž…๋ ฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + + return bonusNumber; + } +} + +export default InputLotto; \ No newline at end of file