๋ฆฌํฉํฐ๋ง, ๋งํด ํ์ธ๋ฌ
- 1. ๋ฆฌํฉํฐ๋ง ์ฒซ ๋ฒ์งธ ์์
- 2. ๋ฆฌํฉํฐ๋ง ์์น
- 3. ์ฝ๋์์ ๋๋ ์ ์ทจ
- 4. ํ ์คํธ ๊ตฌ์ถํ๊ธฐ
- 6. ๊ธฐ๋ณธ์ ์ธ ๋ฆฌํฉํฐ๋ง
- 7. ์บก์ํ
- 8. ๊ธฐ๋ฅ ์ด๋
p.26 ์์ ํ๋ก๊ทธ๋จ์ ๋ณธ ์๊ฐ
์ค๊ณ๊ฐ ๋์ ์์คํ ์ ์์ ํ๊ธฐ ์ด๋ ต๋ค. ์ํ๋ ๋์์ ์ํํ๋๋ก ํ๊ธฐ์ํด ์์ ํด์ผ ํ ๋ถ๋ถ์ ์ฐพ๊ณ , ๊ธฐ์กด ์ฝ๋์ ์ ๋ง๋ฌผ๋ ค ์๋ํ๊ฒ ํ ๋ฐฉ๋ฒ์ ๊ฐ๊ตฌํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌด์์ ์์ ํ ์ง ์ฐพ๊ธฐ ์ด๋ ต๋ค๋ฉด ์ค์๋ฅผ ์ ์ง๋ฌ์ ๋ฒ๊ทธ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ๋ ๋์์ง๋ค.
์๋ฐฑ ์ค์ง๋ฆฌ ์ฝ๋๋ฅผ ์์ ํ ๋๋ฉด ๋จผ์ ํ๋ก๊ทธ๋จ์ ์๋ ๋ฐฉ์์ ๋ ์ฝ๊ฒ ํ์ ํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ฌ๋ฌ ํจ์์ ํ๋ก๊ทธ๋จ ์์๋ก ์ฌ๊ตฌ์ฑํ๋ค. ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ๊ฐ ๋น์ฝํ๋ค๋ฉด ๋์ฒด๋ก ๊ตฌ์กฐ๋ถํฐ ๋ฐ๋ก์ก์ ๋ค์ ๊ธฐ๋ฅ์ ์์ ํ๋ ํธ์ด ์์ ํ๊ธฐ๊ฐ ํจ์ฌ ์์ํ๋ค.
ํ๋ก๊ทธ๋จ์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ์ ํธํ ๊ตฌ์กฐ๊ฐ ์๋๋ผ๋ฉด, ๋จผ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ฌ์ด ํํ๋ก ๋ฆฌํฉํฐ๋งํ๊ณ ๋์ ์ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.
- ์ํํธ์จ์ด์ ๊ฒ๋ณด๊ธฐ ๋์์ ๊ทธ๋๋ก ์ ์งํ ์ฑ, ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฝ๋๋ก ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฒ
- ๋ช ์ฌ - ์ํํธ์จ์ด์ ๊ฒ๋ณด๊ธฐ ๋์์ ๊ทธ๋๋ก ์ ์งํ ์ฑ, ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฝ๋๋ก ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฒ
- ๋์ฌ - ์ํํธ์จ์ด์ ๊ฒ๋ณด๊ธฐ ๋์์ ๊ทธ๋๋ก ์ ์งํ ์ฑ, ์ฌ๋ฌ ๊ฐ์ง ๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ์ ์ ์ฉํด์ ์ํํธ์จ์ด๋ฅผ ์ฌ๊ตฌ์ฑํ๋ค
- ์ง๊ธ๊ป ์๋ง์ ์ฌ๋์ด ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ ์์ ์ ๋ชจ๋ โ๋ฆฌํฉํฐ๋งโ์ด๋ผ๊ณ ํํํ๊ณ ์๋๋ฐ, ํน์ ํ ๋ฐฉ์์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ ๊ฒ๋ง์ด ๋ฆฌํฉํฐ๋ง์ด๋ค
- ๋๊ตฐ๊ฐ โ๋ฆฌํฉํฐ๋งํ๋ค๊ฐ ์ฝ๋๊ฐ ๊นจ์ ธ์ ๋ฉฐ์น ์ด๋ ๊ณ ์ํ๋คโ๋ผ๊ณ ํ๋ค๋ฉด, ์ญ์คํ๊ตฌ ๋ฆฌํฉํฐ๋งํ ๊ฒ์ด ์๋๋ค
- ํ ๋ฒ์ ๋ฐ๊ฟ ์ ์๋ ์์ ์ ์๋ง์ ๋จ๊ณ๋ก ์๊ฒ ๋๋ ์ ์์ ํ๋ ๋ชจ์ต์ ์ฒ์ ์ ํ๋ฉด ๋ฆฌํฉํฐ๋งํ๋ ๊ฒ์ด ์คํ๋ ค ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฝ๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์๊ฒ ๋๋์ผ๋ก์จ ์คํ๋ ค ์์ ์ ๋ ๋นจ๋ฆฌ ์ฒ๋ฆฌํ ์ ์๋ค
- ๋ฌด์๋ณด๋ค ๋๋ฒ๊น ํ๋ ๋ฐ ์๊ฐ์ ๋บ๊ธฐ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค
- ๋ฆฌํฉํฐ๋งํ๊ธฐ ์ ๊ณผ ํ์ ์ฝ๋๊ฐ ๋๊ฐ์ด ๋์ํด์ผ ํ๋ค. ์ฌ์ฉ์์ ๊ด์ ์์๋ ๋ฌ๋ผ์ง๋ ์ ์ด ์์ด์ผ ํ๋ค
- ๋ฆฌํฉํฐ๋ง์ ์ฑ๋ฅ ์ต์ ํ์ ๋น์ทํ๋ค. ๋ ๋ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง๋ง ํ๋ก๊ทธ๋จ์ ์ ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ ์งํ๋ค. ๋จ์ง ๋ชฉ์ ์ด ๋ค๋ฅผ ๋ฟ์ด๋ค. ๋ฆฌํฉํฐ๋ง์ ๋ชฉ์ ์ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ฉด ์ฑ๋ฅ ์ต์ ํ๋ ์ค๋ก์ง ์๋ ๊ฐ์ ์๋ง ์ ๊ฒฝ ์ด๋ค. ๊ทธ๋์ ๋ชฉํ ์ฑ๋ฅ์ ๋ฐ๋์ ๋๋ฌํด์ผ ํ๋ค๋ฉด ์ฝ๋๋ ๋ค๋ฃจ๊ธฐ์ ๋ ์ด๋ ต๊ฒ ๋ฐ๋ ์๋ ์์์ ๊ฐ์คํด์ผ ํ๋ค
- ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ ๋ ๋ชฉ์ ์ด โ๊ธฐ๋ฅ ์ถ๊ฐโ๋, ์๋๋ฉด โ๋ฆฌํฉํฐ๋งโ์ด๋๋ฅผ ๋ช ํํ ๊ตฌ๋ถํด ์์ ํ๋ค
- ์ผํธ ๋ฒก์ ์ด๋ฅผ ๋ ๊ฐ์ ๋ชจ์์ ๋น์ ํ๋ค.
- ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋๋ โ๊ธฐ๋ฅ ์ถ๊ฐโ๋ชจ์๋ฅผ ์ด ๋ค์ ๊ธฐ์กด ์ฝ๋๋ ์ ๋ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ค
- ๋ฆฌํฉํฐ๋งํ ๋๋ โ๋ฆฌํฉํฐ๋งโ ๋ชจ์๋ฅผ ์ด ๋ค์ ๊ธฐ๋ฅ ์ถ๊ฐ๋ ์ ๋ ํ์ง ์๊ธฐ๋ก ๋ค์งํ ๋ค ์ค๋ก์ง ์ฝ๋ ์ฌ๊ตฌ์ฑ์๋ง ์ ๋ ํ๋ค
-
์ํํธ์จ์ด ์ค๊ณ๊ฐ ์ข์์ง๋ค
- ๋ฆฌํฉํฐ๋งํ์ง ์์ผ๋ฉด ์ํํธ์จ์ด ๋ด๋ถ ์ค๊ณ(์ํคํ ์ฒ)๊ฐ ์ฉ๊ธฐ ์ฝ๋ค
- ์ํคํ ์ฒ๋ฅผ ์ถฉ๋ถํ ์ดํดํ์ง ๋ชปํ ์ฑ ๋จ๊ธฐ ๋ชฉํ๋ง์ ์ํด ์ฝ๋๋ฅผ ์์ ํ๋ค ๋ณด๋ฉด ๊ธฐ๋ฐ ๊ตฌ์กฐ๊ฐ ๋ฌด๋์ง๊ธฐ ์ฝ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฝ๋๋ง ๋ด์๋ ์ค๊ณ๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์์ง๋ค
- ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ฌด๋์ง๊ธฐ ์์ํ๋ฉด ์ ํจ๊ณผ๊ฐ ๋์ ๋๋ค
- ๊ฐ์ ์ผ์ ํ๋๋ผ๋ ์ค๊ณ๊น ๋์๋ฉด ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ธฐ ์ญ์์ด๋ค
- ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ชจ๋ ์ฝ๋๊ฐ ์ธ์ ๋ ๊ณ ์ ํ ์ผ์ ์ํํจ์ ๋ณด์ฅํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฐ๋์งํ ์ค๊ณ์ ํต์ฌ์ด๋ค
-
์ํํธ์จ์ด๋ฅผ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค
- ์ปดํจํฐ์๊ฒ ์ํค๋ ค๋ ์ผ๊ณผ ์ด๋ฅผ ํํํ ์ฝ๋์ ์ฐจ์ด๋ฅผ ์ต๋ํ ์ค์ฌ์ผ ํ๋ค
- ํ๋ก๊ทธ๋๋ฐ์ ๊ฒฐ๊ตญ ๋ด๊ฐ ์ํ๋ ๋ฐ๋ฅผ ์ ํํ ํํํ๋ ์ผ์ด๋ค
- ๋ฆฌํฉํฐ๋ง์ ์ฝ๋๊ฐ ๋ ์ ์ฝํ๊ฒ ๋์์ค๋ค
- ๋จ์ง ๋ค๋ฅธ ์ฌ๋์ ๋ฐฐ๋ คํ๊ธฐ ์ํด์๊ฐ ์๋๋ค. ์ฌ์ค ๊ทธ ๋ค๋ฅธ ์ฌ๋์ด ๋ฐ๋ก ๋ ์์ ์ผ ๋๊ฐ ๋ง๋ค
- ๊ธฐ์ตํ ํ์๊ฐ ์๋ ๊ฒ์ ์ต๋ํ ์ฝ๋์ ๋ด์ผ๋ ค๊ณ ํ๋ค(์ฝ๋ ์์ฒด๋ง ๋ณด๊ณ ํ์ ํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด ์ ์ผ ์ข๋ค)
-
๋ฒ๊ทธ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ฐ
- ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๋ค๋ ๋ง์ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ธฐ ์ฝ๋ค๋ ๋ง์ด๊ธฐ๋ ํ๋ค
- ๋ฆฌํฉํฐ๋งํ๋ฉด ์ฝ๋๊ฐ ํ๋ ์ผ์ ๊น์ด ํ์ ํ๊ฒ ๋๋ฉด์ ์๋ก ๊นจ๋ฌ์ ๊ฒ์ ๊ณง๋ฐ๋ก ์ฝ๋์ ๋ฐ์ํ๊ฒ ๋๋ค
-
ํ๋ก๊ทธ๋๋ฐ ์๋๋ฅผ ๋์ผ ์ ์๋ค
- ํ ์์คํ ์ ์ค๋ ๊ฐ๋ฐ ์ค์ธ ๊ฐ๋ฐ์๋ค๊ณผ ์๊ธฐํ๋ค ๋ณด๋ฉด ์ด๊ธฐ์๋ ์ง์ฒ์ด ๋นจ๋์ง๋ง ํ์ฌ๋ ์ ๊ธฐ๋ฅ์ ํ๋ ์ถ๊ฐํ๋๋ฐ ํจ์ฌ ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ ๋ง์ ๋ง์ด ํ๋ค
- ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์๋ก ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค์ ์ ๋ น์ฌ๋ผ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋ฐ ๋๋ ์๊ฐ์ด ๋์ด๋๋ค๋ ๊ฒ์ด๋ค
- ์ค๋ น ํ๋ก๊ทธ๋จ ์๊ตฌ์ฌํญ์ด ๋ฐ๋๋๋ผ๋ ์ค๊ณ๋ฅผ ์ง์ํด์ ๊ฐ์ ํ ์ ์๋ค
- ๊ทธ๋์ ๋น ๋ฅธ ๊ฐ๋ฐ์ด๋ผ๋ ์ญ๊ณ ํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ๋ฆฌํฉํฐ๋ง์ด ๋ฐ๋์ ํ์ํ๋ค
-
ํ๋ก์ ํธ ์์๋จ๊ณ
- ์ข์ ๋์์ธ ํจํด์ผ๋ก ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์์ฑ
- ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ์ฝ๋๋ฅผ ์์ฑ
- ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑ (ํ ์คํธ ์ฝ๋๋ฅผ ๋์ํ๊ฒ ํ๊ธฐ ์ํ ๋ฆฌํฉํ ๋ง)
- 3์ ๋ฒ์น: ๋น์ทํ ์ผ์ ์ธ ๋ฒ์จฐ ํ๊ฒ ๋๋ฉด ๋ฆฌํฉํ ๋งํ๋ค
- ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ > ์ข์ ๋ฌธ์ํ
- ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐํ๊ฒ ๋ง๋ค๊ธฐ > ์ฌ์ฌ์ฉ์ฑ, ๋ชจ๋์ฑ์ ๋์ผ ์ ์์
-
ํ๋ก์ ํธ ์ ์ง๋ณด์ ๋จ๊ณ
- ๋ฒ๊ทธ๋ฆ ๊ฒ์ฆํ ์ ์๋ ํ ์คํธ ์ฝ๋
- ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ, ๋ณ๊ฒฝํ๊ธฐ ์ฝ๊ฒ ๋ณ๊ฒฝ (๋ฆฌํฉํ ๋ง)
-
์ค๋๋(๋ ๊ฑฐ์) ํ๋ก์ ํธ
- (๋ฒ๊ทธ ์์ ๋ฐ ๊ธฐ๋ฅ์ถ๊ฐ์์๋ง) ์์ ์ด ํ์ํ ๋ชจ๋/์ฝ๋ ํ์ ์ ์ผ๋ก ํ ์คํธ ์ถ๊ฐ
- ๋ฆฌํฉํ ๋ง์ ํตํด ์ฝ๋ ์์ ๋๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ
- ๋๋ก๋ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋น ๋ฅผ ์ ์์ผ๋ฏ๋ก ์ฐ์ ์์์ ๋ฐ๋ผ ์ ๋ต์ ๋ค๋ฅด๊ฒ ๊ฐ์ ธ๊ฐ์ผ ํ๋ค
- โ๋ฌด๊ฒฐ์ ํด๋ฆฐ์ฝ๋, ์๋ฒฝํ ์ค๊ณ๋ ์กด์ฌํ์ง ์๋๋คโ๋ฅผ ์ธ์ ํด์ผ ํ๋ค
- ์ํฉ์ ๋ง๊ฒ ์ข์ ๋์์ธ ํจํด์ผ๋ก ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์์ฑํ๋ฉด ๋๋ค
- ๋จผ์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ์ฝ๋๋ฅผ ์์ฑํ ์ดํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ๋ฆฌํฉํ ๋ง์ ํด๋๊ฐ๋ค.
- ์ ๊ทธ๋: You Ainโt Gonna Need It
- ๋น์ฅ ํ์ํ์ง ์๋ ๊ธฐ๋ฅ์ ์ง์ฐฉํด์ ์ฝ๋๋ฅผ ์ง๋์น๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค ํ์๊ฐ ์๋ค
- ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ฅ์ ์ฐ์ ์ ์ผ๋ก ๋ง๋ค ํ์๊ฐ ์๋ค
- ์ง๋์น๊ฒ ๋ฏธ๋์งํฅ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค
- ์๊ฐ ํ ์คํธ ์ฝ๋์ ๋ฆฌํฉํฐ๋ง์ ๋ฌถ์ด์ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD)์ด๋ผ ํ๋ค
- ๋ฆฌํฉํฐ๋ง์ ์ฒซ ๋ฒ์งธ ํ ๋๋ ์๊ฐ ํ ์คํธ ์ฝ๋๋ค
- ํ๋ก๊ทธ๋๋ฐ ๋์ค ๋ฐ์ํ ์ค๋ฅ๋ฅผ ํ์คํ ๊ฑธ๋ฌ๋ด๋ ํ ์คํธ๋ฅผ ์๋์ผ๋ก ์ํํ ์ ์์ด์ผ ํ๋ค
- ์ง์์ ํตํฉ์ ์ ์ฉํ๋ฉด ํ์ ๊ฐ์๊ฐ ์ํํ ๋ฆฌํฉํฐ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒ ๋๋ฃ์ ๊ณต์ ํ ์ ์๋ค
- ์๊ฐ ํ ์คํธ ์ฝ๋, ์ง์์ ํตํฉ, ๋ฆฌํฉํฐ๋ง์ด๋ผ๋ ์ธ ๊ธฐ๋ฒ์ ์๋ก ๊ฐ๋ ฅํ ์์นํจ๊ณผ๋ฅผ ๋ฐํํ๋ค
- ๋ฆฌํฉํฐ๋ง๊ณผ YAGNI๋ ์๋ก ๊ธ์ ์ ์ธ ์ํฅ์ ์ค๋ค. ๋ฆฌํฉํฐ๋ง์ด YAGNI์ ํ ๋์ธ ๋์์, YAGNI๋ก ์ธํด ๋ฆฌํฉํฐ๋ง์ ๋์ฑ ์ฝ๊ฒ ํ ์ ์๋ค
-
โ์ง๊ด์ ์ธ ์ค๊ณ vs ์ฑ๋ฅโ์ ์ค์ํ ์ฃผ์ ๋ค
-
๋ฆฌํฉํฐ๋งํ๋ฉด ์ํํธ์จ์ด๊ฐ ๋๋ ค์ง ์ ์๋ ๊ฑด ์ฌ์ค์ด๋ค. ํ์ง๋ง ๊ทธ์ ๋์์ ์ฑ๋ฅ์ ํ๋ํ๊ธฐ๋ ๋ ์ฌ์์ง๋ค
-
๋จผ์ ํ๋ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ ๋์ ์ํ๋ ์๋๊ฐ ๋๊ฒ๋ ํ๋ํ๋ ๊ฒ์ด๋ค
-
์ฑ๋ฅ ์ต์ ํ ๋จ๊ณ๊ฐ ๋๋ฉด ๋ค์์ ๊ตฌ์ฒด์ ์ธ ์ ์ฐจ๋ฅผ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ํ๋ํ๋ค
- ๋จผ์ ํ๋กํ์ผ๋ฌ๋ก ํ๋ก๊ทธ๋จ์ ๋ถ์ํ์ฌ ์๊ฐ๊ณผ ๊ณต๊ฐ์ ๋ง์ด ์ก์๋จน๋ ์ง์ ์ ์์๋ธ๋ค
- ๊ทธ๋ฐ ๋ค์ ์ ์ฒด๋ฅผ ๊ณ ๋ฅด๊ฒ ์ต์ ํํ ๋์ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ทธ ๋ถ๋ถ๋ค์ ๊ฐ์ ํ๋ค
- ๊ฐ ๋จ๊ณ๋ง๋ค ์ปดํ์ผ๊ณผ ํ ์คํธ๋ฅผ ๊ฑฐ์น๊ณ ํ๋กํ์ผ๋ฌ๋ฅผ ๋ค์ ์คํํด๋ณธ๋ค
- ์ฑ๋ฅ์ด ๊ฐ์ ๋์ง ์์๋ค๋ฉด ์์ ๋ด์ฉ์ ๋๋๋ฆฐ๋ค
- ์ด์ ๋ฆฌํฉํฐ๋ง์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ฐ์ด ์์ ๊ฒ์ด๋ค. ํ์ง๋ง โ์ ์ฉ ๋ฐฉ๋ฒโ์ ์๋ ๊ฒ๊ณผ โ์ ๋ ์ ์ฉโํ ์ค ์๋ ๊ฒ์ ๋ค๋ฅด๋ค
- ๋ฆฌํฉํฐ๋ง์ ์ธ์ ์์ํ๊ณ ์ธ์ ๊ทธ๋งํ ์ง๋ฅผ ํ๋จํ๋ ์ผ์ ๋ฆฌํฉํฐ๋ง์ ์๋ ์๋ฆฌ๋ฅผ ์๋ ๊ฒ ๋ชป์ง ์๊ฒ ์ค์ํ๋ค
- ๋ฆฌํฉํฐ๋ง์ โ์ธ์ โ ํด์ผ ํ๋์ง์ ๋ํด์๋ ๋ช ํํ๊ฒ ์ ๋ฆฝ๋ ๊ท์น์ด ์๋ค
- ์ด๋ฒ ์ฅ์์ ๋ฆฌํฉํฐ๋งํ โ์์ โ์ ์ค๋ช ํ๋๋ฐ โ๋์โ๋ผ๋ ํํ์ ์ฌ์ฉํ๋ค
- ํ์ง๋ง ๋ฆฌํฉํฐ๋ง์ ์ธ์ ๋ฉ์ถฐ์ผ ํ๋์ง๋ฅผ ํ๋จํ๋ ์ ํํ ๊ธฐ์ค์ ์ ์ํ์ง๋ ์์ ๊ฒ์ด๋ค. ์๋ จ๋ ์ฌ๋์ ์ง๊ด๋งํผ ์ ํํ ๊ธฐ์ค์ ์๊ธฐ ๋๋ฌธ์ด๋ค
-
์ฝ๋๋ฅผ ๋ช ๋ฃํ๊ฒ ํํํ๋ ๋ฐ ๊ฐ์ฅ ์ค์ํ ์์ ํ๋๋ ๋ฐ๋ก โ์ด๋ฆโ์ด๋ค
-
๊ทธ๋์ ํจ์, ๋ชจ๋, ๋ณ์, ํด๋์ค ๋ฑ์ ๊ทธ ์ด๋ฆ๋ง ๋ณด๊ณ ๋ ๊ฐ๊ฐ์ด ๋ฌด์จ ์ผ์ ํ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง ๋ช ํํ ์ ์ ์๋๋ก ์์ฒญ๋๊ฒ ์ ๊ฒฝ ์จ์ ์ด๋ฆ ์ง์ด์ผ ํ๋ค
-
์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ ๋จ์ํ ์ด๋ฆ์ ๋ค๋ฅด๊ฒ ํํํ๋ ์ฐ์ต์ด ์๋๋ค. ๋ง๋ ํ ์ด๋ฆ์ด ๋ ์ค๋ฅด์ง ์๋๋ค๋ฉด ์ค๊ณ์ ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๊ฐ ์จ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค
-
๊ทธ๋์ ํผ๋์ค๋ฌ์ด ์ด๋ฆ์ ์ ์ ๋ฆฌํ๋ค ๋ณด๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง ๋๊ฐ ๋ง๋ค
-
ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ
-
๋ณ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
-
ํ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
-
๋๊ฐ์ ์ฝ๋ ๊ตฌ์กฐ๊ฐ ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๋ณต๋๋ค๋ฉด ํ๋๋ก ํตํฉํ์ฌ ๋ ๋์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ค
-
ํจ์ ์ถ์ถํ๊ธฐ
-
๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ
-
๋ฉ์๋ ์ฌ๋ฆฌ๊ธฐ
-
์ค๋ ๊ธฐ๊ฐ ์ ํ์ฉ๋๋ ํ๋ก๊ทธ๋จ๋ค์ ํ๋๊ฐ์ด ์งง์ ํจ์๋ก ๊ตฌ์ฑ๋๋ค. ์ผํ ํ์ผ๋ฉด ์ฐ์ฐํ๋ ๋ถ๋ถ์ด ํ๋๋ ์์ด ๋ณด์ธ๋ค. ์ฝ๋๊ฐ ๋์์ด ์์ํ๋ ๋ฐฉ์์ผ๋ก ์์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค
-
๊ฐ์ ํธ์ถ์ ํจ๊ณผ, ์ฆ ์ฝ๋๋ฅผ ์ดํดํ๊ณ , ๊ณต์ ํ๊ณ , ์ ํํ๊ธฐ ์ฌ์์ง๋ค๋ ์ฅ์ ์ ํจ์๋ฅผ ์งง๊ฒ ๊ตฌ์ฑํ ๋ ๋์ค๋ ๊ฒ์ด๋ค
-
์งง์ ํจ์๋ก ๊ตฌ์ฑ๋ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ฐ์ฅ ํ์คํ ๋ฐฉ๋ฒ์ ์ข์ ์ด๋ฆ์ด๋ค. ํจ์ ์ด๋ฆ์ ์ ์ง์ด๋๋ฉด ๋ณธ๋ฌธ ์ฝ๋๋ฅผ ๋ณผ ์ด์ ๊ฐ ์ฌ๋ผ์ง๋ค
-
์ ๊ทน์ ์ผ๋ก ํจ์๋ฅผ ์ชผ๊ฐ์ผ ํ๋ค. ํจ์ ์ด๋ฆ์ ๋์ฅ ๋ฐฉ์์ด ์๋ **โ์๋โ**๊ฐ ๋๋ฌ๋๊ฒ ์ง๋๋ค
-
์๋ ์ฝ๋๋ณด๋ค ๊ธธ์ด์ง๋๋ผ๋ ํจ์๋ก ๋ฝ๋๋ค. โ๋ฌด์์ ํ๋์งโ๋ฅผ ์ฝ๋๊ฐ ์ ์ค๋ช ํด์ฃผ์ง ๋ชปํ ์๋ก ํจ์๋ก ๋ง๋๋ ๊ฒ ์ ๋ฆฌํ๋ค
-
ํจ์ ์ถ์ถํ๊ธฐ
-
์์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ
-
๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
-
๊ฐ์ฒด ํต์งธ๋ก ๋๊ธฐ๊ธฐ
-
ํจ์๋ฅผ ๋ช ๋ น์ผ๋ก ๋ฐ๊พธ๊ธฐ
-
์กฐ๊ฑด๋ฌธ ๋ถํดํ๊ธฐ
-
ํจ์ ์ถ์ถํ๊ธฐ
-
์กฐ๊ฑด๋ถ ๋ก์ง์ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ
-
๋ฐ๋ณต๋ฌธ ์ชผ๊ฐ๊ธฐ
-
๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ด ๊ธธ์ด์ง๋ฉด ๊ทธ ์์ฒด๋ก ์ดํดํ๊ธฐ ์ด๋ ค์ธ ๋๊ฐ ๋ง๋ค
-
๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ
-
๊ฐ์ฒด ํต์งธ๋ก ๋๊ธฐ๊ธฐ
-
๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
-
ํ๋๊ทธ ์ธ์ ์ ๊ฑฐํ๊ธฐ
-
์ฌ๋ฌ ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๊ธฐ
-
์ ์ญ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ํด์ผ ํ๋ค๋ ๋ง์ ์ฐ๋ฆฌ๊ฐ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์์ํ ์ด์ฐฝ๊ธฐ๋ถํฐ ๊ท๊ฐ ๋ฐ๊ฐ๊ฒ ๋ค์๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฒช์ ์ ์๋ ์ ์ทจ ์ค ๊ฐ์ฅ ์ง๋ ํ ์ถ์ ์ํ๋ค
-
๋ณ์ ์บก์ํํ๊ธฐ
-
๋ณ๊ฒฝํ๋ ค๋ ๊ฐ์ ํด๋นํ๋ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ ๋ฐํํ๊ธฐ
-
๋ณ์ ์บก์ํํ๊ธฐ
-
๋ณ์ ์ชผ๊ฐ๊ธฐ
-
๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ
-
ํจ์ ์ถ์ถํ๊ธฐ
-
์ง์ ํจ์์ ๋ณ๊ฒฝ ํจ์ ๋ถ๋ฆฌํ๊ธฐ
-
์ธํฐ ์ ๊ฑฐํ๊ธฐ
-
ํ์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ
-
์ฌ๋ฌ ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๊ธฐ
-
์ฌ๋ฌ ํจ์๋ฅผ ๋ณํ ํจ์๋ก ๋ฌถ๊ธฐ
-
์ฐธ์กฐ๋ฅผ ๊ฐ์ผ๋ก ๋ฐ๊พธ๊ธฐ
-
์ฝ๋๋ฅผ ์์ ํ ๋๋ ์์คํ ์์ ๊ณ ์ณ์ผ ํ ๋ฑ ํ ๊ตฐ๋ฐ๋ฅผ ์ฐพ์์ ๊ทธ ๋ถ๋ถ๋ง ์์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋ค
-
์ด๋ ๊ฒ ํ ์ ์๋ค๋ฉด ๋ค์ํจ ๋ณ๊ฒฝ๊ณผ ์ฐํ์ด ์์ ์คํ๋๊ฐ ํ๊ธด๋ค
-
๋ค์ํจ ๋ณ๊ฒฝ์ ๋จ์ผ ์ฑ ์ ์์น(Single Responsibility Principle) ์ด ์ ๋๋ก ์ง์ผ์ง์ง ์์ ๋ ๋ํ๋๋ค. ํ๋์ ๋ชจ๋์ด ์๋ก ๋ค๋ฅธ ์ด์ ๋ค๋ก ์ธํด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋๋ ์ผ์ด ๋ง์ ๋ ๋ฐ์ํ๋ค
-
์ง์ํด์ผ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ํจ์ ์ธ ๊ฐ๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค๋ฉด ใ ๋ค์ํจ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ค๋ ๋ป์ด๋ค
-
๋จ๊ณ ์ชผ๊ฐ๊ธฐ
-
ํจ์ ์ฎ๊ธฐ๊ธฐ
-
ํจ์ ์ถ์ถํ๊ธฐ
-
ํด๋์ค ์ถ์ถํ๊ธฐ
-
์ด ๋์๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์์ํ๊ฒ ์์ ํด์ผ ํ๋ ํด๋์ค๊ฐ ๋ง์ ๋ ํ๊ธด๋ค
-
๋ณ๊ฒฝํ ๋ถ๋ถ์ด ์ฝ๋ ์ ๋ฐ์ ํผ์ ธ์๋ค๋ฉด ์ฐพ๊ธฐ๋ ์ด๋ ต๊ณ ๊ผญ ์์ ํด์ผ ํ ๊ณณ์ ์ง๋์น๊ธฐ ์ฝ๋ค
-
ํจ์ ์ฎ๊ธฐ๊ธฐ
-
ํ๋ ์ฎ๊ธฐ๊ธฐ
-
์ฌ๋ฌ ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๊ธฐ
-
์ฌ๋ฌ ํจ์๋ฅผ ๋ณํ ํจ์๋ก ๋ฌถ๊ธฐ
-
๋จ๊ณ ์ชผ๊ฐ๊ธฐ
-
ํจ์ ์ธ๋ผ์ธํ๊ธฐ
-
ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
-
ํ๋ก๊ทธ๋จ์ ๋ชจ๋ํํ ๋๋ ์ฝ๋๋ฅผ ์ฌ๋ฌ ์์ญ**(์ค์ฝํ)์ผ๋ก ๋๋ ๋ค ์์ญ(์ค์ฝํ)** ์์์ ์ด๋ค์ง๋ ์ํธ์์ฉ์ ์ต๋ํ ๋๋ฆฌ๊ณ ์์ญ **(์ค์ฝํ)**์ฌ์ด์์ ์ด๋ค์ง๋ ์ํธ์์ฉ์ ์ต์๋ก ์ค์ด๋ ๋ฐ ์ฃผ๋ ฅํ๋ค
-
๊ธฐ๋ฅ ํธ์ ๋ ํํ ์ด๋ค ํจ์๊ฐ ์๊ธฐ๊ฐ ์ํ ๋ชจ๋์ ํจ์๋ ๋ฐ์ดํฐ๋ณด๋ค ๋ค๋ฅธ ๋ชจ๋์ ํจ์๋ ๋ฐ์ดํฐ์ ์ํธ์์ฉ ํ ์ผ์ด ๋๋ง์ ๋ ํ๊ธฐ๋ ๋์๋ค
-
์คํ ๊ณผ์ ์์ ์ธ๋ถ ๊ฐ์ฒด์ ๊ฒํฐ ๋ฉ์๋ ๋์ฌ์ฏ ๊ฐ๋ฅผ ํธ์ถํ๋ ํจ์๊ฐ ๊ธฐ๋ฅ ํธ์ ํจ์์ ํด๋นํ๋ค
-
ํจ์ ์ฎ๊ธฐ๊ธฐ
-
ํจ์ ์ถ์ถํ๊ธฐ
-
๋ฐ์ดํฐ ํญ๋ชฉ๋ค์ ์ด๋ฆฐ์์ด ๊ฐ์ ๋ฉด์ด ์๋ค. ์ด์ธ๋ ค ๋ ธ๋ ๊ฑธ ์ข์ํ๋ค
-
๋ฐ์ดํฐ ํญ๋ชฉ ์๋ ๊ฐ๊ฐ ์ฌ๋ฌ ๊ณณ์์ ํญ์ ํจ๊ป ๋ญ์ณ๋ค๋๋ ๋ชจ์ต์ ๋ชฉ๊ฒฉํ ์ ์๋ค
-
๊ฐ์ฒด๋ฅผ ํต์งธ๋ก ๋๊ฒจ ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ฅผ ์ค์ผ ์ ์๋ค
-
ํด๋์ค ์ถ์ถํ๊ธฐ
-
๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
-
๊ฐ์ฒด ํต์งธ๋ก ๋๊ธฐ๊ธฐ
-
ํ๋ก๊ทธ๋๋จธ ์ค์์๋ ์์ ์๊ฒ ์ฃผ์ด์ง ๋ฌธ์ ์ ๋ฑ ๋ง๋ ๊ธฐ์ด ํ์ (ํํ, ์ขํ, ๊ตฌ๊ฐ ๋ฑ)์ ์ง์ ์ ์ํ๊ธฐ ๊บผ๋ฆฌ๋ ์ฌ๋์ด ๋ง๋ค. ๊ทธ๋์ ์ซ์ํ์ผ๋ก ๊ณ์ฐํ๊ฑฐ๋, ๋จ์๋ฅผ ๋ฌด์ํ๊ณ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์์ด ๋ดค๋ค
-
์ ํ ๋ฒํธ๋ฅผ ๋จ์ํ ๋ฌธ์ ์งํฉ์ผ๋ก๋ง ํํํ๊ธฐ์๋ ์์ฌ์์ด ๋ง๋ค. ์ต์ํ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ๋๋ ์ผ๊ด๋ ํ์์ผ๋ก ์ถ๋ ฅํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ผ๋ ๊ฐ์ถฐ์ผ ํ๋ค
-
๊ธฐ๋ณธํ์ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๊ธฐ
-
ํ์ ์ฝ๋๋ฅผ ์๋ธํด๋์ค๋ก ๋ฐ๊พธ๊ธฐ
-
์กฐ๊ฑด๋ถ ๋ก์ง์ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ
-
ํด๋์ค ์ถ์ถํ๊ธฐ
-
๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
-
์ด ์ฑ ์ผ ์ดํ์๋ โswitch๋ฌธโ์ด๋ ๋์๋ฅผ ์๊ฐํ๊ธฐ๋ ํ๋๋ฐ, ์ฌ๋๋ค์ด ๋คํ์ฑ์ ์ด์ฉํ๋๋ก ์ ํ์ํค๋ ๋ฐ ๋์์ด ๋์๊ธฐ ๋๋ฌธ์ด๋ค
-
๋จ์ํ switch๋ฌธ์ ์ผ๋ค๊ณ ํด์ ์๋์ผ๋ก ๊ฒํ ๋์์ ๋์ง ์๋ ์ธ์์ด ๋์๋ค
-
๊ทธ๋ฌ๋ ์ด์ ๋ ๋๊ฐ์ ์กฐ๊ฑด๋ถ ๋ก์ง(switch/case๋ฌธ์ด๋ ๊ธธ๊ฒ ๋์ด๋ if/else๋ฌธ)์ด ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๋ณตํด ๋ฑ์ฅํ๋ ์ฝ๋์ ์ง์คํด๋ณด์
-
์กฐ๊ฑด๋ถ ๋ก์ง์ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ๋ฐ๋ณต๋ฌธ์ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ฐ๊พธ๊ธฐ
-
์ฐ๋ฆฌ๋ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ก์ ๋ ํ๋ก๊ทธ๋จ ์์(ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ํจ์, ํด๋์ค, ์ธํฐํ์ด์ค ๋ฑ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ก๋ ๋ฐ ํ์ฉ๋๋ ์์)๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ์ข์ํ๋ค. ๊ทธ๋์ผ ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ณํํ๊ฑฐ๋ ์ฌํ์ฉํ ๊ธฐํ๊ฐ ์๊ธฐ๊ณ , ํน์ ๋จ์ํ ๋ ์๋ฏธ ์๋ ์ด๋ฆ์ ๊ฐ์ก๊ธฐ ๋๋ฌธ์ด๋ค
-
ํ์ง๋ง ์ด๋ฐ ๊ตฌ์กฐ๋ ๋์ค์ ๋ณธ๋ฌธ์ ๋ ์ฑ์ฐ๊ฑฐ๋ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์๊ฐ์ด์์ง๋ง, ์ด๋ ํ ์ฌ์ ์ผ๋ก ์ธํด ๊ทธ๋ ๊ฒ ํ์ง ๋ชปํ ๊ฒฐ๊ณผ์ผ ์ ์๋ค. ํน์ ์๋๋ ํ์ฑํ๋ ํด๋์ค๊ฐ ๋ฆฌํฉํฐ๋ง์ ๊ฑฐ์น๋ฉด์ ์ญํ ์ด ์ค์ด๋ค์์ ์ ์๋ค
-
ํจ์ ์ธ๋ผ์ธํ๊ธฐ
-
ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
-
๊ณ์ธต ํฉ์น๊ธฐ
-
์ถ์ธก์ฑ ์ผ๋ฐํ๋ โ๋์ค์ ํ์ํ ๊ฑฐ์ผโ๋ผ๋ ์๊ฐ์ผ๋ก ๋น์ฅ์ ํ์ ์๋ ๋ชจ๋ ์ข ๋ฅ์ ํํน ํฌ์ธํธ์ ํน์ด ์ผ์ด์ค ์ฒ๋ฆฌ๋ฅผ ๋ก์ง์ผ๋ก ์์ฑํด๋ ์ฝ๋์์ ํ๊ธฐ๋ ๋์์ด๋ค
-
๋ฏธ๋ ๋ฅผ ๋๋นํด ์์ฑํ ๋ถ๋ถ์ ์ค์ ๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋คํ์ด์ง๋ง, ๊ทธ๋ ์ง ์๋๋ค๋ฉด ์ธ๋ฐ์๋ ๋ญ๋น์ผ ๋ฟ์ด๋ค
-
๊ณ์ธต ํฉ์น๊ธฐ
-
ํจ์ ์ธ๋ผ์ธํ๊ธฐ
-
ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
-
ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ
- ๊ฐ์ฒด์ ๋ํ์ ์ธ ๊ธฐ๋ฅ ํ๋๋ก, ์ธ๋ถ๋ก๋ถํฐ ์ธ๋ถ์ฌํญ์ ์จ๊ฒจ์ฃผ๋ ์บก์ํ๊ฐ ์๋ค
- ์บก์ํํ๋ ๊ณผ์ ์์๋ ์์์ด ์์ฃผ ํ์ฉ๋๋ค
- ํ์ง๋ง ์ง๋์น๋ฉด ๋ฌธ์ ๊ฐ ๋๋ค. ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋ ์ค ์ ๋ฐ์ด ๋ค๋ฅธ ํด๋์ค์ ๊ตฌํ์ ์์ํ๊ณ ์๋ค๋ฉด ์ด๋ค๊ฐ? ์ด๋ด ๋๋ ์ค๊ฐ์ ์ ๊ฑฐํ๊ธฐ๋ฅผ ํ์ฉํ์ฌ ์ค์ ๋ก ์ผ์ ํ๋ ๊ฐ์ฒด์ ์ง์ ์ํตํ๊ฒ ํ์
- ์ฃผ์์ ๋ฌ๋ฉด ์ ๋๋ค๊ณ ๋งํ๋ ค๋ ๊ฑด ์๋๋ ๊ฑฑ์ ํ์ง ๋ง์
- ์ฃผ์์ ์ ์ทจ๊ฐ ์๋ ํฅ๊ธฐ๋ฅผ ์ ํ๋ค. ๋ฌธ์ ๋ ์ฃผ์์ ํ์ทจ์ ์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฐ ์๋ค
- ์ฃผ์์ด ์ฅํฉํ๊ฒ ๋ฌ๋ฆฐ ์์ธ์ด ์ฝ๋๋ฅผ ์๋ชป ์์ฑํ๊ธฐ ๋๋ฌธ์ธ ๊ฒฝ์ฐ๊ฐ ์์ธ๋ก ๋ง๋ค
- ์ฃผ์์ด ๋ง์ผ๋ฉด ์ด ์ฅ์์ ์๊ฐํ ์จ๊ฐ ์ ์ทจ๋ฅผ ํ๊ธฐ๋ ์ฝ๋๊ฐ ๋์ค๊ธฐ ์ฝ๋ค
- ํน์ ์ฝ๋ ๋ธ๋ก์ด ํ๋ ์ผ์ ์ฃผ์์ ๋จ๊ธฐ๊ณ ์ถ๋ค๋ฉด ํจ์ ์ถ์ถํ๊ธฐ๋ฅผ ์ ์ฉํด ๋ณธ๋ค
- ์ด๋ฏธ ์ถ์ถ๋์ด ์๋ ํจ์์์๋ ์ฌ์ ํ ์ค๋ช ์ด ํ์ํ๋ค๋ฉด ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ก ํจ์ ์ด๋ฆ์ ๋ฐ๊ฟ๋ณธ๋ค
- ์ฃผ์์ ๋จ๊ฒจ์ผ ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค๋ฉด, ๊ฐ์ฅ ๋จผ์ ์ฃผ์์ด ํ์์๋ ์ฝ๋๋ก ๋ฆฌํฉํฐ๋งํด๋ณธ๋ค
๋ฆฌํฉํฐ๋ง์ ์ ๋๋ก ํ๋ ค๋ฉด ๋ถ๊ฐํผํ๊ฒ ์ ์ง๋ฅด๋ ์ค์๋ฅผ ์ก์์ฃผ๋ ๊ฒฌ๊ณ ํ ํ ์คํธ ์ค์ํธ(test suite)๊ฐ ๋ท๋ฐ์นจ๋ผ์ผ ํ๋ค. ์๋ ๋ฆฌํฉํฐ๋ง ๋๊ตฌ๋ฅผ ํ์ฉํ๋๋ผ๋ ์ด ์ฑ ์์ ์๊ฐํ๋ ๋ฆฌํฉํฐ๋ง ์ค ๋ค์๋ ํ ์คํธ ์ค์ํธ๋ก ์ฌ์ฐจ ๊ฒ์ฆํ ๊ฒ์ด๋ค
- ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ด๋ป๊ฒ ์ผํ๋์ง ์ดํด๋ณด๋ฉด ์ค์ ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ์๊ฐ์ ๋น์ค์ ๊ทธ๋ฆฌ ํฌ์ง ์์์ ์ ์ ์๋ค. ํ์ฌ ์ํฉ์ ํ์ ํ๊ธฐ๋ ํ๊ณ , ์ค๊ณ๋ฅผ ๊ณ ๋ฏผํ๊ธฐ๋ ํ๋ค. ๋ฌผ๋ก ๋๋ถ๋ถ์ ์๊ฐ์ ๋๋ฒ๊น ์ ์ด๋ค
- ๋ฒ๊ทธ ์์ ์์ฒด๋ ๋์ฒด๋ก ๊ธ๋ฐฉ ๋๋๋ค. ์ง์ง ๋์งํ ๊ฑด ๋ฒ๊ทธ๋ฅผ ์ฐพ๋ ์ฌ์ ์ด๋ค. ๋ํ ๋ฒ๊ทธ๋ฅผ ์ก๋ ๊ณผ์ ์์ ๋ค๋ฅธ ๋ฒ๊ทธ๋ฅผ ์ฌ๊ธฐ๋ ํ๋๋ฐ, ๊ทธ ์ฌ์ค์ ํ์ฐธ์ด ์ง๋์์ผ ์์์ฑ๊ธฐ๋ ํ๋ค
- ๋ชจ๋ ํ ์คํธ๋ฅผ ์์ ํ ์๋ํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๊น์ง ์ค์ค๋ก ๊ฒ์ฌํ๊ฒ ๋ง๋ค์
- ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ๊ฐ์ฅ ์ข์ ์์ ์ ํ๋ก๊ทธ๋๋ฐ์ ์์ํ๊ธฐ ์ ์ด๋ค. ๋๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํ ๋ ํ ์คํธ๋ถํฐ ์์ฑํ๋ค. ์ผํ ์์๊ฐ ๋ค๋ฐ๋ ๋ฏ ๋ค๋ฆฌ์ง๋ง, ์ ํ ๊ทธ๋ ์ง ์๋ค. ํ ์คํธ๋ฅผ ์์ฑํ๋ค ๋ณด๋ฉด ์ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ๋ฌด์์ด ํ์ํ์ง ๊ณ ๋ฏผํ๊ฒ ๋๋ค. ๊ตฌํ๋ณด๋ค ์ธํฐํ์ด์ค์ ์ง์คํ๊ฒ ๋๋ค๋ ์ฅ์ ๋ ์๋ค. ๊ฒ๋ค๊ฐ ์ฝ๋ฉ์ด ์๋ฃ๋๋ ์์ ์ ์ ํํ๊ฒ ํ๋จํ ์ ์๋ค. ํ ์คํธ๋ฅผ ๋ชจ๋ ํต๊ณผํ ์์ ์ด ๋ฐ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์์ ์ด๋ค
- ์ด์ฒ๋ผ ํ ์คํธ๋ถํฐ ์์ฑํ๋ ์ต๊ด์ ๋ฐํ์ผ๋ก ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD, Test-Driven Development)์ด๋ ๊ธฐ๋ฒ์ด ์ฐฝ์๋๋ค. TDD์์๋ (์ฒ์์๋ ํต๊ณผํ์ง ๋ชปํ ) ํ ์คํธ๋ฅผ ์์ฑํ๊ณ , ์ด ํ ์คํธ๋ฅผ ํต๊ณผํ๊ฒ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ๊ฒฐ๊ณผ ์ฝ๋๋ฅผ ์ต๋ํ ๊น๋ํ๊ฒ ๋ฆฌํฉํฐ๋งํ๋ ๊ณผ์ ์ ์งง์ ์ฃผ๊ธฐ๋ก ๋ฐ๋ณตํ๋ค
- ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ์ฉ์ผ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค. ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ์ํด์๋ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ จํด์ผ ํ๋ค. ์ฌ๊ธฐ์๋ ํ์ฌ ๋๋ฆฌ ์ฐ์ด๊ณ ๋๋ฆ ์ข๋ค๊ณ ์๋ ค์ง ๋ชจ์นด (Mocha)๋ฅผ ์ฌ์ฉํ๋ค
- https://stackoverflow.com/questions/60227314/how-to-test-es6-modules-these-with-import-with-mocha/69386358#69386358
yarn add @babel/cli @babel/core @babel/preset-env @babel/register --dev
- @babel/cli :ย ๋งํฌ
- ๋ช ๋ น์ค์์ ํ์ผ์ ์ปดํ์ผํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ CLI
- @babel/core :ย ๋งํฌ
- babel์์ ์ฌ์ฉํ๋ core lib์ ๋๋ค
- @babel/preset-env :ย ๋งํฌ
- ํ๊ฒฝ์ ํ์ํ ๊ตฌ๋ฌธ ๋ณํ์ ์ฐ๋ฆฌ๊ฐ ๊ด๋ฆฌํ ํ์ ์์ด ์ต์ JS๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
- .babelrc๋ฅผ ํ๋ก์ ํธ root ์์น์ ์์ฑ ํ ์๋ ๋ด์ฉ์ ์ถ๊ฐํด์ฃผ์ธ์
{ "presets" : ["@babel/preset-env"] }
- package.json์ ์คํฌ๋ฆฝํธ์์ mocha์ --require ์ต์ ์ ํตํด ํด๋น ๋ชจ๋์ ์ฌ์ฉํ๋ค๊ณ ์ ์ด์ค๋๋ค
{ "name": "chapter4", "version": "1.0.0", "description": "", "main": "asia.js", "scripts": { "test": "mocha --require @babel/register", "test_recursive": "mocha --recursive --require @babel/register './test/**/*.js'" }, "author": "junhee lee", "license": "ISC", "devDependencies": { "@babel/cli": "^7.18.6", "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.6", "@babel/register": "^7.18.6", "chai": "^4.3.6", "mocha": "^10.0.0" } }
- @babel/cli :ย ๋งํฌ
์ ์ฒด ํ ์คํธ ์ฝ๋
ํด๋ ๊ตฌ์กฐ์ ๋ฐ๋ผ ์๋๊ฒฝ๋ก๋ก ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์, ์ ๊ฐ ๊ตฌ์ฑํ ํด๋ ๊ตฌ์กฐ๋ฅผ ์ฒจ๋ถํด๋๊ฒ ์ต๋๋ค
- ๋์ ํด๋ ๊ตฌ์กฐ
const { expect } = require("chai");
const { Province, sampleProvinceData } = require("../sample");
describe("province", function () {
let asia;
this.beforeEach(function () {
asia = new Province(sampleProvinceData());
});
it("shortfall", function () {
// expect(asia.shortfall, 5);
expect(asia.shortfall).equal(5);
});
it("profit", function () {
expect(asia.profit).equal(230);
});
it("change production", function () {
asia.producers[0].production = 20;
expect(asia.shortfall).equal(-6);
expect(asia.profit).equal(292);
});
it("zero demand", function () {
// ์์๊ฐ ์๋ค
asia.demand = 0;
expect(asia.shortfall).equal(-25);
expect(asia.profit).equal(0);
});
it("negative demand", () => {
// ์์๊ฐ ๋ง์ด๋์ค
asia.demand = -1;
expect(asia.shortfall).equal(-26);
expect(asia.profit).equal(-10);
});
it("empty string demand", () => {
// ์์ ์
๋ ฅ๋์ด ๋น์ด์์ ๋ - UI ๋ก๋ถํฐ ๋ฌธ์์ด์ ์ทจํ๊ณ ์์ ๋, ํ๋๊ฐ ๋น์ด ์์ ์ ์์
asia.demand = "";
expect(asia.shortfall).NaN;
expect(asia.profit).NaN;
});
});
describe("no producers", function () {
// ์์ฐ์๊ฐ ์๋ค.
let noProducers;
this.beforeEach(function () {
const data = {
name: "No producers",
producers: [],
demand: 30,
price: 20,
};
noProducers = new Province(data);
});
it("shortfall", function () {
expect(noProducers.shortfall).equal(30);
});
it("profit", function () {
expect(noProducers.profit).equal(0);
});
});
describe("string for producers", () => {
it("", () => {
const data = {
name: "String producers",
producers: "",
demand: 30,
price: 20,
};
const prov = new Province(data);
expect(prov.shortfall).equal(0);
});
});
ํ ์คํธํ ์ํ ์ฝ๋
function sampleProvinceData() {
return {
name: "Asia",
producers: [
{ name: "Byzantium", cost: 10, production: 9 },
{ name: "Attalia", cost: 12, production: 10 },
{ name: "Sinope", cost: 10, production: 6 },
],
demand: 30,
price: 20,
};
}
/**
* ์ง์ญ ์ ์ฒด๋ฅผ ๋ํ๋ด๋ ํด๋์ค
* ๋ค์ํ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์๋ค์ด ๋ด๊ฒจ ์๋ค
* */
class Province {
constructor(doc) {
this._name = doc.name;
this._producers = [];
this._totalProduction = 0;
this._demand = doc.demand;
this._price = doc.price;
doc.producers.forEach((d) => this.addProducer(new Producer(this, d)));
}
addProducer(arg) {
this._producers.push(arg);
this._totalProduction += arg.production;
}
get name() {
return this._name;
}
get producers() {
return this._producers.slice();
}
get totalProduction() {
return this._totalProduction;
}
set totalProduction(arg) {
this._totalProduction = arg;
}
get demand() {
return this._demand;
}
set demand(arg) {
this._demand = parseInt(arg);
} // ์ซ์๋ก ํ์ฑํด ์ ์ฅ
get price() {
return this._price;
}
set price(arg) {
this._price = parseInt(arg);
} // ์ซ์๋ก ํ์ฑํด ์ ์ฅ
// ์์ ๋ถ์กฑ๋ถ์ ๊ณ์ฐํ๋ ์ฝ๋
get shortfall() {
return this._demand - this.totalProduction;
}
// ์์ต์ ๊ณ์ฐํ๋ ์ฝ๋
get profit() {
return this.demandValue - this.demandCost;
}
get demandValue() {
return this.satisfiedDemand * this.price;
}
get satisfiedDemand() {
return Math.min(this._demand, this.totalProduction);
}
get demandCost() {
let remainingDemand = this.demand;
let result = 0;
this.producers
.sort((a, b) => a.cost - b.cost)
.forEach((p) => {
const contribution = Math.min(remainingDemand, p.production);
remainingDemand -= contribution;
result += contribution * p.cost;
});
return result;
}
}
/**
* ์์ฐ์๋ฅผ ๋ํ๋ด๋ ํด๋์ค
* ๋จ์ํ ๋ฐ์ดํฐ ์ ์ฅ์๋ก ์ฐ์ธ๋ค
* */
class Producer {
constructor(aProvince, data) {
this._province = aProvince;
this._cost = data.cost;
this._name = data.name;
this._production = data.production || 0;
}
get name() {
return this._name;
}
get cost() {
return this._cost;
}
set cost(arg) {
this._cost = parseInt(arg);
}
get production() {
return this._production;
}
set production(amountStr) {
const amount = parseInt(amountStr);
const newProduction = Number.isNaN(amount) ? 0 : amount;
this._province.totalProduction += newProduction - this._production;
this._production = newProduction;
}
}
module.exports = {
sampleProvinceData,
Province,
};
describe("province", function () {
it("shortfall", function () {
const asia = new Province(sampleProvinceData()); // 1. ํฝ์ค์ฒ ์ค์
assert.equal(asia.shortfall, 5); // 2. ๊ฒ์ฆ
});
});
-
์ฒซ ๋ฒ์งธ ๋จ๊ณ์์๋ ํ ์คํธ์ ํ์ํ ๋ฐ์ดํฐ์ ๊ฐ์ฒด๋ฅผ ๋ปํ๋ ํฝ์ค์ฒ(๊ณ ์ ์ฅ์น)๋ฅผ ์ค์ ํ๋ค
-
๋ ๋ฒ์งธ ๋จ๊ณ์์๋ ์ด ํฝ์ค์ณ์ ์์ฑ๋ค์ ๊ฒ์ฆํ๋๋ฐ, ์ฌ๊ธฐ์๋ ์ฃผ์ด์ง ์ด๊น๊ฐ์ ๊ธฐ์ดํ์ฌ ์์ฐ ๋ถ์กฑ๋ถ์ ์ ํํ ๊ณ์ฐํ๋์ง ํ์ธํ๋ค
-
์คํจํด์ผ ํ ์ํฉ์์๋ ๋ฐ๋์ ์คํจํ๊ฒ ๋ง๋ค์
get shortfall(){
return this._demand - this.totalProduction * 2; // ์ค๋ฅ ์ฃผ์
}
- ์์ ํ ํ ์คํธ๋ฅผ ๋ค์ ์คํํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
- ๋ชจ์นด ํ๋ ์์ํฌ๋ ์์ ์ด์์ (assertion: ๋จ์ธ, ํ์ธ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ํ๋ ํฝ์ค์ฒ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํด ์ฌ์ฉํ ์ ์๋ค. ํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ์ฉ ์ด์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ฒญ๋๊ฒ ๋ง๋ค. ์ด ์ฑ ์์๋ ์ฐจ์ด(Chai) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค
- ์์ ์ ์ ์ ์ฒด ํ ์คํธ ์ฝ๋์์ ์ฐจ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด esm ์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ดํด๋ณด๊ณ ์ ์ฉํด๋ณด์!
- ํ ์คํธ์ ๊ดํด ๊ณต๋ถํ๋ค๋ฉด ์ง๊ธ ํ ์คํธ๊ฐ ์ด๋ป๊ฒ ๋์๊ฐ๊ณ ์๋์ง ์์ธก์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค
- ์ฐ๋ฆฌ๊ฐ โ์ค์ โํ ํ์ค ํฝ์ค์ฒ๋ฅผ ์ทจํด์, ํ ์คํธ๋ฅผ โ์ํโํ๊ณ , ์ด ํฝ์ค์ฒ๊ฐ ์ผ์ ๊ธฐ๋ํ ๋๋ก ์ฒ๋ฆฌํ๋์ง๋ฅผ โ๊ฒ์ฆโํ๋ค
- ์ด๋ฅผ ์ค์ -์คํ-๊ฒ์ฆ / ์กฐ๊ฑด-๋ฐ์-๊ฒฐ๊ณผ / ์ค๋น-์ํ-๋จ์ธ ๋ฑ์ผ๋ก ๋ถ๋ฅธ๋ค
- ์ง๊ธ๊น์ง ์์ฑํ ํ ์คํธ๋ ๋ชจ๋ ์ผ์ด ์์กฐ๋กญ๊ณ ์ฌ์ฉ์๋ ์๋๋๋ก ์ฌ์ฉํ๋ ์ผ๋ช , โ๊ฝ๊ธธโ ์ํฉ์ ์ง์คํ์๋ค
- ํ์ง๋ง ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ๊ณ ์ง์ ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ํ์ธํ๋ ํ ์คํธ๋ ํจ๊ป ์์ฑํ๋ฉด ์ข๋ค (์ปฌ๋ ์ ์ด ๋น์ด์๊ฑฐ๋, ์์์ผ ๋ ๋ฑ์ ํ๋จํ๋ ๊ฒ์ ๋งํ๋ค)
describe("no producers", function () {
// ์์ฐ์๊ฐ ์๋ค.
let noProducers;
this.beforeEach(function () {
const data = {
name: "No producers",
producers: [],
demand: 30,
price: 20,
};
noProducers = new Province(data);
});
it("shortfall", function () {
expect(noProducers.shortfall).equal(30);
});
it("profit", function () {
expect(noProducers.profit).equal(0);
});
});
describe("string for producers", () => {
it("", () => {
const data = {
name: "String producers",
producers: "",
demand: 30,
price: 20,
};
const prov = new Province(data);
expect(prov.shortfall).equal(0);
});
});
- ์ฌ๊ธฐ์ ํ ๊ฐ์ง ์๋ฌธ์ด ๋ค ์ ์๋ค. ์์๊ฐ ์์์ผ ๋ ์์ต์ด ์์๊ฐ ๋์จ๋ค๋ ๊ฒ์ด ์ด ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๊ณ ๊ฐ ๊ด์ ์์ ๋ง์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค
- ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ๊ณ ์กฐ๊ฑด์ ์๊ฐํด๋ณด๊ณ ๊ทธ ๋ถ๋ถ์ ์ง์ค์ ์ผ๋ก ํ ์คํธํ์
- ๋ชจ๋ ๋ฒ๊ทธ๋ฅผ ์ก์๋ผ ์ ์๋ค๊ณ ์๊ฐํ์ฌ ํ ์คํธ๋ฅผ ์์ฑํ์ง ์๋๋ค๋ฉด ๋๋ค์์ ๋ฒ๊ทธ๋ฅผ ์ก์ ์ ์๋ ๊ธฐํ๋ฅผ ๋ ๋ฆฌ๋ ์ ์ด๋ค
- ๊ทธ๋ ๋ค๋ฉด ํ ์คํธ๋ฅผ ์ด๋ ์์ค๊น์ง ํด์ผ ํ ๊น? ํ ์คํธ๋ ์ํํ ๋ถ๋ถ์ ์ง์คํ๋ ๊ฒ์ด ์ข๋ค
- ์ฝ๋์์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ๋ณต์กํ ๋ถ๋ถ์ ์ฐพ์๋ณด์. ํจ์์์ ์ค๋ฅ๊ฐ ์๊ธธ๋งํ ๋ถ๋ถ์ ์ฐพ์๋ณด์. ํ ์คํธ๊ฐ ๋ชจ๋ ๋ฒ๊ทธ๋ฅผ ๊ฑธ๋ฌ์ฃผ์ง๋ ๋ชปํ ์ง๋ผ๋, ์์ฌํ๊ณ ๋ฆฌํฉํฐ๋งํ ์ ์๋ ๋ณดํธ๋ง์ ๋์ด์ค๋ค. ๋ฆฌํฉํฐ๋ง์ ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ ๋์ฑ ๊น๊ฒ ์ดํดํ๊ฒ ๋์ด ๋ ๋ง์ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ฒ ๋๋ค
- ํ์๋ ํญ์ ํ ์คํธ ์ค์ํธ๋ถํฐ ๊ฐ์ถ ๋ค์ ๋ฆฌํฉํฐ๋งํ์ง๋ง, ๋ฆฌํฉํฐ๋งํ๋ ๋์์๋ ๊ณ์ํด์ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ค
- ํ ์คํธ๋ ๋งค์ฐ ์ค์ํ๋ค. ๋ฆฌํฉํฐ๋ง์ ๋ฐ๋์ ํ์ํ ํ ๋์ผ ๋ฟ ๋ง ์๋๋ผ, ๊ทธ ์์ฒด๋ก๋ ํ๋ก๊ทธ๋๋ฐ์ ์ค์ํ ์ญํ ์ ํ๋ค
- ์ด ์ฅ์์ ๋ณด์ฌ์ค ํ ์คํธ๋ ๋จ์ ํ ์คํธ(unit test)์ ํด๋นํ๋ค. ๋จ์ ํ ์คํธ๋ ์ฝ๋์ ์์ ์์ญ๋ง์ ๋์์ผ๋ก ๋น ๋ฅด๊ฒ ์คํ๋๋๋ก ์ค๊ณ๋ ํ ์คํธ๋ค. ๋จ์ ํ ์คํธ๋ ์๊ฐ ํ ์คํธ ์ฝ๋์ ํต์ฌ์ด์, ์๊ฐ ํ ์คํธ ์์คํ ์ ๋๋ถ๋ถ ๋จ์ ํ ์คํธ๊ฐ ์ฐจ์งํ๋ค
-
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฆฌํฉํฐ๋ง์ ํจ์ ์ถ์ถํ๊ธฐ์ ๋ณ์ ์ถ์ถํ๊ธฐ๋ค
-
๋ฆฌํฉํฐ๋ง์ ๋ณธ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ธ ๋งํผ, ์ด ๋ ๋ฆฌํฉํฐ๋ง์ ๋ฐ๋๋ก ์งํํ๋ ํจ์ ์ธ๋ผ์ธํ๊ธฐ์ ๋ณ์ ์ธ๋ผ์ธํ๊ธฐ๋ ์์ฃผ ์ฌ์ฉํ๋ค
-
ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ ํจ์์ ์ด๋ฆ์ ๋ณ๊ฒฝํ ๋ ๋ง์ด ์ฐ์ธ๋ค
-
๋ฐ๊ฟ ๋์์ด ๋ณ์๋ผ๋ฉด ๋ณ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ๋ณ์ ์บก์ํํ๊ธฐ์ ๊ด๋ จ์ด ๊น๋ค
-
์์ฃผ ํจ๊ป ๋ญ์ณ ๋ค๋๋ ์ธ์๋ค์ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ๋ฅผ ์ ์ฉํด ๊ฐ์ฒด ํ๋๋ก ๋ฌถ์ผ๋ฉด ํธ๋ฆฌํ ๋ ๊ฐ ๋ง๋ค
-
ํจ์ ๊ตฌ์ฑ๊ณผ ์ด๋ฆ ์ง๊ธฐ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ์์ค ๋ฆฌํฉํฐ๋ง์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ผ๋จ ํจ์๋ฅผ ๋ง๋ค๊ณ ๋๋ฉด ๋ค์ ๊ณ ์์ค ๋ชจ๋๋ก ๋ฌถ์ด์ผ ํ๋ค
-
์ด๋ ๊ฒ ํจ์๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ๋๋ ์ฌ๋ฌ ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๊ธฐ๋ฅผ ์ด์ฉํ๋ค
-
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๋ฌ ํจ์๋ฅผ ๋ณํ ํจ์๋ก ๋ฌถ๊ธฐ๋ ์๋๋ฐ, ์ฝ๊ธฐ์ ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ํนํ ์ข๋ค
-
ํ ๊ฑธ์ ๋ ๋์๊ฐ, ํ๋ฐ ๋ฌถ์ ๋ชจ๋๋ค์ ์์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ช ํํ ๋จ๊ณ๋ก ๊ตฌ๋ถ ์ง๋ ๋จ๊ณ ์ชผ๊ฐ๊ธฐ๋ฅผ ์ ์ฉํ ๋๋ ๋ง๋ค
๋ฐฐ๊ฒฝ
์ฝ๋๋ฅผ ์ธ์ ๋ ๋ฆฝ๋ ํจ์๋ก ๋ฌถ์ด์ผ ํ ์ง์ ๊ดํ ์๊ฒฌ์ ์์์ด ๋ง๋ค. ๋จผ์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ ์ ์๋ค. ๊ฐ๋ น ํจ์ ํ๋๊ฐ ํ ํ๋ฉด์ ๋์ด๊ฐ๋ฉด ์ ๋๋ค๋ ๊ท์น์ ๋ ์ฌ๋ฆด ์ ์๋ค. ์ฌ์ฌ์ฉ์ฑ์ ๊ธฐ์ค์ผ๋ก ํ ์๋ ์๋ค. ๋ ๋ฒ ์ด์ ์ฌ์ฉ๋ ์ฝ๋๋ ํจ์๋ก ๋ง๋ค๊ณ , ํ ๋ฒ๋ง ์ฐ์ด๋ ์ฝ๋๋ ์ธ๋ผ์ธ ์ํ๋ก ๋๋๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ด๋์๋ '๋ชฉ์ ์ ๊ตฌํ์ ๋ถ๋ฆฌ'ํ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ธ ๊ธฐ์ค์ผ๋ก ๋ณด์ธ๋ค. ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฌด์จ ์ผ์ ํ๋์ง ํ์ ํ๋๋ฐ ํ์ฐธ์ด ๊ฑธ๋ฆฐ๋ค๋ฉด ๊ทธ ๋ถ๋ถ์ ํจ์๋ก ์ถ์ถํ ๋ค '๋ฌด์จ ์ผ'์ ๊ฑธ๋ง๋ ์ด๋ฆ์ ์ง๋๋ค. ์ด๋ ๊ฒ ํด๋๋ฉด ๋์ค์ ์ฝ๋๋ฅผ ๋ค์ ์ฝ์ ๋ ํจ์์ ๋ชฉ์ ์ด ๋์ ํ ๋ค์ด์ค๊ณ , ๋ณธ๋ฌธ ์ฝ๋์ ๋ํด์๋ ๋ ์ด์ ์ ๊ฒฝ ์ธ ์ผ์ด ๊ฑฐ์ ์๋ค.
ํจ์๋ฅผ ์งง๊ฒ ๋ง๋ค๋ฉด ํจ์ ํธ์ถ์ด ๋ง์์ ธ์ ์ฑ๋ฅ์ด ๋๋ ค์ง๊น ๊ฑฑ์ ํ๋ ์ฌ๋๋ค๋ ์๋ค. ํ์๊ฐ ์ ๋ ์์ ์๋ ๊ฐํน ๋ฌธ์ ๊ฐ ๋๊ธด ํ์ง๋ง ์์ฆ์ ๊ทธ๋ด ์ผ์ด ๊ฑฐ์ ์๋ค. ํจ์๊ฐ ์งง์ผ๋ฉด ์บ์ฑํ๊ธฐ๊ฐ ๋ ์ฝ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ์ต์ ํํ๋ ๋ฐ ์ ๋ฆฌํ ๋๊ฐ ๋ง๋ค. ์ฑ๋ฅ ์ต์ ํ์ ๋ํด์๋ ํญ์ ์ผ๋ฐ ์ง์นจ์ ๋ฐ๋ฅด๋๋ก ํ์
"์ต์ ํ ํ ๋๋ ๋ค์ ๋ ๊ท์น์ ๋ฐ๋ฅด๊ธฐ ๋ฐ๋๋ค."
"์ฒซ ๋ฒ์งธ, ํ์ง ๋ง๋ผ."
"๋ ๋ฒ์งธ(์ ๋ฌธ๊ฐ ํ์ ), ์์ง ํ์ง ๋ง๋ผ"
์ ์ฐจ
- ํจ์๋ฅผ ์๋ก ๋ง๋ค๊ณ ๋ชฉ์ ์ ์ ๋๋ฌ๋ด๋ ์ด๋ฆ์ ๋ถ์ธ๋ค('์ด๋ป๊ฒ'๊ฐ ์๋ '๋ฌด์์'ํ๋์ง๊ฐ ๋๋ฌ๋์ผ ํ๋ค)
- ์ถ์ถํ ์ฝ๋๋ฅผ ์๋ณธ ํจ์์์ ๋ณต์ฌํ์ฌ ์ ํจ์์ ๋ถ์ฌ๋ฃ๋๋ค
- ์ถ์ถํ ์ฝ๋ ์ค ์๋ณธ ํจ์์ ์ง์ญ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์ถ์ถํ ํจ์์ ์ ํจ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋ณ์๋ ์๋์ง ๊ฒ์ฌํ๋ค. ์๋ค๋ฉด ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ค
- ๋ณ์๋ฅผ ๋ค ์ฒ๋ฆฌํ๋ค๋ฉด ์ปดํ์ผํ๋ค
- ์๋ณธ ํจ์์์ ์ถ์ถํ ์ฝ๋ ๋ถ๋ถ์ ์๋ก ๋ง๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฌธ์ฅ์ผ๋ก ๋ฐ๊พผ๋ค
- ํ ์คํธํ๋ค
- ๋ค๋ฅธ ์ฝ๋์ ๋ฐฉ๊ธ ์ถ์ถํ ๊ฒ๊ณผ ๋๊ฐ๊ฑฐ๋ ๋น์ทํ ์ฝ๋๊ฐ ์๋์ง ์ดํ๋ค. ์๋ค๋ฉด ๋ฐฉ๊ธ ์ถ์ถํ ์ ํจ์๋ฅผ ํธ์ถํ๋๋ก ๋ฐ๊ฟ์ง ๊ฒํ ํ๋ค
๋ฆฌํฉํฐ๋ง ์ ์ฝ๋
export function printOwing(invoice) {
let outstanding = 0;
console.log("***********************");
console.log("**** Customer Owes ****");
console.log("***********************");
// calculate outstanding
for (const o of invoice.orders) {
outstanding += o.amount;
}
// record due date
const today = new Date();
invoice.dueDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 30
);
//print details
console.log(`name: ${invoice.customer}`);
console.log(`amount: ${outstanding}`);
console.log(`due: ${invoice.dueDate.toLocaleDateString()}`);
}
const invoice = {
orders: [{ amount: 2 }, { amount: 5 }],
customer: "์คํฌ",
};
printOwing(invoice);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function printOwing(invoice) {
printBanner();
let outstanding = calculateOutstanding(invoice);
recordDueDate(invoice);
printDetails(invoice, outstanding);
}
function printBanner() {
console.log("***********************");
console.log("**** ๊ณ ๊ฐ ์ฑ๋ฌด ****");
console.log("***********************");
}
function calculateOutstanding(invoice) {
return invoice.orders.reduce((sum, order) => (sum += order.amount), 0);
}
function recordDueDate(invoice) {
const today = new Date();
invoice.dueDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 30
);
}
function printDetails(invoice, outstanding) {
console.log(`name: ${invoice.customer}`);
console.log(`amount: ${outstanding}`);
console.log(`due: ${invoice.dueDate.toLocaleDateString()}`);
}
const invoice = {
orders: [{ amount: 2 }, { amount: 5 }],
customer: "์คํฌ",
};
printOwing(invoice);
/**
* ํจ์ ๋ด๋ถ ๋ก์ง์ด ๋๋ฌด ๊ธธ์ด์ ์ดํดํ๊ธฐ ์ํ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค
*
* ์ง์ญ ๋ณ์๋ ์ฌ์ฉํ๋ ๊ณณ๊ณผ ์ต๋ํ ๊ฐ๊น์ด ๋๊ธฐ
*/
๋ฐฐ๊ฒฝ
์ด ์ฑ ์ ๋ชฉ์ ์ด ๋๋ฌ๋๋ ์ด๋ฆ์ ์งค๋งํ ํจ์๋ฅผ ์ด์ฉํ๊ธฐ๋ฅผ ๊ถํ๋ค. ๊ทธ๋์ผ ์ฝ๋๊ฐ ๋ช ๋ฃํด์ง๊ณ ์ดํดํ๊ธฐ ์ฌ์์ง๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ๋๋ก๋ ํจ์ ๋ณธ๋ฌธ์ด ์ด๋ฆ๋งํผ ๋ช ํํ ๊ฒฝ์ฐ๋ ์๋ค. ๋๋ ํจ์ ๋ณธ๋ฌธ ์ฝ๋๋ฅผ ์ด๋ฆ๋งํผ ๊น๋ํ๊ฒ ๋ฆฌํฉํฐ๋งํ ๋๋ ์๋ค. ์ด๋ด ๋๋ ๊ทธ ํจ์๋ฅผ ์ ๊ฑฐํ๋ค. ๊ฐ์ ํธ์ถ์ ์ ์ฉํ ์๋ ์์ง๋ง ์ธ๋ฐ์๋ ๊ฐ์ ํธ์ถ์ ๊ฑฐ์ฌ๋ฆด ๋ฟ์ด๋ค.
์ ์ฐจ
- ๋คํ ๋ฉ์๋์ธ์ง ํ์ธํ๋ค
- ์ธ๋ผ์ธํ ํจ์๋ฅผ ํธ์ถํ๋ ๊ณณ์ ๋ชจ๋ ์ฐพ๋๋ค
- ๊ฐ ํธ์ถ๋ฌธ์ ํจ์ ๋ณธ๋ฌธ์ผ๋ก ๊ต์ฒดํ๋ค
- ํ๋์ฉ ๊ต์ฒดํ ๋๋ง๋ค ํ ์คํธํ๋ค
- ํจ์ ์ ์(์๋ ํจ์)๋ฅผ ์ญ์ ํ๋ค
๋ฆฌํฉํฐ๋ง ์ ์ฝ๋
function rating(driver) {
return moreThanFiveLateDeliveries(driver) ? 2 : 1;
}
function moreThanFiveLateDeliveries(dvr) {
return dvr.numberOfLateDeliveries > 5;
}
function reportLines(customer) {
const lines = [];
gatherCustomerData(lines, customer);
return lines;
}
function gatherCustomerData(out, customer) {
out.push(["name", customer.name]);
out.push(["location", customer.location]);
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function rating(driver) {
return driver.numberOfLateDeliveries > 5 ? 2 : 1;
}
function reportLines(customer) {
const lines = [];
lines.push(["name", customer.name]);
lines.push(["location", customer.location]);
return lines;
}
/**
* ๋ฆฌํฉํฐ๋ง์ extract (์ถ์ถํ๊ธฐ) ์ inline(์ธ๋ผ์ธํ๊ธฐ) ์ ๋ฐ๋ณต์ด๋ค
*/
๋ฐฐ๊ฒฝ ํํ์์ด ๋๋ฌด ๋ณต์กํด์ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ๋๊ฐ ์๋ค. ์ด๋ด ๋ ์ง์ญ ๋ณ์๋ฅผ ํ์ฉํ๋ฉด ํํ์์ ์ชผ๊ฐ ๊ด๋ฆฌํ๊ธฐ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ณต์กํ ๋ก์ง์ ๊ตฌ์ฑํ๋ ๋จ๊ณ๋ง๋ค ์ด๋ฆ์ ๋ถ์ผ ์ ์์ด์ ์ฝ๋์ ๋ชฉ์ ์ ํจ์ฌ ๋ช ํํ๊ฒ ๋๋ฌ๋ผ ์ ์๋ค.
๋ณ์ ์ถ์ถ์ ๊ณ ๋ คํ๋ค๊ณ ํจ์ ํํ์์ ์ด๋ฆ์ ๋ถ์ด๊ณ ์ถ๋ค๋ ๋ป์ด๋ค. ์ด๋ฆ์ ๋ถ์ด๊ธฐ๋ก ํ๋ค๋ฉด ๊ทธ ์ด๋ฆ์ด ๋ค์ด๊ฐ ๋ฌธ๋งฅ๋ ์ดํด์ผ ํ๋ค. ํ์ฌ ํจ์ ์์์๋ง ์๋ฏธ๊ฐ ์๋ค๋ฉด ๋ณ์๋ก ์ถ์ถํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ฌ๋ ํจ์๋ฅผ ๋ฒ์ด๋ ๋์ ๋ฌธ๋งฅ์์๊น์ง ์๋ฏธ๊ฐ ๋๋ค๋ฉด ๊ทธ ๋์ ๋ฒ์์์ ํต์ฉ๋๋ ์ด๋ฆ์ ์๊ฐํด์ผ ํ๋ค. ๋ค์ ๋งํด ๋ณ์๊ฐ ์๋ ํจ์๋ก ์ถ์ถํด์ผ ํ๋ค.
์ ์ฐจ
- ์ถ์ถํ๋ ค๋ ํํ์์ ๋ถ์์ฉ์ ์๋์ง ํ์ธํ๋ค
- ๋ถ๋ณ ๋ณ์๋ฅผ ํ๋ ์ ์ธํ๊ณ ์ด๋ฆ์ ๋ถ์ผ ํํ์์ ๋ณต์ ๋ณธ์ ๋์ ํ๋ค
- ์๋ณธ ํํ์์ ์๋ก ๋ง๋ ๋ณ์๋ก ๊ต์ฒดํ๋ค
- ํ ์คํธํ๋ค
- ํํ์์ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ๊ฐ์ ์๋ก ๋ง๋ ๋ณ์๋ก ๊ต์ฒดํ๋ค. ํ๋ ๊ต์ฒดํ ๋๋ง๋ค ํ ์คํธ ํ๋ค
๋ฆฌํฉํฐ๋ง ์ ์ฝ๋
export function price(order) {
// ๊ฐ๊ฒฉ(price) = ๊ธฐ๋ณธ๊ฐ๊ฒฉ - ์๋ํ ์ธ + ๋ฐฐ์ก๋น
return (
order.quantity * order.itemPrice -
Math.max(0, order.quantity - 500) * order.itemPrice * 0.05 +
Math.min(order.quantity * order.itemPrice * 0.1, 100)
);
}
class Order {
constructor(aRecord) {
this._data = aRecord;
}
get quantity() {
return this._data.quantity;
}
get itemPrice() {
return this._data.itemPrice;
}
get price() {
return (
this.quantity * this.itemPrice -
Math.max(0, this.quantity - 500) * this.itemPrice * 0.05 +
Math.min(this.quantity * this.itemPrice * 0.1, 100)
);
}
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function price(order) {
const basePrice = order.quantity * order.itemPrice;
const discount = Math.max(0, order.quantity - 500) * order.itemPrice * 0.05;
const shopping = Math.min(order.quantity * order.itemPrice * 0.1, 100);
return basePrice - discount + shopping;
}
class Order {
constructor(aRecord) {
this._data = aRecord;
}
get quantity() {
return this._data.quantity;
}
get itemPrice() {
return this._data.itemPrice;
}
get price() {
return this.basePrice - this.discount + this.shipping;
}
get basePrice() {
return this.quantity * this.itemPrice;
}
get discount() {
return Math.max(0, this.quantity - 500) * this.itemPrice * 0.05;
}
get shipping() {
return Math.min(this.quantity * this.itemPrice * 0.1, 100);
}
}
๋ฐฐ๊ฒฝ
๋ณ์๋ ํจ์ ์์์ ํํ์์ ๊ฐ๋ฆฌํค๋ ์ด๋ฆ์ผ๋ก ์ฐ์ด๋ฉฐ, ๋์ฒด๋ก ๊ธ์ ์ ์ธ ํจ๊ณผ๋ฅผ ์ค๋ค. ํ์ง๋ง ๊ทธ ์ด๋ฆ์ด ์๋ ํํ์๊ณผ ๋ค๋ฅผ ๋ฐ ์์ ๋๋ ์๋ค. ๋ ๋ณ์๊ฐ ์ฃผ๋ณ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๊ธฐ๋ ํ๋ค. ์ด๋ด ๋๋ ๊ทธ ๋ณ์๋ฅผ ์ธ๋ผ์ธํ๋ ๊ฒ์ด ์ข๋ค.
์ ์ฐจ
- ๋์ ๋ฌธ์ ์ฐ๋ณ(ํํ์)์์ ๋ถ์์ฉ์ด ์๊ธฐ์ง ์๋์ง ํ์ธํ๋ค
- ๋ณ์๊ฐ ๋ถ๋ณ์ผ๋ก ์ ์ธ๋์ง ์์๋ค๋ฉด ๋ถ๋ณ์ผ๋ก ๋ง๋ ํ ํ ์คํธํ๋ค
- ์ด ๋ณ์๋ฅผ ๊ฐ์ฅ ์ฒ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ฐพ์์ ๋์ ๋ฌธ ์ฐ๋ณ์ ์ฝ๋๋ก ๋ฐ๊พผ๋ค
- ํ ์คํธํ๋ค
- ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ์ ๋ชจ๋ ๊ต์ฒดํ ๋๊น์ง ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค
- ๋ณ์ ์ ์ธ๋ฌธ๊ณผ ๋์ ๋ฌธ์ ์ง์ด๋ค
- ํ ์คํธํ๋ค
๋ฆฌํฉํฐ๋ง ์ ์ฝ๋
function isDeliveryFree(anOrder) {
let basePrice = anOrder.basePrice;
return basePrice > 1000;
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function isDeliveryFree(anOrder) {
return anOrder.basePrice > 1000;
}
๋ฐฐ๊ฒฝ
ํจ์๋ ํ๋ก๊ทธ๋จ์ ์์ ๋ถ๋ถ์ผ๋ก ๋๋๋ ์ฃผ๋ ์๋จ์ด๋ค. ํจ์ ์ ์ธ์ ๊ฐ ๋ถ๋ถ์ด ์๋ก ๋ง๋ฌผ๋ฆฌ๋ ๋ฐฉ์์ ํํํ๋ฉฐ, ์ค์ง์ ์ผ๋ก ์ํํธ์จ์ด ์์คํ ์ ๊ตฌ์ฑ ์์๋ฅผ ์กฐ๋ฆฝํ๋ ์ฐ๊ฒฐ๋ถ ์ญํ ์ ํ๋ค. ์ฐ๊ฒฐ๋ถ๋ฅผ ์ ์ ์ํ๋ฉด ์์คํ ์ ์๋ก์ด ๋ถ๋ถ์ ์ถ๊ฐํ๊ธฐ๊ฐ ์ฌ์์ง๋ ๋ฐ๋ฉด, ์๋ชป ์ ์ํ๋ฉด ์ง์์ ์ธ ๋ฐฉํด ์์ธ์ผ๋ก ์์ฉํ์ฌ ์ํํธ์จ์ด ๋์์ ํ์ ํ๊ธฐ ์ด๋ ค์์ง๊ณ ์๊ตฌ์ฌํญ์ด ๋ฐ๋ ๋ ์ ์ ํ ์์ ํ๊ธฐ ์ด๋ ต๊ฒ ํ๋ค.
์ด๋ฌํ ์ฐ๊ฒฐ๋ถ์์ ๊ฐ์ฅ ์ค์ํ ์์๋ ํจ์์ ์ด๋ฆ์ด๋ค. ์ด๋ฆ์ด ์ข์ผ๋ฉด ํจ์์ ๊ตฌํ ์ฝ๋๋ฅผ ์ดํด๋ณผ ํ์ ์์ด ํธ์ถ๋ฌธ๋ง ๋ณด๊ณ ๋ ๋ฌด์จ ์ผ์ ํ๋์ง ํ์ ํ ์ ์๋ค. ํ์ง๋ง ์ข์ ์ด๋ฆ์ ๋ ์ฌ๋ฆฌ๊ธฐ๋ ์ฝ์ง ์๋ค. ๊ทธ๋์ ๋๋ ์ด๋ฆ์ด ์๋ชป๋ ํจ์๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๋ ๋์ ์ด๋ฆ์ด ๋ ์ค๋ฅด๋ ์ฆ์ ๋ฐ๊พธ๋ผ๋ ๋ช ๋ น์ผ๋ก ๋ฐ์๋ค์ธ๋ค. ๊ทธ๋์ผ ๋์ค์ ๊ทธ ์ฝ๋๋ฅผ ๋ค์ ๋ณผ ๋ ๋ฌด์จ ์ผ์ ํ๋์ง '๋' ๊ณ ๋ฏผํ์ง ์๊ฒ ๋๋ค.
ํจ์์ ๋งค๊ฐ๋ณ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ๋งค๊ฐ๋ณ์๋ ํจ์๊ฐ ์ธ๋ถ ์ธ๊ณ์ ์ด์ฐ๋ฌ์ง๋ ๋ฐฉ์์ ์ ์ํ๋ค. ๋งค๊ฐ๋ณ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ๋งฅ์ ์ค์ ํ๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ํํ๊ธฐ๋ ๋จ์ํ ๊ท์น ๋ช ๊ฐ๋ก ํํํ ์ ์๋ค. ์ด ๋ฌธ์ ๋ ์ ๋ต์ด ์์ผ๋ฉฐ ์๊ฐ์ด ํ๋ฅผ์๋ก ๋์ฑ ๋ ๊ทธ๋ ๋ค. ๋ฐ๋ผ์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๋ ๋์์ง ์ดํดํ๊ฒ ๋ ๋๋ง๋ค ๊ทธ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ๊ฐ์ ํ ์ ์๋๋ก ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ ๋ฆฌํฉํฐ๋ง๊ณผ ์น์ํด์ ธ์ผ๋ง ํ๋ค.
๊ฐ๋จํ ์ ์ฐจ
- ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐ๋ผ๋ ค๊ฑฐ๋ ๋จผ์ ํจ์ ๋ณธ๋ฌธ์์ ์ ๊ฑฐ ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๊ณณ์ ์๋์ง ํ์ธํ๋ค
- ๋ฉ์๋ ์ ์ธ์ ์ํ๋ ํํ๋ก ๋ฐ๊พผ๋ค
- ๊ธฐ์กด ๋ฉ์๋ ์ ์ธ์ ์ฐธ์กฐํ๋ ๋ถ๋ถ์ ๋ชจ๋ ์ฐพ์์ ๋ฐ๋ ํํ๋ก ์์ ํ๋ค
- ํ ์คํธํ๋ค
๋ณ๊ฒฝํ ๊ฒ ๋ ์ด์์ด๋ฉด ๋๋ ์ ์ฒ๋ฆฌํ๋ ํธ์ด ๋์ ๋๊ฐ ๋ง๋ค. ๋ฐ๋ผ์ ์ด๋ฆ ๋ณ๊ฒฝ๊ณผ ๋งค๊ฐ๋ณ์ ์ถ๊ฐ๋ฅผ ๋ชจ๋ ํ๊ณ ์ถ๋ค๋ฉด ๊ฐ๊ฐ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ์.
๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ
- ์ด์ด์ง๋ ์ถ์ถ ๋จ๊ณ๋ฅผ ์์ํ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด ํจ์์ ๋ณธ๋ฌธ์ ์ ์ ํ ๋ฆฌํฉํฐ๋งํ๋ค
- ํจ์ ๋ณธ๋ฌธ์ ์๋ก์ด ํจ์๋ก ์ถ์ถํ๋ค
- ์ถ์ถํ ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด '๊ฐ๋จํ ์ ์ฐจ'๋ฅผ ๋ฐ๋ผ ์ถ๊ฐํ๋ค
- ํ ์คํธํ๋ค
- ๊ธฐ์กด ํจ์๋ฅผ ์ธ๋ผ์ธํ๋ค
- ์ด๋ฆ์ ์์๋ก ๋ถ์ฌ๋๋ค๋ฉด ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ฅผ ํ ๋ฒ ๋ ์ ์ฉํด์ ์๋ ์ด๋ฆ์ผ๋ก ๋๋๋ฆฐ๋ค
- ํ ์คํธํ๋ค
๋ฆฌํฉํฐ๋ง ์ ์ฝ๋
export function circum(radius) {
return 2 * Math.PI * radius;
}
export default class Book {
#reservations;
constructor() {
this.#reservations = [];
}
addReservation(customer) {
this.#reservations.push(customer);
}
hasReservation(customer) {
return this.#reservations.some(
(reservedCustomer) => reservedCustomer.id === customer.id
);
}
}
export function inNewEngland(aCustomer) {
return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(aCustomer.address.state);
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function circumference(radius) {
return 2 * Math.PI * radius;
}
// F2 - ๊ธฐํธ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
// circumference - ์์ฃผ์จ
export default class Book {
#reservations;
constructor() {
this.#reservations = [];
}
addReservation(customer, isPriority = false) {
this.#reservations.push(customer);
}
hasReservation(customer) {
return this.#reservations.some(
(reservedCustomer) => reservedCustomer.id === customer.id
);
}
}
/**
* isPriority ๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐ์, ํจ์ ๋ด์์ ์ฐ์ ์์๊ฐ ๋์ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ผ๋ก ๋ค๋ฅธ ์์
์ ํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ํ๋ธ๋ค
* addReservation ๋ด์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์ด์ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ์๊ฒํ๊ธฐ ์ํด isPriority ์ ์ด๊ธฐ๊ฐ์ false ๋ก ์ค๋ค
*/
export function inNewEngland(state) {
return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(state);
}
๋ฐฐ๊ฒฝ
๋ช ํํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ์ด๋ฆ์ง๊ธฐ๋ค. ๋ณ์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ํ๋ ค๋ ์ผ์ ๊ดํด ๋ง์ ๊ฒ์ ์ค๋ช ํด์ค๋ค. ๋จ, ์ด๋ฆ์ ์ ์ง์์ ๋๋ง ๊ทธ๋ ๋ค. ํนํ ์ด๋ฆ์ ์ค์์ฑ์ ๊ทธ์ฌ์ฉ ๋ฒ์์ ์ํฅ์ ๋ง์ด ๋ฐ๋๋ค. ํ ์ค์ง๋ฆฌ ๋๋ค์์์ ์ฌ์ฉํ๋ ๋ณ์๋ ๋์ฒด๋ก ์ฝ๊ฒ ํ์ ํ ์ ์๋ค. ๋งฅ๋ฝ์ผ๋ก๋ถํฐ ๋ณ์์ ๋ชฉ์ ์ ๋ช ํํ ์ ์ ์์ด์ ํ ๊ธ์๋ก ๋ ์ด๋ฆ์ ์ง๊ธฐ๋ ํ๋ค.
ํจ์ ํธ์ถ ํ ๋ฒ์ผ๋ก ๋๋์ง ์๊ณ ๊ฐ์ด ์์๋๋ ํ๋๋ผ๋ฉด ์ด๋ฆ์ ๋ ์ ๊ฒฝ ์จ์ผ ํ๋ค.
์ ์ฐจ
- ํญ ๋๊ฒ ์ฐ์ด๋ ๋ณ์๋ผ๋ฉด ๋ณ์ ์บก์ํํ๊ธฐ๋ฅผ ๊ณ ๋ คํ๋ค
- ์ด๋ฆ์ ๋ฐ๊ฟ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๊ณณ์ ๋ชจ๋ ์ฐพ์์, ํ๋์ฉ ๋ณ๊ฒฝํ๋ค
- ๋ค๋ฅธ ์ฝ๋๋ฒ ์ด์ค์์ ์ฐธ์กฐํ๋ ๋ณ์๋ ์ธ๋ถ์ ๊ณต๊ฐ๋ ๋ณ์์ด๋ฏ๋ก ์ด ๋ฆฌํฉํฐ๋ง์ ์ ์ฉํ ์ ์๋ค
- ๋ณ์ ๊ฐ์ด ๋ณํ์ง ์๋๋ค๋ฉด ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ณต์ ๋ณธ์ ๋ง๋ค์ด์ ํ๋์ฉ ์ ์ง์ ์ผ๋ก ๋ณ๊ฒฝํ๋ค
- ํ ์คํธํ๋ค
๋ฆฌํฉํฐ๋ง ์ ์ฝ๋
let a = height * width;
const cpyNm = "์ ํ";
let tpHd = "์ ๋ชฉ์์";
let result = `<h1>${tpHd}</h1>`;
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
let area = width * height;
const companyName = "์ ํ";
let title = "์ ๋ชฉ์์";
let movieTitle = "์ํ ์ ๋ชฉ";
let pageTitle = "์ ๋ชฉ";
let result = `<h1>${title}</h1>`;
๋ฐฐ๊ฒฝ
๋ฐ์ดํฐ ํญ๋ชฉ ์ฌ๋ฌ ๊ฐ๊ฐ ์ด ํจ์์์ ์ ํจ์๋ก ํจ๊ป ๋ชฐ๋ ค๋ค๋๋ ๊ฒฝ์ฐ๋ฅผ ์์ฃผ ๋ณธ๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ๋ฌด๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ๋๋ก ๋ชจ์์ฃผ๊ณค ํ๋ค.
๋ฐ์ดํฐ ๋ญ์น๋ฅผ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ฌถ์ผ๋ฉด ๋ฐ์ดํฐ ์ฌ์ด์ ๊ด๊ณ๊ฐ ๋ช ํํด์ง๋ค๋ ์ด์ ์ ์ป๋๋ค. ๊ฒ๋ค๊ฐ ํจ์๊ฐ ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฒ ํ๋ฉด ๋งค๊ฐ๋ณ์ ์๊ฐ ์ค์ด๋ ๋ค. ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํจ์๊ฐ ์์๋ฅผ ์ฐธ์กฐํ ๋ ํญ์ ๋๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ผ๊ด์ฑ๋ ๋์ฌ์ค๋ค.
ํ์ง๋ง ์ด ๋ฆฌํฉํฐ๋ง์ ์ง์ ํ ํ์ ์ฝ๋๋ฅผ ๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ๊ฟ์ค๋ค๋ ๋ฐ ์๋ค. ์ด๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์๋ก ๋ฐ๊ฒฌํ๋ฉด ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ ํํ๋ก ํ๋ก๊ทธ๋จ ๋์์ ์ฌ๊ตฌ์ฑํ๋ค. ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ด๊ธธ ๋ฐ์ดํฐ์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ๋์์ ์ถ์ถํด์ ํจ์๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
์ ์ฐจ
- ์ ๋นํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์ง ๋ง๋ จ๋์ด ์์ง ์๋ค๋ฉด ์๋ก ๋ง๋ ๋ค
- ํ ์คํธํ๋ค
- ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ก ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ถ๊ฐํ๋ค
- ํ ์คํธํ๋ค
- ํจ์ ํธ์ถ ์ ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ธ์คํด์ค๋ฅผ ๋๊ธฐ๋๋ก ์์ ํ๋ค. ํ๋์ฉ ์์ ํ ๋๋ง๋ค ํ ์คํธํ๋ค
- ๊ธฐ์กด ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์์๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฐ๊พผ๋ค
- ๋ค ๋ฐ๊ฟจ๋ค๋ฉด ๊ธฐ์กด ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐํ๊ณ ํ ์คํธํ๋ค
๋ฆฌํฉํฐ๋ง ์ ์ฝ๋
function readingsOutsideRange(station, min, max) {
return station.readings.filter((r) => r.temp < min || r.temp > max);
}
const station = {
name: "ZB1",
readings: [
{ temp: 47, time: "2016-11-10 09:10" },
{ temp: 53, time: "2016-11-10 09:20" },
{ temp: 58, time: "2016-11-10 09:30" },
{ temp: 53, time: "2016-11-10 09:40" },
{ temp: 51, time: "2016-11-10 09:50" },
],
};
const operationPlan = {
temperatureFloor: 51,
temperatureCeiling: 53,
};
readingsOutsideRange(
station,
operationPlan.temperatureFloor,
operationPlan.temperatureCeiling
);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function readingsOutsideRange(station, range) {
return station.readings.filter(
(r) => r.temp < range.temperatureFloor || r.temp > range.temperatureCeiling
);
}
const station = {
name: "ZB1",
readings: [
{ temp: 47, time: "2016-11-10 09:10" },
{ temp: 53, time: "2016-11-10 09:20" },
{ temp: 58, time: "2016-11-10 09:30" },
{ temp: 53, time: "2016-11-10 09:40" },
{ temp: 51, time: "2016-11-10 09:50" },
],
};
const operationPlan = {
temperatureFloor: 51,
temperatureCeiling: 53,
};
readingsOutsideRange(station, operationPlan);
function readingsOutsideRange(station, range) {
return station.readings.filter((r) => !range.contains(r.temp));
}
class NumberRange {
// private ์ ๋ํ๋ด๋ ์ ๋์ฌ #
#min;
#max;
constructor(min, max) {
this.#min = min;
this.#max = max;
}
get min() {
return this.#min;
}
get max() {
return this.#max;
}
contains(number) {
return number >= this.#min && number <= this.#max;
}
}
const station = {
name: "ZB1",
readings: [
{ temp: 47, time: "2016-11-10 09:10" },
{ temp: 53, time: "2016-11-10 09:20" },
{ temp: 58, time: "2016-11-10 09:30" },
{ temp: 53, time: "2016-11-10 09:40" },
{ temp: 51, time: "2016-11-10 09:50" },
],
};
const operationPlan = new NumberRange(51, 53);
readingsOutsideRange(station, operationPlan);
๋ฐฐ๊ฒฝ
๋ฆฌํฉํฐ๋ง์ ๊ฒฐ๊ตญ ํ๋ก๊ทธ๋จ์ ์์๋ฅผ ์กฐ์ํ๋ ์ผ์ด๋ค. ํจ์๋ ๋ฐ์ดํฐ๋ณด๋ค ๋ค๋ฃจ๊ธฐ๊ฐ ์์ํ๋ค. ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฑด ๋์ฒด๋ก ํธ์ถํ๋ค๋ ๋ป์ด๊ณ , ํจ์์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ๋ค๋ฅธ ๋ชจ๋๋ก ์ฎ๊ธฐ๊ธฐ๋ ์ด๋ ต์ง ์๋ค. ์ฌ์ฐจํ๋ฉด ๊ธฐ์กด ํจ์๋ฅผ ๊ทธ๋๋ก ๋ ์ฑ ์ ๋ฌํจ์๋ก ํ์ฉํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋๋ก ๋ฐ์ดํฐ๋ ํจ์๋ณด๋ค ๋ค๋ฃจ๊ธฐ๊ฐ ๊น๋ค๋ก์ด๋ฐ, ๊ทธ ์ด์ ๋ ์ด๋ฐ ์(์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ๋ค๋ฅธ ๋ชจ๋๋ก ์ฎ๊ธฐ๊ธฐ)์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ์ดํฐ๋ ์ฐธ์กฐํ๋ ๋ชจ๋ ๋ถ๋ถ์ ํ ๋ฒ์ ๋ฐ๊ฟ์ผ ์ฝ๋๊ฐ ์ ๋๋ก ์๋ํ๋ค. ์งง์ ํจ์ ์์ ์์ ๋ณ์์ฒ๋ผ ์ ํจ๋ฒ์๊ฐ ์์ฃผ ์ข์ ๋ฐ์ดํฐ๋ ์ด๋ ค์ธ ๊ฒ ์์ง๋ง, ์ ํจ๋ฒ์๊ฐ ๋์ด์ง์๋ก ๋ค๋ฃจ๊ธฐ ์ด๋ ค์์ง๋ค.
๊ทธ๋์ ์ ๊ทผํ ์ ์๋ ๋ฒ์๊ฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธธ ๋๋ ๋จผ์ ๊ทธ ๋ฐ์ดํฐ๋ก์ ์ ๊ทผ์ ๋ ์ ํ๋ ํจ์๋ฅผ ๋ง๋๋ ์์ผ๋ก ์บก์ํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ผ ๋๊ฐ ๋ง๋ค. ๋ฐ์ดํฐ ์ฌ๊ตฌ์ฑ์ด๋ผ๋ ์ด๋ ค์ด ์์ ์ ํจ์ ์ฌ๊ตฌ์ฑ์ด๋ผ๋ ๋ ๋จ์ํ ์์ ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ ์บก์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๊ฐ์ํ ์ ์๋ ํ์คํ ํต๋ก๊ฐ ๋์ด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ์ ๊ฒ์ฆ์ด๋ ๋ณ๊ฒฝ ํ ์ถ๊ฐ ๋ก์ง์ ์ฝ๊ฒ ๋ผ์ ๋ฃ์ ์ ์๋ค.
๊ฐ์ฒด ์งํฅ์์ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ํญ์ private
์ผ๋ก ์ ์งํด์ผ ํ๋ค๊ณ ๊ฐ์กฐํ๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ฌ๊ธฐ์ ์๋ค. ๋ฐ์ดํฐ์ ์ ํจ๋ฒ์๊ฐ ๋์์๋ก ์บก์ํํ์ฌ ๊ฐ์ ๋ฒ์๋ฅผ ์ ํํ๋ ค ํ๋ค.
๋ถ๋ณ ๋ฐ์ดํด๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ณด๋ค ์บก์ํํ ์ด์ ๊ฐ ์ ๋ค. ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ์ผ์ด ์์ด์ ๊ฐฑ์ ์ ๊ฒ์ฆ ๊ฐ์ ์ถ๊ฐ ๋ก์ง์ด ์๋ฆฌํ ๊ณต๊ฐ์ ๋ง๋ จํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒ๋ค๊ฐ ๋ถ๋ณ ๋ฐ์ดํฐ๋ ์ฎ๊ธธ ํ์ ์์ด ๊ทธ๋ฅ ๋ณต์ ํ๋ฉด ๋๋ค.
์ ์ฐจ
- ๋ณ์๋ก์ ์ ๊ทผ๊ณผ ๊ฐฑ์ ์ ์ ๋ดํ๋ ์บก์ํ ํจ์๋ฅผ ๋ง๋ ๋ค
- ์ ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค
- ๋ณ์๋ฅผ ์ง์ ์ฐธ์กฐํ๋ ๋ถ๋ถ์ ๋ชจ๋ ์ ์ ํ ์บก์ํ ํจ์ ํธ์ถ๋ก ๋ฐ๊พผ๋ค. ํ๋์ฉ ๋ฐ๊ฟ ๋๋ง๋ค ํ ์คํธํ๋ค
- ๋ณ์์ ์ ๊ทผ ๋ฒ์๋ฅผ ์ ํํ๋ค (private)
- ํ ์คํธํ๋ค
- ๋ณ์ ๊ฐ์ด ๋ ์ฝ๋๋ผ๋ฉด ๋ ์ฝ๋ ์บก์ํํ๊ธฐ๋ฅผ ์ ์ฉํ ์ง ๊ณ ๋ คํด๋ณธ๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
let defaultOwner = { firstName: "๋งํด", lastName: "ํ์ธ๋ฌ" };
export function getDefaultOwner() {
return defaultOwner;
}
let defaultOwner = { firstName: "๋งํด", lastName: "ํ์ธ๋ฌ" };
function getDefaultOwner() {
return defaultOwner;
}
const owner = getDefaultOwner();
owner.firstName = "์คํฌ";
console.log(owner);
console.log(getDefaultOwner());
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
let defaultOwner = { firstName: "๋งํด", lastName: "ํ์ธ๋ฌ" };
function getDefaultOwner() {
// return Object.assign({}, defaultOwner);
return { ...defaultOwner };
}
const owner = getDefaultOwner();
owner.firstName = "์คํฌ";
console.log(owner);
console.log(getDefaultOwner());
class Person {
#lastName;
#firstName;
constructor(data) {
this.#lastName = data.lastName;
this.#firstName = data.firstName;
}
get lastName() {
return this.#lastName;
}
get firstName() {
return this.#firstName;
}
}
let defaultOwner = new Person({ firstName: "๋งํด", lastName: "ํ์ธ๋ฌ" });
function getDefaultOwner() {
return defaultOwner;
}
const owner = getDefaultOwner();
console.log(owner.firstName);
console.log(getDefaultOwner());
๋ฐฐ๊ฒฝ
ํด๋์ค๋ ๋๋ค์์ ์ต์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ ๋น๋ฉ ๋ธ๋ก์ด๋ค. ํด๋์ค๋ ๋ฐ์ดํฐ์ ํจ์๋ฅผ ํ๋์ ๊ณต์ ํ๊ฒฝ์ผ๋ก ๋ฌถ์ ํ, ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ์์์ ์ด์ฐ๋ฌ์ง ์ ์๋๋ก ๊ทธ์ค ์ผ๋ถ๋ฅผ ์ธ๋ถ์ ์ ๊ณตํ๋ค. ํด๋์ค๋ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ๊ธฐ๋ณธ์ธ ๋์์ ๋ค๋ฅธ ํจ๋ฌ๋ค์ ์ธ์ด์๋ ์ ์ฉํ๋ค.
ํด๋์ค๋ก ๋ฌถ์ผ๋ฉด ์ด ํจ์๋ค์ด ๊ณต์ ํ๋ ๊ณตํต ํ๊ฒฝ์ ๋ ๋ช ํํ๊ฒ ํํํ ์ ์๊ณ , ๊ฐ ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ฅผ ์ค์ฌ์ ๊ฐ ๊ฐ์ฒด ์์์์ ํจ์ ํธ์ถ์ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์๋ค. ์ด๋ฐ ๊ฐ์ฒด๋ฅผ ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ ๋ฌํ๊ธฐ ์ํ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ ์ ์๋ค.
ํด๋์ค๋ก ๋ฌถ์ ๋์ ๋๋๋ฌ์ง ์ฅ์ ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ฒด์ ํต์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ณ , ํ์ ๊ฐ์ฒด๋ค์ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ ์ฐจ
- ํจ์๋ค์ด ๊ณต์ ํ๋ ๊ณตํต ๋ฐ์ดํฐ ๋ ์ฝ๋๋ฅผ ์บก์ํํ๋ค
- ๊ณตํต ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ํจ์ ๊ฐ๊ฐ์ ์ ํด๋์ค๋ก ์ฎ๊ธด๋ค
- ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ๋ก์ง๋ค์ ํจ์๋ก ์ถ์ถํด์ ์ ํด๋์ค๋ก ์ฎ๊ธด๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
const reading = { customer: "ivan", quantity: 10, month: 5, year: 2017 };
export function acquireReading() {
return reading;
}
export function baseRate(month, year) {
if (year === 2017 && month === 5) return 0.1;
return 0.2;
}
import { acquireReading, baseRate } from "./6-9.js";
const aReading = acquireReading();
const baseCharge = baseRate(aReading.month, aReading.year) * aReading.quantity;
console.log(baseCharge);
import { acquireReading, baseRate } from "./6-9.js";
const aReading = acquireReading();
const base = baseRate(aReading.month, aReading.year) * aReading.quantity;
function taxThreshold(year) {
return 0.1;
}
export const taxableCharge = Math.max(0, base - taxThreshold(aReading.year));
import { acquireReading, baseRate } from "./6-9.js";
const aReading = acquireReading();
function calculateBaseCharge(aReading) {
return baseRate(aReading.month, aReading.year) * aReading.quantity;
}
const basicChargeAmount = calculateBaseCharge(aReading);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Reading {
#customer;
#quantity;
#month;
#year;
constructor(data) {
this.#customer = data.customer;
this.#quantity = data.quantity;
this.#month = data.month;
this.#year = data.year;
}
get customer() {
return this.#customer;
}
get quantity() {
return this.#quantity;
}
get month() {
return this.#month;
}
get year() {
return this.#year;
}
get baseRate() {
if (this.#year === 2017 && this.#month === 5) return 0.1;
return 0.2;
}
get baseCharge() {
return this.baseRate * this.quantity;
}
get taxThreshold() {
return 0.1;
}
get taxableCharge() {
return Math.max(0, this.baseCharge - 0.1 * this.taxThreshold);
}
}
const reading = new Reading({
customer: "ivan",
quantity: 10,
month: 5,
year: 2017,
});
function acquireReading() {
return reading;
}
const aReading = acquireReading();
const baseCharge = aReading.baseCharge;
const taxableCharge = aReading.taxableCharge;
const basicChargeAmount = aReading.baseCharge;
๋ฐฐ๊ฒฝ
์ํํธ์จ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ๋ฐ์์ ์ฌ๋ฌ ๊ฐ์ง ์ ๋ณด๋ฅผ ๋์ถํ๊ณค ํ๋ค. ์ด๋ ๊ฒ ๋์ถ๋ ์ ๋ณด๋ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋ ์ ์๋๋ฐ, ๊ทธ๋ฌ๋ค ๋ณด๋ฉด ์ด ์ ๋ณด๊ฐ ์ฌ์ฉ๋๋ ๊ณณ๋ง๋ค ๊ฐ์ ๋์ถ ๋ก์ง์ด ๋ฐ๋ณต๋๊ธฐ๋ ํ๋ค. ๋๋ ์ด๋ฐ ๋์ถ ์์ ๋ค์ ํ๋ฐ๋ก ๋ชจ์๋๊ธธ ์ข์ํ๋ค. ๋ชจ์๋๋ฉด ๊ฒ์๊ณผ ๊ฐฑ์ ์ ์ผ๊ด๋ ์ฅ์์์ ์ฒ๋ฆฌํ ์ ์๊ณ ๋ก์ง ์ค๋ณต๋ ๋ง์ ์ ์๋ค.
์ด๋ ๊ฒ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ณํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ณํ ํจ์๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ๋ฐ์์ ํ์ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋์ถํ ๋ค, ๊ฐ๊ฐ์ ์ถ๋ ฅ ๋ฐ์ดํฐ์ ํ๋์ ๋ฃ์ด ๋ฐํํ๋ค. ์ด๋ ๊ฒ ํด๋๋ฉด ๋์ถ ๊ณผ์ ์ ๊ฒํ ํ ์ผ์ด ์๊ฒผ์ ๋ ๋ณํ ํจ์๋ง ์ดํด๋ณด๋ฉด ๋๋ค.
์๋ณธ ๋ฐ์ดํฐ๊ฐ ์ฝ๋ ์์์ ๊ฐฑ์ ๋ ๋๋ ํด๋์ค๋ก ๋ฌถ๋ ํธ์ด ํจ์ฌ ๋ซ๋ค. ๋ณํ ํจ์๋ก ๋ฌถ์ผ๋ฉด ๊ฐ๊ณตํ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ๋ ์ฝ๋์ ์ ์ฅํ๋ฏ๋ก, ์๋ณธ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ฉด ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ๋ฌ ํจ์๋ฅผ ํ๋ฐ ๋ฌถ๋ ์ด์ ํ๋๋ ๋์ถ ๋ก์ง์ด ์ค๋ณต๋๋ ๊ฒ์ ํผํ๊ธฐ ์ํด์๋ค. ์ด ๋ก์ง์ ํจ์๋ก ์ถ๋ฃจํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์์ง๋ง, ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ํจ์๊ฐ ๊ทผ์ฒ์ ์์ง ์์ผ๋ฉด ํจ์๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ค์ธ ๋๊ฐ ๋ง๋ค. ๋ณํ ํจ์๋ก ๋ฌถ์ผ๋ฉด ์ด๋ฐ ํจ์๋ค์ ์ฝ๊ฒ ์ฐพ์ ์ธ ์ ์๋ค.
์ ์ฐจ
- ๋ณํํ ๋ ์ฝ๋๋ฅผ ์ ๋ ฅ๋ฐ์์ ๊ฐ์ ๊ทธ๋๋ก ๋ฐํํ๋ ๋ณํ ํจ์๋ฅผ ๋ง๋ ๋ค
- ๋ฌถ์ ํจ์ ์ค ํจ์ ํ๋๋ฅผ ๊ณจ๋ผ์ ๋ณธ๋ฌธ ์ฝ๋๋ฅผ ๋ณํ ํจ์๋ก ์ฎ๊ธฐ๊ณ , ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋์ฝ๋์ ์ ํ๋๋ก ๊ธฐ๋กํ๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ์ด ํ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํ๋ค
- ํ ์คํธํ๋ค
- ๋๋จธ์ง ๊ด๋ จ ํจ์๋ ์ ๊ณผ์ ์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
const reading = { customer: "ivan", quantity: 10, month: 5, year: 2017 };
export function acquireReading() {
return reading;
}
export function baseRate(month, year) {
if (year === 2017 && month === 5) return 0.1;
return 0.2;
}
/**
* ์์ฆ์ ํด๋์ค๋ก ๋ฌถ๋ ๋ฐฉ์์ ๋ ์ ํธํ๋ค
* ๋ณํ ํจ์๋ก ๋ง๋๋ ์์
์ ์ด์ ์ ๋ง์ด ์ฌ์ฉ๋ ๋ฐฉ์
*/
...
import { acquireReading, baseRate } from './6-10.js';
const aReading = acquireReading();
const baseCharge = baseRate(aReading.month, aReading.year) * aReading.quantity;
console.log(baseCharge);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
import _ from "lodash";
const reading = { customer: "ivan", quantity: 10, month: 5, year: 2017 };
export function acquireReading() {
return reading;
}
export function enrichReading(original) {
const result = _.cloneDeep(original);
result.baseCharge = calculateBaseCharge(result);
result.taxableCharge = Math.max(
0,
result.baseCharge - taxTreshold(result.year)
);
return result;
}
function calculateBaseCharge(reading) {
return baseRate(reading.month, reading.year) * reading.quantity;
}
export function baseRate(month, year) {
if (year === 2017 && month === 5) return 0.1;
return 0.2;
}
...
import { acquireReading, enrichReading } from "./6-10.js";
const rawReading = acquireReading();
const reading = enrichReading(rawReading);
console.log(reading.baseCharge);
console.log(reading.taxableCharge);
๋ฐฐ๊ฒฝ
ํ์๋ ์๋ก ๋ค๋ฅธ ๋ ๋์์ ํ๊บผ๋ฒ์ ๋ค๋ฃจ๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๊ฐ๊ฐ์ ๋ณ๊ฐ ๋ชจ๋๋ก ๋๋๋ ๋ฐฉ๋ฒ์ ๋ชจ์ํ๋ค. ์ฝ๋๋ฅผ ์์ ํด์ผ ํ ๋ ๋ ๋์์ ๋์์ ์๊ฐํ ํ์ ์์ด ํ๋์๋ง ์ง์คํ๊ธฐ ์ํด์๋ค. ๋ชจ๋์ด ์ ๋ถ๋ฆฌ๋์ด ์๋ค๋ฉด ๋ค๋ฅธ ๋ชจ๋์ ์์ธ ๋ด์ฉ์ ์ ํ ๊ธฐ์ตํ์ง ๋ชปํด๋ ์ํ๋ ๋๋ก ์์ ์ ๋๋ง์น ์๋ ์๋ค.
์ด๋ ๊ฒ ๋ถ๋ฆฌํ๋ ๊ฐ์ฅ ๊ฐํธํ ๋ฐฉ๋ฒ ํ๋๋ ๋์์ ์ฐ์ด์ ๋ ๋จ๊ณ๋ก ์ชผ๊ฐ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋จ๊ณ๋ฅผ ์ชผ๊ฐ๋ ๊ธฐ๋ฒ์ ์ฃผ๋ก ๋ฉ์น ํฐ ์ํํธ์จ์ด์ ์ ์ฉ๋๋ค. ํ์ง๋ง ๋๋ ๊ท๋ชจ์ ๊ด๊ณ์์ด ์ฌ๋ฌ ๋จ๊ณ๋ก ๋ถ๋ฆฌํ๋ฉด ์ข์๋งํ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ ๋๋ง๋ค ๊ธฐ๋ณธ์ ์ธ ๋จ๊ณ ์ชผ๊ฐ๊ธฐ ๋ฆฌํฉํฐ๋ง์ ํ๋ค. ๋ค๋ฅธ ๋จ๊ณ๋ก ๋ณผ ์ ์๋ ์ฝ๋ ์์ญ๋ค์ด ๋ง์นจ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋จ๊ณ ์ชผ๊ฐ๊ธฐ์ ์ ํฉํ๋ค๋ ๋ป์ด๋ค. ์ด ์ฝ๋ ์์ญ๋ค์ ๋ณ๋ ๋ชจ๋๋ก ๋ถ๋ฆฌํ๋ฉด ๊ทธ ์ฐจ์ด๋ฅผ ์ฝ๋์์ ํจ์ฌ ๋ถ๋ช ํ๊ฒ ๋๋ฌ๋ผ ์ ์๋ค.
์ ์ฐจ
- ๋ ๋ฒ์งธ ๋จ๊ณ์ ํด๋นํ๋ ์ฝ๋๋ฅผ ๋ ๋ฆฝ ํจ์๋ก ์ถ์ถํ๋ค
- ํ ์คํธํ๋ค
- ์ค๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ ์์์ ์ถ์ถํ ํจ์์ ์ธ์๋ก ์ถ๊ฐํ๋ค
- ํ ์คํธํ๋ค
- ์ถ์ถํ ๋ ๋ฒ์งธ ๋จ๊ณ ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ํ๋์ฉ ๊ฒํ ํ๋ค. ๊ทธ์ค ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ ์ฌ์ฉ๋๋ ๊ฒ์ ์ค๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ฎ๊ธด๋ค. ํ๋์ฉ ์ฎ๊ธธ ๋๋ง๋ค ํ ์คํธํ๋ค
- ์ฒซ ๋ฒ์งธ ๋จ๊ณ ์ฝ๋๋ฅผ ํจ์๋ก ์ถ์ถํ๋ฉด์ ์ค๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐํํ๋๋ก ๋ง๋ ๋ค.
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
function priceOrder(product, quantity, shippingMethod) {
// ๊ธฐ๋ณธ ์ ํ ๊ฐ๊ฒฉ
const basePrice = product.basePrice * quantity;
// ํ ์ธ ๊ฐ๊ฒฉ
const discount =
Math.max(quantity - product.discountThreshold, 0) *
product.basePrice *
product.discountRate;
// ๊ฐ๋ณ ๋ฐฐ์ก๋น
const shippingPerCase =
basePrice > shippingMethod.discountThreshold
? shippingMethod.discountedFee
: shippingMethod.feePerCase;
// ์ต์ข
๋ฐฐ์ก๋น
const shippingCost = quantity * shippingPerCase;
// ๊ฐ๊ฒฉ
const price = basePrice - discount + shippingCost;
return price;
}
// ์ฌ์ฉ ์:
const product = {
basePrice: 10,
discountRate: 0.1,
discountThreshold: 10,
};
const shippingMethod = {
discountThreshold: 20,
feePerCase: 5,
discountedFee: 3,
};
const price = priceOrder(product, 5, shippingMethod);
console.log(price);
/**
* ๋ด๊ฐ ์๊ฐํ ๋ฆฌํฉํฐ๋ง ๋ฐฉํฅ
* 1. ๊ฐ์ฒด๋ฅผ ํด๋์ค๋ก ๋ง๋ค์ด ๋ด๋ถ ํ๋กํผํฐ์ ์ง์ ์ ๊ทผํ์ง ๋ชป ํ๋๋ก ๋ง๊ธฐ
*/
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function priceOrder(product, quantity, shippingMethod) {
const basePrice = calculateBasePrice(product, quantity);
const discount = calcualteDiscountedPrice(product, quantity);
const shippingCost = calculateShippingCost(
basePrice,
quantity,
shippingMethod
);
return basePrice - discount + shippingCost;
}
function calculateBasePrice(product, quantity) {
return product.basePrice * quantity;
}
function calcualteDiscountedPrice(product, quantity) {
return (
Math.max(quantity - product.discountThreshold, 0) *
product.basePrice *
product.discountRate
);
}
function calculateShippingCost(basePrice, quantity, shippingMethod) {
const shippingPerCase =
basePrice > shippingMethod.discountThreshold
? shippingMethod.discountedFee
: shippingMethod.feePerCase;
return quantity * shippingPerCase;
}
// ์ฌ์ฉ ์:
const product = {
basePrice: 10,
discountRate: 0.1,
discountThreshold: 10,
};
const shippingMethod = {
discountThreshold: 20,
feePerCase: 5,
discountedFee: 3,
};
const price = priceOrder(product, 5, shippingMethod);
console.log(price);
/**
* ๋ด๊ฐ ์๊ฐํ ๋ฆฌํฉํฐ๋ง ๋ฐฉํฅ
* 1. ๊ฐ์ฒด๋ฅผ ํด๋์ค๋ก ๋ง๋ค์ด ๋ด๋ถ ํ๋กํผํฐ์ ์ง์ ์ ๊ทผํ์ง ๋ชป ํ๋๋ก ๋ง๊ธฐ
*/
/**
* 1. ์ฃผ์์ผ๋ก ๋ณ์์ ์๋ ํ์
ํ๊ธฐ
* 2. ํจ์๋ก ๋ถ๋ฆฌํ๊ธฐ
* 3. ๋ถํ์ํ (์์๋ณ์) ๋ฆฌํด๋ฌธ ์๋ตํ๊ธฐ
*/
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
const organization = { name: "Acme Gooseberries", country: "GB" };
organization.name = "eazel";
console.log(organization.name);
console.log(organization.country);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Organization {
#name;
#country;
#data; //low data, ์ค๋ฆฌ์ง๋ ์๋ณธ ๋ฐ์ดํฐ
constructor(data) {
this.#data = data;
this.#name = data.name;
this.#country = data.country;
}
get name() {
return this.#name;
}
set name(value) {
return (this.#name = value);
}
get country() {
return this.#country;
}
set country(value) {
return (this.#country = value);
}
get rawData() {
return { ...this.#data }; // ์์ ๋ณต์ฌ
}
}
const organization = new Organization({
name: "Acme Gooseberries",
country: "GB",
});
console.log(organization.name);
console.log(organization.country);
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
class Person {
#name;
#courses;
constructor(name) {
this.#name = name;
this.#courses = [];
}
get name() {
return this.#name;
}
get courses() {
return this.#courses;
}
set courses(courses) {
this.#courses = courses;
}
}
class Course {
#name;
#isAdvanced;
constructor(name, isAdvanced) {
this.#name = name;
this.#isAdvanced = isAdvanced;
}
get name() {
return this.#name;
}
get isAdvanced() {
return this.#isAdvanced;
}
}
const ellie = new Person("์คํฌ");
ellie.courses.push(new Course("๋ฆฌํฉํ ๋ง", true));
console.log(ellie.courses.length);
/**
* ์ธ๋ถ์์ course๋ฅผ ์
๋ฐ์ดํธํ๊ณ ์๋ ์ํฉ
*/
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Person {
#name;
#courses;
constructor(name) {
this.#name = name;
this.#courses = [];
}
get name() {
return this.#name;
}
get courses() {
return [...this.#courses];
}
addCourse(course) {
this.#courses.push(course);
}
removeCourse(course, runIfAbsent) {
const index = this.#courses.indexOf(course);
if (index === -1) {
runIfAbsent();
return;
}
this.#courses.splice(index, 1);
}
}
class Course {
#name;
#isAdvanced;
constructor(name, isAdvanced) {
this.#name = name;
this.#isAdvanced = isAdvanced;
}
get name() {
return this.#name;
}
get isAdvanced() {
return this.#isAdvanced;
}
}
const junhee = new Person("์คํฌ");
const course = new Course("๋ํฉํฐ๋ง", true);
junhee.addCourse(course);
console.log(junhee.courses.length);
junhee.removeCourse(course, () => {
console.log("ํด๋น ์ฝ์ค๋ ์๋ค");
});
console.log(junhee.courses.length);
junhee.removeCourse(course, () => {
console.log("ํด๋น ์ฝ์ค๋ ์๋ค");
});
/**
* ์ธ๋ถ์์ course๋ฅผ ์
๋ฐ์ดํธํ๊ณ ์๋ ์ํฉ
*/
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
export class Order {
constructor(data) {
this.priority = data.priority;
}
}
const orders = [
new Order({ priority: "normal" }),
new Order({ priority: "high" }),
new Order({ priority: "rush" }),
];
const highPriorityCount = orders.filter(
(o) => "high" === o.priority || "rush" === o.priority
).length;
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Order {
constructor(data) {
this.priority = data.priority;
}
isHighPriority() {
return this.priority.higherThan("normal");
}
}
class Priority {
#value;
constructor(value) {
if (Priority.legalValues().includes(value)) {
this.#value = value;
} else {
throw new Error(`${value} is invalid for Priority`);
}
}
get index() {
return Priority.legalValues().findIndex(this.#value);
}
equals(other) {
return this.#index === other.index;
}
higherThan(other) {
return this.#index > other.index;
}
static legalValues() {
return ["low", "normal", "high", "rush"];
}
}
const orders = [
new Order({ priority: "normal" }),
new Order({ priority: "high" }),
new Order({ priority: "rush" }),
];
const highPriorityCount = orders.filter((o) => o.isHighPriority()).length;
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
class Order {
#quantity;
#item;
constructor(quantity, item) {
this.#quantity = quantity;
this.#item = item;
}
get price() {
const basePrice = this.#quantity * this.#item.price;
const discountFactor = 0.98;
if (basePrice > 1000) discountFactor -= 0.03;
return basePrice * discountFactor;
}
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Order {
#quantity;
#item;
constructor(quantity, item) {
this.#quantity = quantity;
this.#item = item;
}
get basePrice() {
return this.#quantity * this.#item.price;
}
get discountFactor() {
return this.basePrice > 1000 ? 0.95 : 0.98;
}
get price() {
return this.basePrice * this.discountFactor;
}
}
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
class Person {
#name;
#officeAreaCode;
#officeNumber;
constructor(name, areaCode, number) {
this.#name = name;
this.#officeAreaCode = areaCode;
this.#officeNumber = number;
}
get name() {
return this.#name;
}
set name(arg) {
this.#name = arg;
}
get telephoneNumber() {
return `(${this.officeAreaCode}) ${this.officeNumber}`;
}
get officeAreaCode() {
return this.#officeAreaCode;
}
set officeAreaCode(arg) {
this.#officeAreaCode = arg;
}
get officeNumber() {
return this.#officeNumber;
}
set officeNumber(arg) {
this.#officeNumber = arg;
}
}
const person = new Person("์คํฌ", "010", "12345678");
console.log(person.name);
console.log(person.officeAreaCode);
console.log(person.officeNumber);
console.log(person.telephoneNumber);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Person {
#name;
#telephoneNumber;
constructor(name, areaCode, number) {
this.#name = name;
this.#telephoneNumber = new TelephoneNumber(areaCode, number);
}
get name() {
return this.#name;
}
set name(arg) {
this.#name = arg;
}
get telephoneNumber() {
return this.#telephoneNumber.toString;
}
get officeAreaCode() {
return this.#telephoneNumber.areaCode;
}
get officeNumber() {
return this.#telephoneNumber.number;
}
}
class TelephoneNumber {
#areaCode;
#number;
constructor(area, number) {
this.#areaCode = area;
this.#number = number;
}
get areaCode() {
return this.#areaCode;
}
set areaCode(arg) {
this.#areaCode = arg;
}
get number() {
return this.#number;
}
set number(arg) {
this.#number = arg;
}
get toString() {
return `(${this.#areaCode}) ${this.#number}`;
}
}
const telephoneNumber = new TelephoneNumber("010", "12345678");
telephoneNumber.toString;
const person = new Person("์คํฌ", "010", "12345678");
console.log(person.name);
console.log(person.officeAreaCode);
console.log(person.officeNumber);
console.log(person.telephoneNumber);
/**
* ํด๋์ค ํ๋ ๋น ํ๋์ ์ฑ
์๋ง ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์ข๋ค
*/
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
export class TrackingInformation {
#shippingCompany;
#trackingNumber;
constructor(trackingNumber, shippingCompany) {
this.#trackingNumber = trackingNumber;
this.#shippingCompany = shippingCompany;
}
get shippingCompany() {
return this.#shippingCompany;
}
set shippingCompany(arg) {
this.#shippingCompany = arg;
}
get trackingNumber() {
return this.#trackingNumber;
}
set trackingNumber(arg) {
this.#trackingNumber = arg;
}
get display() {
return `${this.shippingCompany}: ${this.trackingNumber}`;
}
}
export class Shipment {
#trackingInformation;
constructor(trackingInformation) {
this.#trackingInformation = trackingInformation;
}
get trackingInfo() {
return this.#trackingInformation.display;
}
get trackingInformation() {
return this.#trackingInformation;
}
set trackingInformation(trackingInformation) {
this.#trackingInformation = trackingInformation;
}
}
const shipment = new Shipment(new TrackingInformation(999, "Maersk"));
console.log(shipment.trackingInfo);
shipment.trackingInformation.shippingCompany = "COSCO";
console.log(shipment.trackingInfo);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
export class Shipment {
#trackingNumber;
#shippingCompany;
constructor(trackingNumber, shippingCompany) {
this.#trackingNumber = trackingNumber;
this.#shippingCompany = shippingCompany;
}
get shippingCompany() {
return this.#shippingCompany;
}
set shippingCompany(arg) {
this.#shippingCompany = arg;
}
get trackingNumber() {
return this.#trackingNumber;
}
set trackingNumber(arg) {
this.#trackingNumber = arg;
}
get display() {
return `${this.shippingCompany}: ${this.trackingNumber}`;
}
}
export class Shipment {
#trackingInformation;
constructor(trackingInformation) {
this.#trackingInformation = trackingInformation;
}
get trackingInfo() {
return this.#trackingInformation.display;
}
get trackingInformation() {
return this.#trackingInformation;
}
set trackingInformation(trackingInformation) {
this.#trackingInformation = trackingInformation;
}
}
const shipment = new Shipment(999, "Maersk");
console.log(shipment.trackingInfo);
shipment.trackingInformation.shippingCompany = "COSCO";
console.log(shipment.trackingInfo);
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
class Person {
#name;
#department;
constructor(name, department) {
this.#name = name;
this.#department = department;
}
get name() {
return this.#name;
}
get department() {
return this.#department;
}
set department(arg) {
this.#department = arg;
}
}
export class Department {
#manager;
#chargeCode;
constructor(manager, chargeCode) {
this.#manager = manager;
this.#chargeCode = chargeCode;
}
get chargeCode() {
return this.#chargeCode;
}
set chargeCode(arg) {
this.#chargeCode = arg;
}
get manager() {
return this.#manager;
}
set manager(arg) {
this.#manager = arg;
}
}
const person = new Person("Tom", new Department("aManager", "999"));
console.log(person.name);
console.log(person.department.manager);
console.log(person.department.chargeCode);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Person {
#name;
#department;
constructor(name, department) {
this.#name = name;
this.#department = department;
}
get name() {
return this.#name;
}
get manager() {
return this.#department.manager;
}
get chargeCode() {
return this.#department.chargeCode;
}
get department() {
return this.#department;
}
set department(arg) {
this.#department = arg;
}
}
export class Department {
#manager;
#chargeCode;
constructor(manager, chargeCode) {
this.#manager = manager;
this.#chargeCode = chargeCode;
}
get chargeCode() {
return this.#chargeCode;
}
set chargeCode(arg) {
this.#chargeCode = arg;
}
get manager() {
return this.#manager;
}
set manager(arg) {
this.#manager = arg;
}
}
const person = new Person("Tom", new Department("aManager", "999"));
console.log(person.name);
console.log(person.manager);
console.log(person.chargeCode);
/**
* ๋ด๋ถ์์ฌ ์ฌ์ฉํด์ผ ํ๋ ์ ๋ณด(department)๋ฅผ ์ง๋์น๊ฒ ๋
ธ์ถํ ์ผ์ด์ค๋ผ๊ณ ๋ณผ ์ ์๋ค
* ์ธ๋ถ์์ department๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋๋ก Department๋ฅผ ์จ๊ธฐ๋ ๋ฆฌํฉํฐ๋ง์ด๋ค
*/
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
class Person {
#name;
#department;
constructor(name, department) {
this.#name = name;
this.#department = department;
}
get name() {
return this.#name;
}
get department() {
return this.#department;
}
set department(arg) {
this.#department = arg;
}
}
export class Department {
#manager;
#chargeCode;
constructor(manager, chargeCode) {
this.#manager = manager;
this.#chargeCode = chargeCode;
}
get chargeCode() {
return this.#chargeCode;
}
set chargeCode(arg) {
this.#chargeCode = arg;
}
get manager() {
return this.#manager;
}
set manager(arg) {
this.#manager = arg;
}
}
const person = new Person("Tom", new Department("aManager", "999"));
console.log(person.name);
console.log(person.department.manager);
console.log(person.department.chargeCode);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Person {
#name;
#manager;
#chargeCode;
constructor(name, manager, chargeCode) {
this.#name = name;
this.#manager = manager;
this.#chargeCode = chargeCode;
}
get name() {
return this.#name;
}
get chargeCode() {
return this.#chargeCode;
}
set chargeCode(arg) {
this.#chargeCode = arg;
}
get manager() {
return this.#manager;
}
set manager(arg) {
this.#manager = arg;
}
}
const person = new Person("Tom", "aManager", "999");
console.log(person.name);
console.log(person.manager);
console.log(person.chargeCode);
/**
* ์ค๊ฐ์ = ์์ = ์ปดํฌ์ง์
* A ํด๋์ค ๋ด๋ถ์์ B ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ
* B๋ผ๋ ์ค๊ฐ์๋ฅผ ํตํด์ A์์ ์ํ๋ ์ ๋ณด๋ฅผ ์ป๋ ํ์
*/
/**
* extract ์ถ์ถํด์ ์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ก ๋๋ ๊ฒ์ธ์ง
* inline ์ ๊ฑฐํด์ ํ๋๋ก ๋ง๋ค ๊ฒ์ธ์ง ๊ณ ๋ฏผํด์ผ ํ๋ค
*/
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
function foundPerson(people) {
for (let i = 0; i < people.length; i++) {
if (people[i] === "Don") {
return "Don";
}
if (people[i] === "John") {
return "John";
}
if (people[i] === "Kent") {
return "Kent";
}
}
return "";
}
console.log(foundPerson(["John"]));
console.log(foundPerson(["Don", "John"]));
console.log(foundPerson(["Kent", "Don", "John"]));
console.log(foundPerson(["Lisa", "Don", "Tom"]));
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function foundPerson(people) {
const candidates = ["Don", "John", "Kent"];
return people.find((p) => candidates.includes(p)) || "";
}
console.log(foundPerson(["John"]));
console.log(foundPerson(["Don", "John"]));
console.log(foundPerson(["Kent", "Don", "John"]));
console.log(foundPerson(["Lisa", "Don", "Tom"]));
/**
* ํจ์๋ผ๋ ๊ฒ ๋ํ ์บก์ํ์ด๋ค
* ์ด๋ฆ๋ง ๋๊ณ ๋ด๋ถ ์ธ๋ถ ์ฌํญ์ ์จ๊ฒจ๋๊ณ , ์ด๋ฆ๋ง์ผ๋ก ์ ์ถํ๊ณ ๋์ด๊ฐ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด ์ข๋ค
*/
๋ฐฐ๊ฒฝ
์ข์ ์ํํธ์จ์ด ์ค๊ณ์ ํต์ฌ์ ๋ชจ๋ํ๊ฐ ์ผ๋ง๋ ์ ๋์ด ์๋๋๋ฅผ ๋ปํ๋ ๋ชจ๋์ฑ(modularity)์ด๋ค. ๋ชจ๋์ฑ์ด๋ ํ๋ก๊ทธ๋จ์ ์ด๋๊ฐ๋ฅผ ์์ ํ๋ ค ํ ๋ ํด๋น ๊ธฐ๋ฅ๊ณผ ๊น์ด ๊ด๋ จ๋ ์์ ์ผ๋ถ๋ง ์ดํดํด๋ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๋ฅ๋ ฅ์ด๋ค.
๋ชจ๋์ฑ์ ๋์ด๋ ค๋ฉด ์๋ก ์ฐ๊ด๋ ์์๋ค์ ํจ๊ป ๋ฌถ๊ณ , ์์ ์ฌ์ด์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ์ฐพ๊ณ ์ดํดํ ์ ์๋๋ก ํด์ผ ํ๋ค. ํ์ง๋ง ํ๋ก๊ทธ๋จ์ ์ผ๋ง๋ ์ ์ดํดํ๋๋์ ๋ฐ๋ผ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
๋ชจ๋ ํจ์๋ ์ด๋ค ์ปจํ ์คํธ์๋ ์กด์ฌํ๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๋ชจ๋ํ ์ปจํ ์คํธ๋ ํด๋์ค๋ค. ๋ํ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ค์ฒฉ์์ผ๋ ๋ ๋ค๋ฅธ ๊ณตํต ์ปจํ ์คํธ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค.
ํจ์๋ฅผ ์ฎ๊ธธ์ง ๋ง์ง๋ฅผ ์ ํ๊ธฐ๋ ์ฝ์ง ์๋ค. ๊ทธ๋ด ๋ ๋์ ํจ์์ ํ์ฌ ์ปจํ ์คํธ์ ํ๋ณด ์ปจํ ์คํธ๋ฅผ ๋๋ฌ๋ณด๋ฉด ๋์์ด ๋๋ค.
๋์ ํจ์๋ฅผ ํธ์ถํ๋ ํจ์๋ค์ ๋ฌด์์ธ์ง, ๋์ ํจ์๊ฐ ํธ์ถํ๋ ํจ์๋ค์ ๋ ๋ฌด์์ด ์๋์ง, ๋์ ํจ์๊ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ ๋ฌด์์ธ์ง๋ฅผ ์ดํด๋ด์ผ ํ๋ค.
๊ฒฝํ์ ํจ์๋ค์ ํ ์ปจํ ์คํธ์ ๋๊ณ ์์ ํด๋ณด๋ ๊ฒ๋ ๊ด์ฐฎ๋ค. ๊ทธ๊ณณ์ด ์ผ๋ง๋ ์ ํฉํ์ง๋ ์ฐจ์ฐจ ๊นจ๋ฌ์๊ฐ ๊ฒ์์ ์๊ณ ์๊ณ , ์ ๋ง์ง ์๋ค๊ณ ํ๋จ๋๋ฉด ์์น๋ ์ธ์ ๋ ์ฎ๊ธธ ์ ์์ผ๋ ๋ง์ด๋ค.
์ ์ฐจ
- ์ ํํ ํจ์๊ฐ ํ์ฌ ์ปจํ ์คํธ์์ ์ฌ์ฉ ์ค์ธ ๋ชจ๋ ํ๋ก๊ทธ๋จ ์์๋ฅผ ์ดํด๋ณธ๋ค. ์ด ์์๋ค ์ค์๋ ํจ๊ป ์ฎ๊ฒจ์ผ ํ ๊ฒ ์๋์ง ๊ณ ๋ฏผํด๋ณธ๋ค
- ์ ํํ ํจ์๊ฐ ๋คํ ๋ฉ์๋์ธ์ง ํ์ธํ๋ค
- ์ ํํ ํจ์๋ฅผ ํ๊น ์ปจํ ์คํธ๋ก ๋ณต์ฌํ๋ค. ํ๊น ํจ์๊ฐ ์๋ก์ด ํฐ์ ์ ์ ์๋ฆฌ ์ก๋๋ก ๋ค๋ฌ๋๋ค
- ์ด๋ ์๋์ ํจ์๋ฅผ ์์ค ํจ์(source function) ๋ผ ํ๊ณ ๋ณต์ฌํด์ ๋ง๋ ์๋ก์ด ํจ์๋ฅผ ํ๊น ํจ์(target function)๋ผ ํ๋ค.
- ์ ์ ๋ถ์์ ์ํํ๋ค
- ์์ค ์ปจํ ์คํธ์์ ํ๊น ํจ์๋ฅผ ์ฐธ์กฐํ ๋ฐฉ๋ฒ์ ์ฐพ์ ๋ฐ์ํ๋ค
- ์์ค ํจ์๋ฅผ ํ๊น ํจ์์ ์์ ํจ์๊ฐ ๋๋๋ก ์์ ํ๋ค
- ํ ์คํธํ๋ค
- ์์ค ํจ์๋ฅผ ์ธ๋ผ์ธํ ์ง ๊ณ ๋ฏผํด๋ณธ๋ค.
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
function trackSummary(points) {
const totalTime = calculateTime();
const totalDistance = calculateDistance();
const pace = totalTime / 60 / totalDistance;
return {
time: totalTime,
distance: totalDistance,
pace: pace,
};
function calculateDistance() {
let result = 0;
for (let i = 1; i < points.length; i++) {
result += distance(points[i - 1], points[i]);
}
return result;
}
function distance(p1, p2) {
// ํฌ๋ฎฌ๋ผ: http://www.movable-type.co.uk/scripts/latlong.html
const EARTH_RADIUS = 3959; // in miles
const dLat = radians(p2.lat) - radians(p1.lat);
const dLon = radians(p2.lon) - radians(p1.lon);
const a =
Math.pow(Math.sin(dLat / 2), 2) +
Math.cos(radians(p2.lat)) *
Math.cos(radians(p1.lat)) *
Math.pow(Math.sin(dLon / 2), 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return EARTH_RADIUS * c;
}
function radians(degrees) {
return (degrees * Math.PI) / 180;
}
function calculateTime() {
return 10000;
}
}
const newYork = {
lat: 40.73061,
lon: -73.935242,
};
const tokyo = {
lat: 35.652832,
lon: 139.839478,
};
const summary = trackSummary([newYork, tokyo]);
console.log(summary);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
/**
* ์์ํ๊ฒ ํจ์๋ก๋ง ๊ตฌ์ฑ๋ ๋ก์ง
*
* trackSummary ๋ผ๋ ํจ์๊ฐ ๋ค๋ฅธ ๋ด๋ถ ํจ์๋ฅผ ๊ฐ์ผ ํํ์์ง๋ง,
* ์ค์ง์ ์ผ๋ก ์์ง๋(์๋ก๋ฅผ ํ์๋ก ํ๋ ์ ๋)๊ฐ ๋จ์ด์ก๋ค.
*
*/
function trackSummary(points) {
const time = calculateTime();
const distance = calculateDistance(points);
const pace = time / 60 / distance;
return { time, distance, pace };
}
function calculateTime() {
return 10000;
}
function calculateDistance(points) {
let result = 0;
for (let i = 1; i < points.length; i++) {
result += distance(points[i - 1], points[i]);
}
return result;
}
function radians(degrees) {
return (degrees * Math.PI) / 180;
}
function distance(p1, p2) {
// ํฌ๋ฎฌ๋ผ: http://www.movable-type.co.uk/scripts/latlong.html
const EARTH_RADIUS = 3959; // in miles
const dLat = radians(p2.lat) - radians(p1.lat);
const dLon = radians(p2.lon) - radians(p1.lon);
const a =
Math.pow(Math.sin(dLat / 2), 2) +
Math.cos(radians(p2.lat)) *
Math.cos(radians(p1.lat)) *
Math.pow(Math.sin(dLon / 2), 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return EARTH_RADIUS * c;
}
const newYork = {
lat: 40.73061,
lon: -73.935242,
};
const tokyo = {
lat: 35.652832,
lon: 139.839478,
};
const summary = trackSummary([newYork, tokyo]);
console.log(summary);
๋ฐฐ๊ฒฝ
ํ๋ก๊ทธ๋จ์ ์๋น ๋ถ๋ถ์ด ๋์์ ๊ตฌํํ๋ ์ฝ๋๋ก ์ด๋ค์ง์ง๋ง ํ๋ก๊ทธ๋จ์ ์ง์ง ํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ๋์จ๋ค. ์ฃผ์ด์ง ๋ฌธ์ ์ ์ ํฉํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ฉด ๋์ ์ฝ๋๋ ์์ฐ์ค๋ฝ๊ฒ ๋จ์ํ๊ณ ์ง๊ด์ ์ผ๋ก ์ง์ฌ์ง๋ค.
๋ฐ๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์๋ชป ์ ํํ๋ฉด ์๊ท๊ฐ ๋ง์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ์ฝ๋๋ก ๋ฒ๋ฒ ์ด ๋๋ค. ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋ ๋ฐ์ ๋๋์ง ์๊ณ , ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ฒด๋ ๊ทธ ํ๋ก๊ทธ๋จ์ด ์ด๋ค ์ผ์ ํ๋์ง ํ์ ํ๊ธฐ ์ด๋ ต๊ฒ ํ๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ค์ํ๋ค. ํ์ง๋ง ํ๋ฅญํ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ถฐ์ผ ํ ๋ค๋ฅธ ์์ธ๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ ๋๋ก ํ๊ธฐ๊ฐ ์ด๋ ต๋ค. ๊ฐ์ฅ ์ ํฉํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์๋ด๊ณ ์ ํ๋ก์ ํธ ์ด๊ธฐ์ ๋ถ์์ ํด ๋ณธ ๊ฒฐ๊ณผ, ๊ฒฝํ๊ณผ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ ๊ฐ์ ๊ธฐ์ ์ด ๋ด ๋ฅ๋ ฅ์ ๊ฐ์ ํด์ค์ ์์๋๋ค.
ํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ ์ ํ์ง ์์์ ๊บ ๋ซ๊ฒ ๋๋ฉด ๊ณง๋ฐ๋ก ์์ ํด์ผ ํ๋ค. ๊ณ ์น์ง ์๊ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋จ๊ฒจ์ง ํ ๋ค์ ์ฐ๋ฆฌ ๋จธ๋ฆฟ์์ ํผ๋์ค๋ฝ๊ฒ ํ๊ณ ํ๋ ์์ฑํ๊ฒ ๋ ์ฝ๋๋ฅผ ๋์ฑ ๋ณต์กํ๊ฒ ๋ง๋ค์ด๋ฒ๋ฆฐ๋ค.
์์ปจ๋ ํจ์์ ์ด๋ค ๋ ์ฝ๋๋ฅผ ๋๊ธธ ๋๋ง๋ค ๋ ๋ค๋ฅธ ๋ ์ฝ๋์ ํ๋๋ ํจ๊ป ๋๊ธฐ๊ณ ์๋ค๋ฉด ๋ฐ์ดํฐ ์์น๋ฅผ ์ฎ๊ฒจ์ผ ํ ๊ฒ์ด๋ค. ํจ์์ ํญ์ ํจ๊ผ ๊ฑด๋ค์ง๋ ๋ฐ์ดํฐ ์กฐ๊ฐ๋ค์ ์ํธ ๊ด๊ณ๊ฐ ๋ช ํํ๊ฒ ๋๋ฌ๋๋๋ก ํ ๋ ์ฝ๋์ ๋ด๋ ๊ฒ ๊ฐ์ฅ ์ข๋ค.
ํ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ค ํ ๋ ๋ค๋ฅธ ๋ ์ฝ๋์ ํ๋๊น์ง ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด ํ๋์ ์์น๊ฐ ์๋ชป๋์๋ค๋ ์ ํธ๋ค.
๊ตฌ์กฐ์ฒด ์ฌ๋ฌ ๊ฐ์ ์ ์๋ ๋๊ฐ์ ํ๋๋ค์ ๊ฐฑ์ ํด์ผ ํ๋ค๋ฉด ํ ๋ฒ๋ง ๊ฐฑ์ ํด๋ ๋๋ ๋ค๋ฅธ ์์น๋ก ์ฎ๊ธฐ๋ผ๋ ์ ํธ๋ค.
์ง๊ธ๊น์ง์ ์ค๋ช ์์ ๋ ์ฝ๋๋ผ๋ ์ฉ์ด๋ฅผ ์ผ์ง๋ง, ๋ ์ฝ๋ ๋์ ํด๋์ค๋ ๊ฐ์ฒด๊ฐ ์๋ ๋๊ฐ๋ค. ํด๋์ค๋ ํจ์๊ฐ ๊ณ๋ค์ฌ์ง ๋ ์ฝ๋๋ผ ํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฑด๊ฐํ๊ฒ ๊ด๋ฆฌ๋ผ์ผ ํ๋ค.
ํด๋์ค์ ๋ฐ์ดํฐ๋ค์ ์ ๊ทผ์ ๋ฉ์๋๋ค ๋ค์ ๊ฐ์ถฐ์ ธ(์บก์ํ๋์ด) ์์ผ๋ฏ๋ก ํด๋์ค์ ๊ณ๋ค์ฌ์ง ํจ์๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฆฌ์ ๋ฆฌ ์ฎ๊ธฐ๋ ์์ ์ ์ฝ๊ฒ ํด์ค๋ค.
์ ์ฐจ
- ์์ค ํ๋๊ฐ ์บก์ํ๋์ด ์์ง ์๋ค๋ฉด ์บก์ํํ๋ค
- ํ ์คํธํ๋ค
- ํ๊น ๊ฐ์ฒด์ ํ๋์ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค
- ์ ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค
- ์์ค ๊ฐ์ฒด์์ ํ๊น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋์ง ํ์ธํ๋ค
- ์ ๊ทผ์๋ค์ด ํ๊น ํ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํ๋ค
- ํ ์คํธํ๋ค
- ์์ค ํ๋๋ฅผ ์ ๊ฑฐํ๋ค
- ํ ์คํธํ๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
class Customer {
constructor(name, discountRate) {
this.name = name;
this.discountRate = discountRate;
this.contract = new CustomerContract(this.dateToday());
}
get discountRate() {
return this.discountRate;
}
becomePreferred() {
this.discountRate += 0.03;
// ๋ค๋ฅธ ์ฝ๋๋ค์ด ์์...
}
applyDiscount(amount) {
return amount.subtract(amount.multiply(this.discountRate));
}
dateToday() {
return new Date();
}
}
class CustomerContract {
constructor(startDate) {
this.startDate = startDate;
}
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
class Customer {
constructor(name, discountRate) {
this.name = name;
this.contract = new CustomerContract(this.dateToday(), discountRate);
}
becomePreferred() {
this.contract.discountRate += 0.03;
// ๋ค๋ฅธ ์ฝ๋๋ค์ด ์์...
}
applyDiscount(amount) {
return amount.subtract(amount.multiply(this.contract.discountRate));
}
dateToday() {
return new Date();
}
}
class CustomerContract {
constructor(startDate, discountRate) {
this.startDate = startDate;
this.discountRate = discountRate;
}
get discountRate() {
return this.discountRate;
}
set discountRate(value) {
this.discountRate = value;
}
}
๋ฐฐ๊ฒฝ
์ค๋ณต ์ ๊ฑฐ๋ ์ฝ๋๋ฅผ ๊ฑด๊ฐํ๊ฒ ๊ด๋ฆฌํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๋ค. ์์ปจ๋ ํน์ ํจ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๊ฐ ๋์ฌ ๋๋ง๋ค ๊ทธ ์์ด๋ ๋ค์์ ๋๊ฐ์ ์ฝ๋๊ฐ ์ถ๊ฐ๋ก ์คํ๋๋ ๋ชจ์ต์ ๋ณด๋ฉด, ๋๋ ๊ทธ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ ํผํธ์ถ ํจ์๋ก ํฉ์น๋ ๋ฐฉ๋ฒ์ ๊ถ๋ฆฌํ๋ค.
์ด๋ ๊ฒ ํด๋๋ฉด ์ถํ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์์ ๋ฌด์ธ๊ฐ ์์ ํ ์ผ์ด ์๊ฒผ์ ๋ ๋จ ํ๊ณณ๋ง ์์ ํ๋ฉด ๋๋ค.
๋ฌธ์ฅ๋ค์ ํจ์๋ก ์ฎ๊ธฐ๋ ค๋ฉด ๊ทธ ๋ฌธ์ฅ๋ค์ด ํผํธ์ถ ํจ์์ ์ผ๋ถ๋ผ๋ ํ์ ์ด ์์ด์ผ ํ๋ค. ํผํธ์ถ ํจ์์ ํ ๋ชธ์ ์๋์ง๋ง ์ฌ์ ํ ํจ๊ป ํธ์ถ๋ผ์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋จ์ํ ํด๋น ๋ฌธ์ฅ๋ค๊ณผ ํผํธ์ถ ํจ์๋ฅผ ํต์งธ๋ก ๋ ํ๋์ ํจ์๋ก ์ถ์ถํ๋ค.
์ ์ฐจ
- ๋ฐ๋ณต ์ฝ๋๊ฐ ํจ์ ํธ์ถ ๋ถ๋ถ๊ณผ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ค๋ฉด ๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ๋ฅผ ์ ์ฉํด ๊ทผ์ฒ๋ก ์ฎ๊ธด๋ค
- ํ๊น ํจ์๋ฅผ ํธ์ถํ๋ ๊ณณ์ด ํ ๊ณณ๋ฟ์ด๋ฉด, ๋จ์ํ ์์ค ์์น์์ ํด๋น ์ฝ๋๋ฅผ ์๋ผ๋ด์ด ํผํธ์ถ ํจ์๋ก ๋ณต์ฌํ๊ณ ํ ์คํธํ๋ค. ์ด ๊ฒฝ์ฐ๋ผ๋ฉด ๋๋จธ์ง ๋จ๊ณ๋ ๋ฌด์ํ๋ค
- ํธ์ถ์๊ฐ ๋ ์ด์์ด๋ฉด ํธ์ถ์ ์ค ํ๋์์ 'ํ๊น ํจ์ ํธ์ถ ๋ถ๋ถ๊ณผ ๊ทธ ํจ์๋ก ์ฎ๊ธฐ๋ ค๋ ๋ฌธ์ฅ๋ค์ ํจ๊ป' ๋ค๋ฅธ ํจ์๋ก ์ถ์ถํ๋ค. ์ถ์ถํ ํจ์์ ๊ธฐ์ตํ๊ธฐ ์ฌ์ด ์์ ์ด๋ฆ์ ์ง์ด์ค๋ค
- ๋ค๋ฅธ ํธ์ถ์ ๋ชจ๋๊ฐ ๋ฐฉ๊ธ ์ถ์ถํ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํ๋ค. ํ๋์ฉ ์์ ํ ๋๋ง๋ค ํ ์คํธํ๋ค
- ๋ชจ๋ ํธ์ถ์๊ฐ ์๋ก์ด ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์๋ ํจ์๋ฅผ ์๋ก์ด ํจ์ ์์ผ๋ก ์ธ๋ผ์ธํ ํ ์๋ ํจ์๋ฅผ ์ ๊ฑฐํ๋ค
- ์๋ก์ด ํจ์์ ์ด๋ฆ์ ์๋ ํจ์์ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ์ค๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
function renderPerson(person) {
const result = [];
result.push(`<p>${person.name}</p>`);
result.push(renderPhoto(person.photo));
result.push(`<p>title: ${person.photo.title}</p>`);
result.push(emitPhotoData(person.photo));
return result.join("\n");
}
function photoDiv(p) {
return ["<div>", `<p>title: ${p.title}</p>`, emitPhotoData(p), "</div>"].join(
"\n"
);
}
function emitPhotoData(aPhoto) {
const result = [];
result.push(`<p>location: ${aPhoto.location}</p>`);
result.push(`<p>date: ${aPhoto.date.toDateString()}</p>`);
return result.join("\n");
}
function renderPhoto(aPhoto) {
return "";
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function renderPerson(person) {
const result = [];
result.push(`<p>${person.name}</p>`);
result.push(renderPhoto(person.photo));
result.push(emitPhotoData(person.photo));
return result.join("\n");
}
function photoDiv(photo) {
return ["<div>", emitPhotoData(photo), "</div>"].join("\n");
}
function emitPhotoData(photo) {
const result = [];
result.push(`<p>title: ${photo.photo.title}</p>`);
result.push(`<p>location: ${photo.location}</p>`);
result.push(`<p>date: ${photo.date.toDateString()}</p>`);
return result.join("\n");
}
function renderPhoto(photo) {
return "";
}
๋ฐฐ๊ฒฝ
ํจ์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ ์ฌ๋ฆฌ๋ ์ถ์ํ์ ๊ธฐ๋ณธ ๋น๋ฉ ๋ธ๋ก์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ถ์ํ๋ผ๋ ๊ฒ์ด ๊ทธ ๊ฒฝ๊ณ๋ฅผ ํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธ๊ธฐ๊ฐ ๋ง๋ง์น ์๋ค.
๊ทธ๋์ ์ฝ๋๋ฒ ์ด์ค์ ๊ธฐ๋ฅ ๋ฒ์๊ฐ ๋ฌ๋ผ์ง๋ฉด ์ถ์ํ์ ๊ฒฝ๊ณ๋ ์์ง์ด๊ฒ ๋๋ค. ํจ์ ๊ด์ ์์ ์๊ฐํด๋ณด๋ฉด, ์ด๊ธฐ์๋ ์์ง๋ ๋๊ณ ํ๊ฐ์ง ์ผ๋ง ์ํํ๋ ํจ์๊ฐ ์ด๋์ ๋ ์ด์์ ๋ค๋ฅธ ์ผ์ ์ํํ๊ฒ ๋ฐ๋ ์ ์๋ค๋ ๋ป์ด๋ค.
์์ปจ๋ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์ผ๋ถ ํธ์ถ์์๊ฒ๋ ๋ค๋ฅด๊ฒ ๋์ํ๋๋ก ๋ฐ๋์ด์ผ ํ๋ค๋ฉด ์ด๋ฐ ์ผ(์ด๊ธฐ์๋ ์์ง๋ ๋๊ณ ํ๊ฐ์ง ์ผ๋ง ์ํํ๋ ํจ์๊ฐ ์ด๋์ ๋ ์ด์์ ๋ค๋ฅธ ์ผ์ ์ํํ๊ฒ ๋ฐ๋ ์ ์๋ค)์ด ๋ฒ์ด์ง๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ฐ์๋ ๋ฌ๋ผ์ง ๋์์ ํจ์์์ ๊บผ๋ด ํด๋น ํธ์ถ์๋ก ์ฎ๊ฒจ์ผ ํ๋ค.
์ ์ฐจ
- ํธ์ถ์๊ฐ ํ๋ ๊ฐ๋ฟ์ด๊ณ ํผํธ์ถ ํจ์๋ ๊ฐ๋จํ ๋จ์ํ ์ํฉ์ด๋ฉด, ํผํธ์ถ ํจ์์ ์ฒ์ ์ค์ ์๋ผ๋ด์ด ํธ์ถ์๋ก ๋ณต์ฌํด ๋ฃ๋๋ค. ํ ์คํธ๋ง ํต๊ณผํ๋ฉด ์ด๋ฒ ๋ฆฌํฉํฐ๋ง์ ์ฌ๊ธฐ์ ๋์ด๋ค
- ๋ ๋ณต์กํ ์ํฉ์์๋, ์ด๋ํ์ง '์๊ธธ' ์ํ๋ ๋ชจ๋ ๋ฌธ์ฅ์ ํจ์๋ก ์ถ์ถํ ๋ค์ ๊ฒ์ํ๊ธฐ ์ฌ์ด ์์ ์ด๋ฆ์ ์ง์ด์ค๋ค
- ์๋ ํจ์๋ฅผ ์ธ๋ผ์ธํ๋ค
- ์ถ์ถ๋ ํจ์์ ์ด๋ฆ์ ์๋ ํจ์์ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํ๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
/**
* outStream.write(`<p>location: ${photo.location}</p>\n`); ๋ฅผ ์ธ๋ถ์์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
*/
function renderPerson(outStream, person) {
outStream.write(`<p>${person.name}</p>\n`);
renderPhoto(outStream, person.photo);
emitPhotoData(outStream, person.photo);
}
function listRecentPhotos(outStream, photos) {
photos
.filter((p) => p.date > recentDateCutoff())
.forEach((p) => {
outStream.write("<div>\n");
emitPhotoData(outStream, p);
outStream.write("</div>\n");
});
}
function emitPhotoData(outStream, photo) {
outStream.write(`<p>title: ${photo.title}</p>\n`);
outStream.write(`<p>date: ${photo.date.toDateString()}</p>\n`);
outStream.write(`<p>location: ${photo.location}</p>\n`);
}
function renderPhoto(outStream, aPhoto) {
outStream.write("");
}
function recentDateCutoff() {
//7 days ago.
return new Date().setDate(new Date().getDate() - 7);
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
function renderPerson(outStream, person) {
outStream.write(`<p>${person.name}</p>\n`);
renderPhoto(outStream, person.photo);
emitPhotoData(outStream, person.photo);
outStream.write(`<p>location: ${photo.location}</p>\n`);
}
function listRecentPhotos(outStream, photos) {
photos
.filter((p) => p.date > recentDateCutoff())
.forEach((p) => {
outStream.write("<div>\n");
emitPhotoData(outStream, p);
outStream.write("</div>\n");
});
}
function emitPhotoData(outStream, photo) {
outStream.write(`<p>title: ${photo.title}</p>\n`);
outStream.write(`<p>date: ${photo.date.toDateString()}</p>\n`);
}
function renderPhoto(outStream, aPhoto) {
outStream.write("");
}
function recentDateCutoff() {
//7 days ago.
return new Date().setDate(new Date().getDate() - 7);
}
๋ฐฐ๊ฒฝ
ํจ์๋ ์ฌ๋ฌ ๋์์ ํ๋๋ก ๋ฌถ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์์ ์ด๋ฆ์ด ์ฝ๋์ ๋์ ๋ฐฉ์๋ณด๋ค ๋ชฉ์ ์ ๋งํด์ฃผ๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ํ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ๊ฐ ์ฌ์์ง๋ค. ํจ์๋ ์ค๋ณต์ ์์ ๋ ๋ฐ๋ ํจ๊ณผ์ ์ด๋ค.
์ด๋ฏธ ์กด์ฌํ๋ ํจ์์ ๋๊ฐ์ ์ผ์ ํ๋ ์ธ๋ผ์ธ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๋ณดํต์ ํด๋น ์ฝ๋๋ฅผ ํจ์ ํธ์ถ๋ก ๋์ฒดํ๊ธธ ์ํ ๊ฒ์ด๋ค. ์์ธ๊ฐ ์๋ค๋ฉด, ์์ ํ ์ฐ์ฐํ ๋น์ทํ ์ฝ๋๊ฐ ๋ง๋ค์ด์ก์ ๋๋ฟ์ด๋ค. ์ฆ, ๊ธฐ์กด ํจ์์ ์ฝ๋๋ฅผ ์์ ํ๋๋ผ๋ ์ธ๋ผ์ธ ์ฝ๋์ ๋์์ ๋ฐ๋์ง ์์์ผ ํ ๋๋ฟ์ด๋ค.
์ ์ฐจ
- ์ธ๋ผ์ธ ์ฝ๋๋ฅผ ํจ์ ํธ์ถ๋ก ๋์ฒดํ๋ค
- ํ ์คํธํ๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
let appliesToMass = false;
for (const s of states) {
if (s === "MA") appliesToMass = true;
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
let appliesToMass2 = states.includes("MA");
๋ฐฐ๊ฒฝ
๊ด๋ จ๋ ์ฝ๋๋ค์ด ๊ฐ๊น์ด ๋ชจ์ฌ ์๋ค๋ฉด ์ดํดํ๊ธฐ๊ฐ ๋ ์ฝ๋ค. ์์ปจ๋ ํ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๋ฌธ์ฅ๋ค์ ํ๋ฐ ๋ชจ์ฌ ์์ด์ผ ์ข๋ค.
์ค์ ๋ก ๋๋ ๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ ๋ฆฌํฉํฐ๋ง์ผ๋ก ์ด๋ฐ ์ฝ๋๋ค์ ํ๋ฐ ๋ชจ์๋๋ค. ๊ฐ์ฅ ํํ ์ฌ๋ก๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ ๋๋ค. ๋ชจ๋ ๋ณ์ ์ ์ธ์ ํจ์ ์ฒซ๋จธ๋ฆฌ์ ๋ชจ์๋๋ ์ฌ๋๋ ์๋๋ฐ, ๋๋ ๋ณ์๋ฅผ ์ฒ์ ์ฌ์ฉํ ๋ ์ ์ธํ๋ ์คํ์ผ์ ์ ํธํ๋ค.
์ ์ฐจ
- ์ฝ๋ ์กฐ๊ฐ์ ์ด๋ํ ๋ชฉํ ์์น๋ฅผ ์ฐพ๋๋ค. ์ฝ๋ ์กฐ๊ฐ์ ์๋ ์์น์ ๋ชฉํ ์์น ์ฌ์ด์ ์ฝ๋๋ค์ ํ์ด๋ณด๋ฉด์, ์กฐ๊ฐ์ ๋ชจ์ผ๊ณ ๋๋ฉด ๋์์ด ๋ฌ๋ผ์ง๋ ์ฝ๋๊ฐ ์๋์ง ์ดํ๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ญ์ด ์๋ค๋ฉด ์ด ๋ฆฌํฉํฐ๋ง์ ํฌ๊ธฐํ๋ค.
- ์ฝ๋ ์กฐ๊ฐ์์ ์ฐธ์กฐํ๋ ์์๋ฅผ ์ ์ธํ๋ ๋ฌธ์ฅ ์์ผ๋ก๋ ์ด๋ํ ์ ์๋ค
- ์ฝ๋ ์กฐ๊ฐ์ ์ฐธ์กฐํ๋ ์์์ ๋ค๋ก๋ ์ด๋ํ ์ ์๋ค
- ์ฝ๋ ์กฐ๊ฐ์์ ์ฐธ์กฐํ๋ ์์๋ฅผ ์์ ํ๋ ๋ฌธ์ฅ์ ๊ฑด๋๋ฐ์ด ์ด๋ํ ์ ์๋ค
- ์ฝ๋ ์กฐ๊ฐ์ด ์์ ํ๋ ์์๋ฅผ ์ฐธ์กฐํ๋ ์์๋ฅผ ๊ฑด๋๋ฐ์ด ์ด๋ํ ์ ์๋ค
- ์ฝ๋ ์กฐ๊ฐ์ ์๋ ์์น์์ ์๋ผ๋ด์ด ๋ชฉํ ์์น์ ๋ถ์ฌ ๋ฃ๋๋ค
- ํ ์คํธํ๋ค
์ฝ๋ ์กฐ๊ฐ์ ์ฌ๋ผ์ด๋ํ ๋๋ ๋ ๊ฐ์ง๋ฅผ ํ์ธํด์ผ ํ๋ค. 1. ๋ฌด์์ ์ฌ๋ผ์ด๋ํ ์ง
์ 2. ์ฌ๋ผ์ด๋ํ ์ ์๋์ง ์ฌ๋ถ
๋ค. ๋ฌด์์ ์ฌ๋ผ์ด๋ํ ์ง๋ ๋งฅ๋ฝ๊ณผ ๊ด๋ จ์ด ๊น๋ค.
๊ฐ์ฅ ๋จ์ํ๊ฒ๋, ์์๋ฅผ ์ ์ธํ๋ ๊ณณ๊ณผ ์ฌ์ฉํ๋ ๊ณณ์ ๊ฐ๊น์ด ๋๊ธฐ๋ฅผ ์ข์ํ๋ ๋๋ ์ ์ธ ์ฝ๋๋ฅผ ์ฌ๋ผ์ด๋ํ์ฌ ์ฒ์ ์ฌ์ฉํ๋ ๊ณณ๊น์ง ๋์ด๋ด๋ฆฌ๋ ์ผ์ ์์ฃผ ํ๋ค.
์ฝ๋ ์กฐ๊ฐ์ ์ฌ๋ผ์ด๋ํ๊ธฐ๋ก ํ๋ค๋ฉด, ๋ค์ ๋จ๊ณ๋ก๋ ๊ทธ ์ผ์ด ์ค์ ๋ก ๊ฐ๋ฅํ์ง๋ฅผ ์ ๊ฒํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ์ฌ๋ผ์ด๋ํ ์ฝ๋ ์์ฒด์ ๊ทธ ์ฝ๋๊ฐ ๊ฑด๋๋ฐ์ด์ผ ํ ์ฝ๋๋ฅผ ๋ชจ๋ ์ดํด์ผ ํ๋ค.
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
// ์์ 1
const pricingPlan = retrievePricingPlan();
const order = retreiveOrder();
let charge;
const chargePerUnit = pricingPlan.unit;
// ์์ 2
function someFunc() {
let result;
if (availableResources.length === 0) {
result = createResource();
allocatedResources.push(result);
} else {
result = availableResources.pop();
allocatedResources.push(result);
}
return result;
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
// ์์ 1
const pricingPlan = retrievePricingPlan();
const chargePerUnit = pricingPlan.unit;
const order = retreiveOrder();
let charge;
// ์์ 2
function someFunc() {
const result =
availableResources.length === 0
? (result = createResource())
: (result = availableResources.pop());
allocatedResources.push(result);
return result;
}
๋ฐฐ๊ฒฝ
์ข ์ข ๋ฐ๋ณต๋ฌธ ํ๋์์ ๋ ๊ฐ์ง ์ผ์ ์ํํ๋ ๋ชจ์ต์ ๋ณด๊ฒ ๋๋ค. ๊ทธ์ ๋ ์ผ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ด์ ์์ ๋ง์ด๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ๋ณต๋ฌธ์ ์์ ํด์ผ ํ ๋๋ง๋ค ๋ ๊ฐ์ง ์ผ ๋ชจ๋๋ฅผ ์ ์ดํดํ๊ณ ์งํํด์ผ ํ๋ค. ๋ฐ๋๋ก ๊ฐ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ถ๋ฆฌํด๋๋ฉด ์์ ํ ๋์ ํ๋๋ง ์ดํดํ๋ฉด ๋๋ค.
๋ฐ๋ณต๋ฌธ์ ๋ ๋ฒ ์คํํด์ผ ํ๋ฏ๋ก ์ด ๋ฆฌํฉํฐ๋ง์ ๋ถํธํดํ๋ ํ๋ก๊ทธ๋๋จธ๋ ๋ง๋ค. ๋ค์ ํ๋ฒ ์ด์ผ๊ธฐํ์ง๋ง, ๋ฆฌํฉํฐ๋ง๊ณผ ์ต์ ํ๋ฅผ ๊ตฌ๋ถํ์.
์ต์ ํ๋ ์ฝ๋๋ฅผ ๊น๋ํ ์ ๋ฆฌํ ์ดํ์ ์ํํ์. ๋ฐ๋ณต๋ฌธ์ ๋ ๋ฒ ์คํํ๋ ๊ฒ ๋ณ๋ชฉ์ด๋ผ ๋ฐํ์ง๋ฉด ๊ทธ๋ ๋ค์ ํ๋๋ก ํฉ์น๊ธฐ๋ ์์ ์ฃฝ ๋จน๊ธฐ๋ค.
ํ์ง๋ง ์ฌ์ง์ด ๊ธด ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํ๋๋ผ๋ ๋ณ๋ชฉ์ผ๋ก ์ด์ด์ง๋ ๊ฒฝ์ฐ๋ ๋งค์ฐ ๋๋ฌผ๋ค. ์คํ๋ ค ๋ฐ๋ณต๋ฌธ ์ชผ๊ฐ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ ๊ฐ๋ ฅํ ์ต์ ํ๋ฅผ ์ ์ฉํ ์ ์๋ ๊ธธ์ ์ด์ด์ฃผ๊ธฐ๋ ํ๋ค.
์ ์ฐจ
- ๋ฐ๋ณต๋ฌธ์ ๋ณต์ ํด ๋ ๊ฐ๋ก ๋ง๋ ๋ค
- ๋ฐ๋ณต๋ฌธ์ด ์ค๋ณต๋์ด ์๊ธฐ๋ ๋ถ์ํจ๊ณผ๋ฅผ ํ์ ํด์ ์ ๊ฑฐํ๋ค
- ํ ์คํธํ๋ค
- ์๋ฃ๋์ผ๋ฉด, ๊ฐ ๋ฐ๋ณต๋ฌธ์ ํจ์๋ก ์ถ์ถํ ์ง ๊ณ ๋ฏผํด๋ณธ๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
/* ๋ฐ๋ณต๋ฌธ ์ชผ๊ฐ๊ธฐ */
function reportYoungestAgeAndTotalSalary(people) {
function youngestAge() {
let youngest = people[0] ? people[0].age : Infinity;
for (const p of people) {
if (p.age < youngest) youngest = p.age;
}
return youngest;
}
function youngestAge2() {
return Math.min(...people.map((p) => p.age));
}
function totalSalary() {
let totalSalary = 0;
for (const p of people) {
totalSalary += p.salary;
}
return totalSalary;
}
function totalSalary2() {
return people.reduce((total, p) => (total += p.salary), 0);
}
return `youngestAge: ${youngestAge()}, totalSalary: ${totalSalary()}`;
}
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
/* ๋ฐ๋ณต๋ฌธ ์ชผ๊ฐ๊ธฐ */
function reportYoungestAgeAndTotalSalary(people) {
function youngestAge() {
let youngest = people[0] ? people[0].age : Infinity;
for (const p of people) {
if (p.age < youngest) youngest = p.age;
}
return youngest;
}
function youngestAge2() {
return Math.min(...people.map((p) => p.age));
}
function totalSalary() {
let totalSalary = 0;
for (const p of people) {
totalSalary += p.salary;
}
return totalSalary;
}
function totalSalary2() {
return people.reduce((total, p) => (total += p.salary), 0);
}
return `youngestAge: ${youngestAge()}, totalSalary: ${totalSalary()}`;
}
๋ฐฐ๊ฒฝ
ํ๋ก๊ทธ๋๋จธ ๋๋ถ๋ถ์ด ๊ทธ๋ ๋ฏ ๋๋ ๊ฐ์ฒด ์ปฌ๋ ์ ์ ์ํํ ๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ผ๊ณ ๋ฐฐ์ ๋ค. ํ์ง๋ง ์ธ์ด๋ ๊ณ์ํด์ ๋ ๋์ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ ์ชฝ์ผ๋ก ๋ฐ์ ํด์๋ค.
์์ปจ๋ฐ ์ด๋ฒ ์ด์ผ๊ธฐ์ ์ฃผ์ธ๊ณต์ธ ์ปฌ๋ ์ ํ์ดํ๋ผ์ธ์ ์ด์ฉํ๋ฉด ์ฒ๋ฆฌ ๊ณผ์ ์ ์ผ๋ จ์ ์ฐ์ฐ์ผ๋ก ํํํ ์ ์๋ค.
์ด๋ ๊ฐ ์ฐ์ฐ์ ์ปฌ๋ ์ ์ ์ ๋ ฅ๋ฐ์ ๋ค๋ฅธ ์ปฌ๋ ์ ์ ๋ด๋ฑ๋๋ค.
์ ์ฐจ
- ๋ฐ๋ณต๋ฌธ์์ ์ฌ์ฉํ๋ ์ปฌ๋ ์ ์ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ํ๋ ๋ง๋ ๋ค
- ๋ฐ๋ณต๋ฌธ์ ์ฒซ ์ค๋ถํฐ ์์ํด์, ๊ฐ๊ฐ์ ๋จ์ ํ์๋ฅผ ์ ์ ํ ํ์ดํ๋ผ์ธ ์ฐ์ฐ์ผ๋ก ๋์ฒดํ๋ค. ์ด๋ ์ปฌ๋ ์ ํ์ดํ๋ผ์ธ ์ฐ์ฐ์ 1์์ ๋ง๋ ๋ฐ๋ณต๋ฌธ ์ปฌ๋ ์ ๋ณ์์์ ์์ํ์ฌ, ์ด์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ด๋ก ์ฐ์์ ์ผ๋ก ์ํ๋๋ค. ํ๋๋ฅผ ๋์ฒดํ ๋๋ง๋ค ํ ์คํธํ๋ค
- ๋ฐ๋ณต๋ฌธ์ ๋ชจ๋ ๋์์ ๋์ฒดํ๋ค๋ฉด ๋ฐ๋ณต๋ฌธ ์์ฒด๋ฅผ ์ง์ด๋ค
๋ฆฌํฉํฐ๋ง ์ด์ ์ฝ๋
function acquireData(input) {
const lines = input.split("\n");
let firstLine = true;
const result = [];
for (const line of lines) {
if (firstLine) {
firstLine = false;
continue;
}
if (line.trim() === "") continue;
const record = line.split(",");
if (record[1].trim() === "India") {
result.push({ city: record[0].trim(), phone: record[2].trim() });
}
}
return result;
}
const input = `office, country, telephone\n
Chicago, USA, +1 312 373 1000\n
Beijing, China, +86 4008 900 505\n
Bangalore, India, +91 80 4064 9570\n
Porto Alegre, Brazil, +55 51 3079 3550\n
Chennai, India, +91 44 660 44766`;
const result = acquireData(input);
console.log(result);
๋ฆฌํฉํฐ๋ง ์ดํ ์ฝ๋
/**
* ๋ฐ๋ณต๋ฌธ์ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ฐ๊พธ๊ธฐ
*/
function acquireData(input) {
return input
.split("\n")
.splice(1)
.filter((line) => line.trim() !== "")
.map((line) => line.split(","))
.filter((line) => line[1].trim() === "India")
.map((line) => ({
city: line[0].trim(),
phone: line[2].trim(),
}));
}
const input = `office, country, telephone\n
Chicago, USA, +1 312 373 1000\n
Beijing, China, +86 4008 900 505\n
Bangalore, India, +91 80 4064 9570\n
Porto Alegre, Brazil, +55 51 3079 3550\n
Chennai, India, +91 44 660 44766`;
const result = acquireData(input);
console.log(result);
๋ฐฐ๊ฒฝ
์ ์ฐจ