practice with Refactoring2.0 written by Martin Fowler
- ์ฐฝ์
๊ฒฝํ์์ ์ป์ ๊ด์
- ๋ฆฐ ์คํํธ์ , ๋์์ธ ์ฝํน, ์ ์์ผ ๋ชจ๋ ๊ณตํต์ ์ด ์๋ค.
- ๊ฐ์ฅ ํต์ฌ์ด ๋๋ ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด ํผ๋๋ฐฑ์ ๋ฐ๋๋ค.
- ์๋น์์ ๋ฐ์์ ์ง์์ ์ผ๋ก ๋ฐ์ํ๋ฉฐ ์ ์ง์ ์ผ๋ก ํ๋ก๋ํธ๋ฅผ ๋ง๋ ๋ค.
- ์ด ๊ณผ์ ์์ ํ๋ก๋ํธ๋ ์์๋ก ๋ณํํ๋ค. ์ด๋, ๊พธ์คํ ๋ฆฌํฉํฐ๋ง์ ํตํด ๊น๋ํ ์ฝ๋, ์์คํ ์ ๋ง๋ค์ด ๋จ๋ค๋ฉด ๋ณ๊ฒฝ์ด ์ฌ์์ง๋ค.
- ๋ฐ๋ผ์ ํ์ด๋ฐ์ ๋์น์ง ์๊ณ ์๋น์ค, ํ๋ก๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ๊ฒฐ๊ตญ ์๋น์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ์์ด ๋ฆฌํฉํฐ๋ง์ ํตํด ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ํด๊ฒฐ๋ฐฉ์์ ์ ์ํ ์ ์๋ ํ ๋๊ฐ ๋ ์ ์๋ค.
๋ฆฌํฉํฐ๋ง 2ํ์ ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ด๋ค์ ธ์๋ค.
์ฝํ๋ฆฐ์ ์ต์ํด์ง๊ธฐ ์ํด ์ฝํ๋ฆฐ์ผ๋ก ์ฝ๋๋ฅผ ๋ฐ๊ฟ ์ฐ์ตํ๋ค.
์ปค๋ฐ ํ์คํ ๋ฆฌ๋ก ๋ฆฌํฉํฐ๋ง ๊ณผ์ ์ ๊ธฐ๋กํ๋ค.
๋ฆฌํฉํ ๋ง์ ์์ ๋ฐ๋์ ํ
์คํธ๋ฅผ ์ค๋นํ๋ค.
- kotlin์ ์ํ ํ ์คํธ ๋๊ตฌ์ธ kotest๋ฅผ ์ด์ฉํ์ฌ ํ ์คํธ ์ค๋น
- ๊ฒฐ๊ณผ ์คํธ๋ง์ ๋น๊ตํ๋ ์ฝ๋๋ก ์์ฑํจ
๊ฐ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์ ๋ชฉ์ ์ ์๊ฐํ๋ฉฐ ์งํํ๋ค.
- ์์ฃผ ์ ์ฐํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฝํ๋ฆฐ์ผ๋ก ๋ณํ์ํค๋ฉด์ ์๊ธฐ๋ ๋ฌธ์ ์ ๋ค์ด ์์๋ค.
- ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ฒด์ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ
- ํด๊ฒฐ๋ฐฉ๋ฒ: ์์ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด์ ์งํํ๊ฑฐ๋, ๊ธฐ์กด ํด๋์ค์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํจ
- ๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ์งํํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ์ง ์๋ฌธ์ด ์๊น
- ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ฒด์ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ
- ํด๋์ค๋, ํจ์๋ก ์ถ์ถํ๊ณ ์ด์ ์ ์ฌ์ฉํ๋ ๋ณ์, ํจ์๋ฅผ ์ถ์ถํ ํด๋์ค์ ๊ฐ์ฒด, ํจ์๋ก ๋ฐ๊ฟ ๋ ๊ผผ๊ผผํ๊ฒ ์ฒดํฌํด์ผ ํ๋ค
- ์ค์ํ ์ ์๋ ๋ถ๋ถ์ด๋ผ ๋ฐ๋์ ํ ์คํธ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.
- ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ์ค๋ฅ๋ฅผ ๋ฐ๋ก ๋ฐ๊ฒฌํ ์ ์์๋ค. ํ ์คํธ์ผ ๊ณ ๋ง์
- ํ
์คํธ ์ฝ๋ ์ง๊ธฐ๊ฐ ์๊ฐ๋ณด๋ค ์ฝ์ง์๋ค.
- ๋ฆฌํฉํ ๋ง์ ์์ ๋ฐ๊พธ๊ณ ์ ํ๋ ๋ถ๋ถ์ ํ ์คํธ๋ฅผ ๋ง๋ จํด์ผํ๋๋ฐ ์์ง ์ต์ํ์ง ์๋ค.
- ๊น ์ปค๋ฐ์ ์์ฃผ ์๊ฒ ์ชผ๊ฐ๋ ์ฐ์ต์ด ๋์๋ค.
- ์ฝ๋ฉ์ ํ ๋, ๊ตฌํ์ ๊ธ๊ธํ์ฌ ์ปค๋ฐ์ ์์๋ก ํ์ง ์์์๋ค.
- ์ค์๊ฐ ๋ฐ์ํ์ ๋ ํ์ฐธ ์ ์ ์ปค๋ฐ์ผ๋ก ๋์๊ฐ๋๊ฐ, ํ๋ฆฐ ๋ถ๋ถ๋ง ๋ถ์ํ์ฌ ๋ค์ ๊ณ ์ณค์๋ค. ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค.
- ๋จ์ ์ปค๋ฐ์ด ์์์ง๋ฉด ๋ฉ์์ง ์์ฑ์ด ๊ท์ฐฎ์ง๋ง ๊ฒฐ๊ตญ ์์ฐ์ฑ์ด ๋ ์ข์์ง๋ค.
์ ์
์ํํธ์จ์ด์ ๊ฒ๋ณด๊ธฐ ๋์*์ ๊ทธ๋๋ ์ ์งํ ์ฑ, ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฝ๋๋ก ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฒ ํน์ ๋ณ๊ฒฝํ๊ธฐ
๊ฒ๋ณด๊ธฐ ๋์: ๋ฆฌํฉํฐ๋ง ์ ๊ณผ ํ์ ์ฝ๋๊ฐ ๊ฐ์ ๊ฒฐ๊ณผ ํน์ ๋์์ ํด์ผํจ
๋ฆฌํฉํฐ๋ง์ ์ ์์ ๋ฐ๋ผ ํน์ ๋ฐฉ์์ผ๋ก
์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด๋ค. ์ฆ ๊ฒ๋ณด๊ธฐ ๋์์ ๊ทธ๋๋ก ์ ์งํ ์ฑ, ์์ ๋ฆฌํฉํฐ๋ง ๋จ๊ณ๋ค์ ์ฐ๊ฒฐํ์ฌ ํฐ ๋ณํ๋ฅผ ์ด๋์ด ๋ธ๋ค.
- ๋ฆฌํฉํฐ๋ง์ ๋ฒ๊ทธ ํฝ์ค๋ฅผ ํ์ง ์๋๋ค. ๊ธฐ๋ฅ ์ถ๊ฐ๋ ํ์ง ์๋๋ค.
- ๋ฆฌํฉํฐ๋ง์ ์ฑ๋ฅ ๊ฐ์ ์ด ๋ชฉ์ ์ด ์๋๋ค. ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฝ๊ฒ ๋ฐ๊พธ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค.
- ์ํํธ์จ์ด ์ค๊ณ ๊ฐ์
- ์ํํธ์จ์ด ์ดํด ์ฌ์์ง
- ํ์ธ์ด ์์ฑํ ์ฝ๋๋ ์ดํดํ๊ธฐ ์ฌ์์ง๋ฏ๋ก ํ์ ์์ ๊ฐํ ๊ฐ์
- ๋ฒ๊ทธ ์ฐพ๊ธฐ ์ฌ์์ง
- ๋ฆฌํฉํฐ๋ง ๊ณผ์ ์ ํตํด ์ฝ๋๊ฐ ํ๋ ์ผ์ ๊น๊ฒ ์ดํดํ ์ ์๊ณ , ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋์ฑ ๋ช ํํ ๋ค๋ฌ์ ์ ์๋ค.
- ์ฝ๋๊ฐ ๋ช ํํด์ง๋ฉด ๋ฒ๊ทธ๋ ์ง๋์น ์ ์๋ค.
- ํ๋ก๊ทธ๋๋ฐ ์๋ ์์น
- ํํ ๋ฆฌํฉํ ๋ง์ ํ๊ฒ๋๋ฉด ์๊ฐ์ ์๋ชจํ๋ค๋ ์ด๋ฏธ์ง๊ฐ ์๋ค.
- ๊ทธ๋ฌ๋ ๋ฆฌํฉํ ๋ง์ ํตํด ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ช ํํด์ง๋ฉด, ์ถํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ํจ์ฌ ๋นจ๋ผ์ง๋ค.
- ๊ทธ๋ฅ ์ฝ๋ฉํ๋ค.
- ๋น์ทํ ์ผ์ ๋ ๋ฒ์งธ๋ก ํ๊ฒ๋์ด๋ ๊ณ์ ์งํํ๋ค.
- 3 strike out. ๋ฆฌํฉํฐ๋ง ํ์!
- ๋ฆฌํฉํฐ๋ง์ ๋ฐ๋ก ์๊ฐ์ ๋ด์ ํ๋ ๊ฒ์ด ์๋๋ค. ์ข์ ์ต๊ด์ฒ๋ผ ์์๋ก ํด์ผํ๋ค.
- ์์ ์ปค๋ฐ์ ์๊ฒ ๋๋ ๋ฉ์ธ์ง๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ๊ท์ฐฎ๊ณ ์๊ฐ์ด ์กฐ๊ธ ๋ ์์๋์ง๋ง ๊ฒฐ๊ตญ ์์ฐ์ฑ์ด ์ข์์ง๋ค.
- ์ธ์ ๋ฆฌํฉํฐ๋ง์ ์งํํด์ผ ํ๋์ง ํ๋จํ๋ ๊ฒ์ ์์ง ๊ฐ์ด ์์กํ๋ค.
์๋ จ๋ ๊ฐ๋ฐ์์ ์ง๊ด๋งํผ ์ ํํ ๊ธฐ์ค์ ์๋ค!!
๊ฐ์ ๊ฒฝํ์ ํตํด ๊ฐ์ ํค์์ผ ํ๋ค.
์ฝ๋๋ฅผ ๋ช
๋ฃํ๊ฒ ํํํ๋๋ฐ ๊ฐ์ฅ ์ค์ํ ์์ ์ค ํ๋๋ ์ด๋ฆ
์ด๋ค.
์ด๋ฆ๋ง ๋ณด๊ณ ๋ ํจ์, ๋ณ์ ๋ฑ์ด ํ๋ ์ผ์ ์ ์ ์์ด์ผ ํ๋ค.
๋ง๋
ํ ์ด๋ฆ์ด ๋ ์ค๋ฅด์ง ์๋๋ค๋ฉด ์ค๊ณ์ ๋ฌธ์ ๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
๊ฐ์ ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ณต๋๋ค๋ฉด ํตํฉํ์ฌ ๋ ๋์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ค. (chap2์ 3strike out)
๋ค๋ง ์ฝ๋๊ฐ ์ค๋ณต๋๋ ๋ถ๋ถ์ ์๋ก ์ฐจ์ด์ ์ด ์กด์ฌํ๋์ง ๊ผผ๊ผผํ๊ฒ ์ดํด๋ณด๊ณ ์์ ํด์ผํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํจ์ ์ถ์ถํ๊ธฐ
- ๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ ์ดํ ํจ์ ์ถ์ถํ๊ธฐ
- ๋ฉ์๋ ์ฌ๋ฆฌ๊ธฐ
- ๋ถ๋ชจ๋ก๋ถํฐ ํ์๋ ์๋ธํด๋์ค์ ์ฝ๋ ์ค๋ณต์ด ์๋ค๋ฉด ๋ถ๋ชจ ํด๋์ค๋ก ์ฎ๊ธด๋ค.
ํจ์๊ฐ ๊ธธ์๋ก ์ดํดํ๊ธฐ ์ด๋ ต๋ค. ํจ์๋ฅผ ์งง๊ฒ ๊ตฌ์ฑํ๋ฉด ์ฝ๋๋ฅผ ์ดํด, ๊ณต์ , ์ ํํ๊ธฐ ์ฌ์์ง๋ค.
์งง์ ํจ์๋ก ๊ตฌ์ฑ๋ ์ฝ๋๋ ์ฌ๋์ด ์ฝ๊ธฐ์๋ ๋ถ๋ด์ด ๋์ง๋ง, ๋ช
ํํ ์๋
๋ฅผ ๋๋ฌ๋ด๋ ๋ค์ด๋ฐ์ ํตํด ์ด๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
-
์์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ, ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ, ๊ฐ์ฒด ํต์งธ๋ก ๋๊ธฐ๊ธฐ
- ๋๋ฌด ๋ง์ ๋งค๊ฐ๋ณ์, ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ ์ถ์ถ์ ๋ฐฉํด๊ฐ ๋๋ค.
-
ํจ์๋ฅผ ๋ช ๋ น์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ๋งค๊ฐ๋ณ์, ์์ ๋ณ์๋ฅผ ์ ๊ฑฐํ์์๋ ์ฌ์ ํ ๋ง๋ค๋ฉด ํจ์๋ฅผ ๋ช ๋ น์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผํ๋ค.
-
์กฐ๊ฑด๋ฌธ ๋ถํดํ๊ธฐ, ํจ์ ์ถ์ถํ๊ธฐ, ์กฐ๊ฑด๋ฌธ์ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ์กฐ๊ฑด๋ฌธ์ ์ถ์ถ ๋์์ด ๋ ์ ์๋ค.
- switch๋ฌธ์ case๋ฌธ ๋ง๋ค ํจ์๋ฅผ ์ถ์ถํ๋ค.
- ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋๋๋ switch๋ฌธ์ด ๋ง๋ค๋ฉด ์กฐ๊ฑด๋ฌธ์ ๋คํ์ฑ์ผ๋ก ๋ฐ๊ฟ ์ ์ฉํ๋ค.
-
- ๋ฐ๋ณต๋ฌธ๋ ์ถ์ถ ๋์์ด ๋ ์ ์๋ค.
- ๋ฐ๋ณต๋ฌธ ๋ด์ ์ฑ๊ฒฉ์ด ๋ค๋ฅธ ์์ ์ด ์๋ค๋ฉด ๋ฐ๋ณต๋ฌธ ์ชผ๊ฐ๊ธฐ๋ฅผ ์ ์ฉํ๋ค.
๊ณผ๊ฑฐ์๋ ์ ์ญ ๋ณ์ ์ฌ์ฉ์ ํผํ๊ธฐ์ํด ์ ๋ถ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ผ๊ณ ํ๋ค(?)
๊ทธ๋ฌ๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ง๋ฉด ์ฝ๋ ์ดํด๊ฐ ์ด๋ ค์์ง๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ์์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ, ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ, ๊ฐ์ฒด ํต์งธ๋ก ๋๊ธฐ๊ธฐ
- ํ๋๊ทธ ์ธ์ ์ ๊ฑฐํ๊ธฐ
- ํจ์ ๋์๋ฐฉ์์ ๊ฒฐ์ ํ๋ ํ๋๊ทธ ์ญํ ์ ๋งค๊ฐ๋ณ์ ์ ๊ฑฐ
- ์ฌ๋ฌ ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๊ธฐ
- ์ฌ๋ฌ ๊ฐ์ ํจ์๊ฐ ํน์ ๋งค๊ฐ๋ณ์๋ค์ ๊ฐ์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ๋ ๊ณตํต ๊ฐ๋ค์ ํด๋์ค ํ๋๋ก ์ ์ํ๋ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๋ฉด ๋ถ๋ถ ์ ์ฉ ํจ์ ์์ฑ
์ ์ญ ๋ฐ์ดํฐ๋ ์ธ์ , ์ด๋์๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ๊ฐ์ด ๋ณ๊ฒฝ ๋ ์ ์๋ค.
์ด๋ ๋ฒ๊ทธ์ ์์ธ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ค๋ ์ ์ ๋์น๋ฉด ๋ฐ์ํ๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ๋ฐ์ดํฐ๋ ๋ถ๋ณ์ด๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ๋ฐํํ๋ ๊ฐ๋ ์ ๊ฐ๋๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ๋ณ์ ์บก์ํํ๊ธฐ
- ์ ํด๋์ ํจ์๋ฅผ ๊ฑฐ์ณ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๊ฐ์, ์ฝ๋ ๊ฐ์ ์ ์ฉ์ดํ๋ค.
- ๋ณ์ ์ชผ๊ฐ๊ธฐ
- ํ๋์ ๋ณ์๊ฐ ๋ค๋ฅธ ๊ฐ๋ค์ ์ ์ฅํ๋ค๋ฉด ๊ฐ ์ฉ๋ ๋ณ๋ก ๋ณ์๋ฅผ ์ชผ๊ฐ์.
- ๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ, ํจ์ ์ถ์ถํ๊ธฐ
- ๊ฐฑ์ ๋ก์ง์ ๋ณ๋๋ก ๋ถ๋ฆฌํ๋๊ฒ ์ข๋ค.
- ์ง์ ํจ์์ ๋ณ๊ฒฝ ํจ์ ๋ถ๋ฆฌํ๊ธฐ
- API๋ฅผ ๋ง๋ค ๋ ๊ฐ์ ์ฝ๋ ํจ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ํจ์๋ ๋ถ๋ฆฌํ๋ค.
- ์ธํฐ ์ ๊ฑฐํ๊ธฐ
- ํ์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ
- ์ฌ๋ฌ ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๊ธฐ, ์ฌ๋ฌ ํจ์๋ฅผ ๋ณํ ํจ์๋ก ๋ฌถ๊ธฐ
- ๋ณ์๋ฅผ ๊ฐฑ์ ํ๋ ์ฝ๋๋ค์ ์ ํจ๋ฒ์๋ฅผ ์ ํํ๋ค.
- ์ฐธ์กฐ๋ฅผ ๊ฐ์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ๊ตฌ์กฐ์ฒด์ฒ๋ผ ๋ด๋ถ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ณ์๋ผ๋ฉด, ๋ด๋ถ ํ๋๋ฅผ ์์ ํ์ง ๋ง๊ณ ๊ตฌ์กฐ์ฒด๋ฅผ ํต์งธ๋ก ๊ต์ฒดํ๋ค.
์ํํธ์จ์ด๋ ๋ง ๊ทธ๋๋ก ๋ถ๋๋ฌ์์ผ ํ๋ค. ์ฆ ์์ ์ ์ฉ์ดํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์์ ํ ๋๋ ๋ฑ ํ ๊ตฐ๋ฐ๋ฅผ ์ฐพ์ ์์ ๊ฐ๋ฅํ ์์คํ ์ ์ถ๊ตฌํด์ผ ํ๋ค.
๋จ์ผ ์ฑ ์ ์์น(SRP)์ด ์ ๋๋ก ์ง์ผ์ง์ง ์์ ๋ ๋ค์ํจ ๋ณ๊ฒฝ์ด ๋ํ๋๋ค. ํ๋์ ๋ชจ๋์ด ์ด๋ค ์ด์ ๋ค๋ก ์ธํด ๊ณ์ ๋ณ๊ฒฝ๋๋ ์ผ์ด ๋ง์์ง ๋ ๋ฐ์ํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ๋จ๊ณ ์ชผ๊ฐ๊ธฐ
- ์ผ์ ํ ์์์ ์ํด ์คํ๋๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐ์ ๋ด์ ๋จ๊ณ๋ฅผ ๋ถ๋ฆฌํ๋ค.
- ํจ์ ์ฎ๊ธฐ๊ธฐ, ํจ์ ์ถ์ถํ๊ธฐ, ํด๋์ค ์ถ์ถํ๊ธฐ
- ์ ์ฒด ์ฒ๋ฆฌ ๊ณผ์ ์์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋งฅ๋ฝ์ ํจ์ ํธ์ถ์ด ๋ง๋ค๋ฉด, ๊ฐ ๋งฅ๋ฝ์ ์ ์ ํ ๋ชจ๋์ ๋ง๋ค์ด ๊ด๋ฆฌํ๋ค.
- ์ฌ๋ฌ ๋งฅ๋ฝ์ ๊ด์ฌํ๋ ํจ์, ํด๋์ค๊ฐ ์๋ค๋ฉด ์ถ์ถ์ ๋จผ์ ํ๋ค.
์ฐํ์ด ์์ ์ ๋ค์ํจ ๋ณ๊ฒฝ๊ณผ๋ ๋ฐ๋๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์์ํ๊ฒ ์์ ํด์ผํ๋ ํด๋์ค๊ฐ ๋ง์ ๋์ด๋ค. ๋ณ๊ฒฝํ ๋ถ๋ถ์ด ์ฝ๋ ์ ๋ฐ์ ์๋ค๋ฉด ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์ ๋์น ์ ์๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํจ์ ์ฎ๊ธฐ๊ธฐ, ํ๋ ์ฎ๊ธฐ๊ธฐ, ์ฌ๋ฌ ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๊ธฐ, ์ฌ๋ฌ ํจ์๋ฅผ ๋ณํ ํจ์๋ก ๋ฌถ๊ธฐ
- ํจ๊ป ๋ณ๊ฒฝ๋๋ ๋์๋ค์ ๋ฌถ์ด๋๋ค.
- ๋น์ทํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ํจ์๊ฐ ๋ง๋ค๋ฉด ํจ์๋ฅผ ํด๋์ค๋ก ๋ฌถ๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณํํ๊ฑฐ๋ ๋ณด๊ฐํ๋ ํจ์๋ค์ ๋ณํ ํจ์๋ก ๋ฌถ๋๋ค.
- ๋จ๊ณ ์ชผ๊ฐ๊ธฐ
- ์์์ ๋ฌถ์ ํจ์๋ค์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋จ๊ณ๋ก ๋๊ธธ ์ ์๋ค๋ฉด ๋จ๊ณ๋ฅผ ๋๋ ์ ์๋ค.
- ํจ์ ์ธ๋ผ์ธํ๊ธฐ, ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
- ์ ๋งคํ๊ฒ ๋ถ๋ฆฌ๋ ๋ก์ง์ ๋ค์ ํจ์, ํด๋์ค ์ธ๋ผ์ธ์ผ๋ก ํฉ์น ์ ์๋ค.
ํ๋ก๊ทธ๋จ ๋ชจ๋ํ๋ ์ฌ๋ฌ ์์ญ์ผ๋ก ๋ถํ ํ ๋ค, ๊ฐ ์์ญ ๋ด์์ ์ํธ์์ฉ์ ์ต๋ํํ๊ณ ๋ค๋ฅธ ์์ญ ์ฌ์ด์์์ ์ํธ์์ฉ์ ์ต์ํํด์ผ ํ๋ค. ์ด ๊ฐ๋ ์ด ์ด๊ธ๋ ๋, ๊ธฐ๋ฅ ํธ์ ๊ฐ ๋ํ๋๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํจ์ ์ฎ๊ธฐ๊ธฐ, ํจ์ ์ถ์ถํ๊ธฐ
- ์ธ๋ถ ๊ฐ์ฒด์ ์ฌ๋ฌ ๊ฒํฐ ๋ฉ์๋๋ฅผ ํธ์ถ ํจ์์ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ๊ทผ์ฒ๋ก ์ฎ๊ธด๋ค.
- ํจ์์ ์ผ๋ถ๋ถ์์ ์ด๋ฐ ์ฑํฅ์ด ๋ํ๋๋ฉด ์ผ๋ถ๋ถ์ ํจ์๋ก ์ถ์ถํ์ฌ ์ฎ๊ธด๋ค.
๋ฐ์ดํฐ ํญ๋ชฉ ์๋ ๊ฐ๊ฐ ์ฌ๋ฌ ๊ณณ์์ ๊ฐ์ด ๋ฑ์ฅํ๋ ๊ฒฝํฅ์ด ๋ง๋ค. ์ด๋, ๋ชฐ๋ ค๋ค๋๋ ๋ฐ์ดํฐ ๋ญ์น๋ฅผ ๋ฐ๋ก ์ถ์ถํด ์ค์ผ ํ๋ค. ๋ฐ์ดํฐ ๋ญ์น์ธ์ง ํ๋ณํ๋ ค๋ฉด ๊ฐ ํ๋๋ฅผ ์ญ์ ํด๋ณธ๋ค. ์ด๋ ๋๋จธ์ง ๋ฐ์ดํฐ๋ก๋ ์๋ฏธ๊ฐ ์๋ค๋ฉด ๊ฐ์ฒด๋ก ๋ถ๋ฆฌ ํ ์ ์๋ค. ์ฆ, ์๋ก์ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๋ก์ง์์ ์ํธ ์์กด์ ์ด๋ผ ํ ์ ์๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํด๋์ค ์ถ์ถํ๊ธฐ, ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ, ๊ฐ์ฒด ํต์งธ๋ก ๋๊ธฐ๊ธฐ
- ํ๋ ํํ์ ๋ฐ์ดํฐ ๋ญ์น๋ฅผ ์ฐพ์ ํด๋์ค๋ก ์ถ์ถํ๋ค.
- ๋ฉ์๋ ์๊ทธ๋์ฒ*์ ๋ฐ์ดํฐ ๋ญ์น๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ก ๋ง๋ค๊ฑฐ๋, ๊ฐ์ฒด๋ฅผ ํต์งธ๋ก ๋๊ฒจ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ธ๋ค.
๋ฉ์๋ ์๊ทธ๋์ฒ
๋ฉ์๋ ๋ช ๊ณผ ๋งค๊ฐ ๋ณ์ ๋ฆฌ์คํธ์ ์กฐํฉ. ์ด๋ฅผ ํตํด ๊ฐ ํจ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธํ ์ฌ์ฉ์ ์ ํธํ๋ ์ฌ๋์ด ๋ง๋ค. ์์ ์ ๋ฌธ์ ์ ๋ง๋ ๊ฐ์ฒด(ํํ, ์ขํ, ๊ตฌ๊ฐ ๋ฑ)๋ก ๋ฐ๊พธ์. ํนํ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ ์ฝ๋์์ ๋ง์ด ์ผ์ด๋๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ๊ธฐ๋ณธํ์ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๊ธฐ
- ์๋ฏธ์๋ ์๋ฃํ์ผ๋ก ๊ตฌ์ฑํ๋ค.
- ํ์
์ฝ๋๋ฅผ ์๋ธํด๋์ค๋ก ๋ฐ๊พธ๊ธฐ, ์กฐ๊ฑด๋ถ ๋ก์ง์ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ๊ธฐ๋ณธํ ์ฝ๋๊ฐ ์กฐ๊ฑด๋ถ ๋์์ ์ ์ดํ๋ ํ์ ์ฝ๋๋ผ๋ฉด ์๋ธ ํด๋์ค๋ก ๋ฐ๊ฟ ๋คํ์ฑ์ผ๋ก ์กฐ๊ฑด๋ถ ๋ก์ง์ ์ ์ดํ๋ค.
- ํด๋์ค ์ถ์ถํ๊ธฐ, ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
- ๊ธฐ๋ณธํ ๋ฐ์ดํฐ ๋ญ์น๋ ์ถ์ถํ๋ค.
์ค๋ณต๋ switch ๋ฌธ์ด ๋ฌธ์ ๊ฐ ๋๋ ์ด์ ๋ ์กฐ๊ฑด์ ์ ์ถ๊ฐํ ๋ ๋ง๋ค, ๋๋จธ์ง switch ๋ฌธ๋ ์์ ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ค๋ณต๋ switch, if-else ๋ฌธ์ ์ง์คํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
ํ์ฌ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฐ๋ณต๋ฌธ์ ๋์ฒดํ๋ ํจ์๋ค์ด ์๊ฒจ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ง ์์๋ ๋๋ ์ํฉ์ด ๋ง๋ค. ์๋ฐ์ ๊ฒฝ์ฐ ์คํธ๋ฆผ, ์ฝํ๋ฆฐ์ ๊ฒฝ์ฐ ์ปฌ๋ ์ ํจ์ ๋ฑ
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ ํ ๋, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ์์๋ฅผ ์ด์ฉํ๋ ๊ฑธ ์ ํธํ๋ค. ๊ทธ๋ฌ๋ ์ธ์ด์์ ์ง์ํ๋ ์์๊ฐ ํ์ ์์ ๋๋ ์๋ค. ํจ์๊ฐ ํ๋ ์๋ ํด๋์ค ๋ฑ ๋น์ฝํ ์์ ๊ฐ์ ๊ฒฝ์ฐ ๋ฆฌํฉํฐ๋ง์ผ๋ก ์ญ์ ํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํจ์ ์ธ๋ผ์ธํ๊ธฐ, ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
- ๊ณ์ธต ํฉ์น๊ธฐ
- ์์์ ์ฌ์ฉํ ๊ฒฝ์ฐ
YAGNI์ ์ด๊ธ๋๋ ์ง๊ธ ๋น์ฅ ํ์์๋ ์ฝ๋๋ ๋ฐ๋ก ์ญ์ ํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ๊ณ์ธต ํฉ์น๊ธฐ
- ์ญํ ์ด ๊ฑฐ์ ์๋ ์ถ์ํด๋์ค๋ ์ญ์ ํ๋ค.
- ํจ์ ์ธ๋ผ์ธํ๊ธฐ, ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
- ์ธ๋ฐ์์ด ์์ํ๋ ์ฝ๋๋ ์ญ์ ํ๋ค.
- ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ
- ๋ณธ๋ฌธ์์ ์ฌ์ฉํ์ง ์๋ ๋งค๊ฐ๋ณ์, ํ๋ฒ๋ ์ฌ์ฉํ ์ ์๋ ๋งค๊ฐ ๋ณ์๋ ์ญ์ ํ๋ค.
- ์ฃฝ์ ์ฝ๋ ์ ๊ฑฐํ๊ธฐ
- ํ ์คํธ์์๋ ์ฌ์ฉํ๋ ์ฝ๋๋ ํ ์คํธ ์ผ์ด์ค์ ํจ๊ป ์ญ์ ํ๋ค.
๊ฐ๋ ํน์ ์ํฉ์์ ๊ฐ์ด ํ ๋น๋๋ ํ๋๋ฅผ ๊ฐ์ง ํด๋์ค๊ฐ ์กด์ฌํ๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ๋, ๋น์ฐํ ๋ชจ๋ ํ๋๊ฐ ์ฑ์์ ธ ์์ ๊ฒ์ด๋ผ ์์ํ๋ค. ๋ฐ๋ผ์ ์์ ํ๋๋ฅผ ๊ฐ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ดํดํ๊ธฐ ์ด๋ ต๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํด๋์ค ์ถ์ถํ๊ธฐ, ํจ์ ์ฎ๊ธฐ๊ธฐ
- ์์ ํ๋๋ค์ด ์์ ๊ฒฝ์ฐ, ํด๋์ค๋ก ์ถ์ถํ๊ณ ํด๋น ํ๋๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ ์ ํด๋์ค๋ก ์ฎ๊ธด๋ค.
- ํน์ด ์ผ์ด์ค ์ถ๊ฐํ๊ธฐ
- ์์ ํ๋ ์ ํจ์ฑ ์กฐ๊ฑด๋ถ ๋ก์ง์ ๋์ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ ๊ฑฐํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํ ๊ฐ์ฒด๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฒญํ๋ ๊ณผ์ ์ ์ฐ์์ ์ผ๋ก ์งํํ ๋, ๊ธด ๋ฉ์ธ์ง ์ฒด์ธ์ด ์์ฑ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ฒด ๋ด๋น๊ฒ์ด์ ๊ตฌ์กฐ์ ์ข ์*๋จ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ๋ด๋น๊ฒ์ด์ ์ค๊ฐ ๋จ๊ณ๋ฅผ ์์ ํ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ฝ๋๋ฅผ ์์ ํด์ผํ๋ค.
[์์]
val managerName = aPerson.department.manager.name //์ด๋ค ์ฌ๋์ด ์ํด์๋ ๋ถ์์ ๋งค๋์ ์ด๋ฆ์ ๋ฐํ
๋งค๋์ ์ด๋ฆ์ ๋ฐํํ๋ ๊ฒํฐ ํจ์๋ ์ฌ๋, ๋ถ์, ๋งค๋์ ๋ฑ ์ด๋ ๊ณณ์์๋ ์ถ๊ฐํ ์ ์๋ค.
์ฆ ์ฒด์ธ์ ๊ตฌ์ฑํ๋ ๋ชจ๋ ๊ฐ์ฒด์ ์์ ์จ๊ธฐ๊ธฐ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
val managerName = aPerson.department.managerName //manager ์จ๊น
val managerName = aPerson.manager.name // department ์จ๊น
val managerName = aPerson.managerName //manager, department ์จ๊น
๊ฒฐ๊ตญ ์ฌ์ฉํ๋ ๊ฐ์ ๋งค๋์ ์ด๋ฆ์ด๋ฏ๋ก aPerson์ ์ ๋ฌ๋ฐ์ ๋งค๋์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
๊ฐ์ฒด ๋ด๋น๊ฒ์ด์ ๊ตฌ์กฐ์ ์ข ์
์ ์์์์ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์ฌ๋์ด ์ํ ๋ถ์์ ๋งค๋์ ์ด๋ฆ์ ์๊ณ ์ถ์ ๋, ๊ธด ๋ฉ์์ง ์ฒด์ธ์ ํตํด ์ ๊ทผํ๋ค. ์ด๋ aPerson, department, manager ์ค ํ๋๋ผ๋ ์ฝ๋๊ฐ ๋ฐ๋๋ค๋ฉด managerName์ ์ฌ์ฉํ๋ ค๋ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์ฝ๋๋ ์์ ๋ผ์ผ ํ๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๋ ๊ฐ์ฒด ๋ด๋น๊ฒ์ด์ ๊ตฌ์กฐ์ ์ข ์๋์๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ์์ ์จ๊ธฐ๊ธฐ
- ๋ฉ์์ง ์ฒด์ธ์ ๋ชจ๋ ๊ฐ์ฒด์ ์ ์ฉํ ์ ์์ง๋ง ์ค๊ฐ ๊ฐ์ฒด ๋ชจ๋ ์ค๊ฐ์*๊ฐ ๋๊ธฐ ์ฝ๋ค.
- ํจ์ ์ถ์ถํ๊ธฐ, ํจ์ ์ฎ๊ธฐ๊ธฐ
- ์ต์ข ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋นผ๋ธ ํ, ๋ฉ์ธ์ง ์ฒด์ธ์ ์จ๊ธธ ์ ์๋์ง ํ์ธํ๋ค.
์บก์ํํ๋ ๊ณผ์ ์์ ์์์ด ์์ฃผ ํ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ์์์ด ์ง๋์น๋ฉด ๋ฌธ์ ๊ฐ ๋๋ค. ์ด๋ค ํด๋์ค์ ๋ฉ์๋์ ์ ๋ฐ ์ด์์ด ๋ค๋ฅธ ํด๋์ค์ ์์ํ๋ค๋ฉด, ๊ทธ ํด๋์ค๋ ๊ป๋ฐ๊ธฐ์ผ ๋ฟ์ด๋ค. ์ฌ์ฅ ํด๋์ค์ ๋๋ถ๋ถ์ ์ผ์ ๋น์ ํด๋์ค๊ฐ ๋ด๋นํ๋ค๋ฉด ์ฌ์ฅ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋ก ๋น์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ์ค๊ฐ์ ์ ๊ฑฐํ๊ธฐ, (ํจ์ ์ธ๋ผ์ธ ํ๊ธฐ)
- ์ค์ ๋ก ์ผ์ ํ๋ ๊ฐ์ฒด์ ์ง์ ์ํตํ๊ฒ ํ๋ค.
- ์์ ๋ฉ์๋๋ฅผ ์ ๊ฑฐํ ํ ๋จ๋ ์ผ์ด ๊ฑฐ์ ์๋ค๋ฉด ํธ์ถํ๋ ์ชฝ์ผ๋ก ์ธ๋ผ์ธ ํ๋ค.
๊ฐ์ฒด์งํฅ์์๋ ์์ง๋๋ฅผ ๋ํ๊ณ , ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ค๊ณ ํ๋ค. ๊ฐ ๋ชจ๋๊ฐ์ ๊ฒฐํฉ์ด ์์ ์กด์ฌํ์ง ์์ ์๋ ์๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋๊ฐ์ ๊ฒฐํฉ์ ์ต๋ํ ์ค์ด๊ณ ํฌ๋ช ํ๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํจ์ ์ฎ๊ธฐ๊ธฐ, ํ๋ ์ฎ๊ธฐ๊ธฐ
- ๊ฒฐํฉ๋๊ฐ ๋์ ๋ชจ๋๋ค์ ์๋ก ๋ผ์ด๋์์ผ ํ๋ค.
- ์์ ์จ๊ธฐ๊ธฐ
- ์ฌ๋ฌ ๋ชจ๋์ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋์ ๋ง๋ค๊ฑฐ๋ ์์ ์จ๊ธฐ๊ธฐ๋ก ๋ค๋ฅธ ๋ชจ๋์ด ์ค๊ฐ์ ์ญํ ์ ํ๊ฒ ๋ง๋ ๋ค.
- ์๋ธ ํด๋์ค๋ฅผ ์์์ผ๋ก ๋ฐ๊พธ๊ธฐ, ์ํผํด๋์ค๋ฅผ ์์์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ์์ ๊ตฌ์กฐ์์๋ ๋ถ๋ชจ ์์๊ฐ์ ๊ฒฐํฉ์ด ์๊ธธ ๋ ์ฌ์ฉํ๋ค.
ํ๋์ ํด๋์ค์ ๊ธฐ๋ฅ์ด ์ง์ค๋๋ฉด ํ๋ ์๊ฐ ์๋นํ ๋์ด๋๋ค. ํ๋๊ฐ ๋ง์ผ๋ฉด ์ค๋ณต ์ฝ๋๊ฐ ์๊ธฐ๊ธฐ ์ฝ๋ค. ๋ํ ์ฝ๋๋์ด ๋๋ฌด ๋ง์ ํด๋์ค๋ ์ค๋ณต ์ฝ๋์ ํผ๋์ ์ผ๊ธฐํ ์ฌ์ง๊ฐ ๋ง๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํด๋์ค ์ถ์ถํ๊ธฐ, ์ํผํด๋์ค ์ถ์ถํ๊ธฐ, ํ์
์ฝ๋๋ฅผ ์๋ธํด๋์ค๋ก ๋ฐ๊พธ๊ธฐ
- ๋ณดํต ํ ํด๋์ค ์์์ ์ ๋์ด, ์ ๋ฏธ์ด๊ฐ ๊ฐ์ ํ๋๋ค์ ์ถ์ถํ๋ค.
- ๋ถ๋ฆฌํ ์ปดํฌ๋ํธ๋ฅผ ์ํผํด๋์ค, ์๋ธํด๋์ค๋ก ์ ์ฉํ ์๋ ์๋ค.
- ํด๋ผ์ด์ธํธ๋ค์ด ๊ฑฐ๋ํ ํด๋์ค๋ฅผ ์ด์ฉํ๋ ํจํด์ ํ์ ํ์ฌ ๊ธฐ๋ฅ๋ณ๋ก ํด๋์ค๋ฅผ ์ชผ๊ฐค ์ ์๋ค.
์์ ๋ก์ด ํด๋์ค ๊ต์ฒด๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ํฐ ์ฅ์ ์ด๋ค. ๋จ, ๊ต์ฒดํ ํด๋์ค๋ค์ ์ธํฐํ์ด์ค๊ฐ ๊ฐ์์ผ ํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ, ํจ์ ์ฎ๊ธฐ๊ธฐ
- ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋์ผํ๊ฒ ๋ฐ๊พผ๋ค.
- ํจ์ ์ฎ๊ธฐ๊ธฐ๋ก ์ธํฐํ์ด์ค๊ฐ ๊ฐ์์ง ๋๊น์ง ๋ฉ์๋๋ค์ ํด๋์ค ์์ผ๋ก ๋ฃ๋๋ค.
- ์ํผํด๋์ค ์ถ์ถํ๊ธฐ
- ๋์ ํด๋์ค๋ค ์ฌ์ด์ ์ค๋ณต ์ฝ๋๊ฐ ์๊ธฐ๋ฉด ์ํผํด๋์ค๋ก ์ถ์ถํ ์ ์๋ค.
๋ฐ์ดํฐ ํ๋์ ๊ฒํฐ ์ธํฐ๋ก ์ด๋ค์ง ํด๋์ค์ด๋ค. ๋ฐ์ดํฐ ์ ์ฅ์ฉ๋(์ฃผ๋ก DTO)๋ก ์ฌ์ฉ๋๋ค ๋ณด๋ ๋ค๋ฅธ ํด๋์ค์์ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ํจ๋ถ๋ก ๋ค๋ฃฌ๋ค. ๋ฐ๋ผ์ ์ ์ ํ ์บก์ํ๊ฐ ํ์ํ๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ๋ ์ฝ๋ ์บก์ํ ํ๊ธฐ
- public ํ๋๋ฅผ ์บก์ํ ํ๋ค.
- ์ธํฐ ์ ๊ฑฐํ๊ธฐ
- ๋ถ๋ณ ํ๋๋ ์ธํฐ๋ฅผ ์ ๊ฑฐํ๋ค. ๊ทธ๋ฌ๋ ์ฝํ๋ฆฐ์์๋ val์ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ํจ์ ์ฎ๊ธฐ๊ธฐ, ํจ์ ์ถ์ถํ๊ธฐ
- ๊ฒํฐ ์ธํฐ๋ฅผ ์ง์ ์ฌ์ฉํ๋ ํด๋์ค์ ๋ฉ์๋๋ ๋ฐ์ดํฐ ํด๋์ค ์์ผ๋ก ์ฎ๊ฒจ์ง ์ ์๋ค. (์ฌ๊ฐํ์ ๋ฉด์ ์ ์ง์ ๊ตฌํ๋ ๊ฒ -> area๋ฅผ ๋ฐ๋ ๊ฒ)
- ๋ฉ์๋๋ฅผ ํต์งธ๋ก ์ฎ๊ธฐ๊ธฐ ์ด๋ ค์ฐ๋ฉด ์ผ๋ถ๋ถ๋ง ์ถ์ถํด์ ์ฎ๊ธธ ์ ์๋ค.
๋ถ๋ชจ์ ์ผ๋ถ๋ถ์ ๊ธฐ๋ฅ๋ง ์์ ํด๋์ค์์ ์ฌ์ฉํ๊ณ ์ถ์ ๋, ์์์ ํฌ๊ธฐํ๊ณ ์ถ๋ค. '์์ '์๋ ๋์ผ ๊ณ์ธต์ ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค๊ณ ํ์์๋ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์๋ก์ด ํด๋์ค๋ก ์ฎ๊ธด๋ค. ๋ณดํต์ ๊ฒฝ์ฐ, ์์์ ํฌ๊ธฐํ๋ ๋์ ์ด ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค. ๋ถ๋ชจ ๋์์ ํ์๋ก ํ์ง๋ง ๋ถ๋ชจ์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ฅด๊ณ ์ถ์ง ์์ ๋ ์์ ๋ฉ์ปค๋์ฆ์์ ๋ฒ์ด๋ ์ ์๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ๋ฉ์๋ ๋ด๋ฆฌ๊ธฐ, ํ๋ ๋ด๋ฆฌ๊ธฐ
- ๋ฐ๋ฅด์ง ์์ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ ํด๋์ค๋ก ์ฎ๊ธด๋ค.
- ์๋ธํด๋์ค๋ฅผ ์์์ผ๋ก ๋ฐ๊พธ๊ธฐ, ์ํผํด๋์ค๋ฅผ ์์์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ํด๋์ค ์์ฒด๋ฅผ ์์์ผ๋ก ๋ฐ๊ฟ ์์์์ ๋ฒ์ด๋ ์ ์๋ค.
์ฃผ์์ ๋ณดํต ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์์ ์ค๋ค. ํ์ง๋ง ๊ตฌ์กฐ๊ฐ ์ข์ง ์์ ๋ชจ๋ ์ค๋ช ์ ์ฃผ์์ผ๋ก ๋์ฐ๋ ค๊ณ ํ ์ ์๋ค. ์ด๋ ๊ตฌ์กฐ๋ง ๋ฐ๊พผ๋ค๋ฉด ์ฃผ์์ ์ง์ธ ์ ์๋ค.
๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ
- ํจ์ ์ถ์ถํ๊ธฐ
- ํน์ ์ฝ๋ ๋ธ๋ก์ด ํ๋ ์ผ์ ์ฃผ์์ ๋ฌ๊ณ ์ถ๋ค๋ฉด ์ถ์ถํ์ฌ ํจ์์ ๊ธฐ๋ฅ์ ๋ช ํํ๊ฒ ํ๋ค.
- ํจ์ ์ ์ธํ๊ธฐ
- ์์ ๋ฆฌํฉํฐ๋ง์ ๊ฑฐ์ณค์์๋ ์ฃผ์์ด ํ์ํ๋ค๋ฉด ํจ์ ์ด๋ฆ์ ๋ช ํํ๊ฒ ํ๋ค.
- ์ด์์
์ถ๊ฐํ๊ธฐ
- ์์คํ ์ด ๋์ํ๊ธฐ ์ํ ์ ํ ์กฐ๊ฑด์ด ํ์ํ๋ค๋ฉด ์ด์์ ์ ์ถ๊ฐํ๋ค.
- ์ผ๋ถ ์ผ์ด์ค๋ ์ฑํฐ 1 ์ค์ต์ ํตํด ๋ช ํํ๊ฒ ์ ์ ์์๋ค.
- ์ฑํฐ 6๋ถํฐ ์์ํ๋ ๋ฆฌํฉํฐ๋ง ๊ธฐ๋ฒ์ ์์ธํ ๋ด์ฉ์ ์์ง ์์ง ๋ชปํด ๊ฐ ์ํฉ๊ณผ ๊ธฐ๋ฒ ๋งค์นญ์ด ์์ง ์ดํด๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ๋ณด๊ธฐ ์ฝ๊ฒ ๋งํฌ๋ก ๊ด๋ฆฌํ๋ค.
- ๋ฆฌํฉํฐ๋ง ๋ฌธ์ ๋ฅผ ๋จผ์ ์ ์ํ๊ณ , ๊ทธ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ ๋ฆฌํ๋ค. ์ฆ ์ฑํฐ ์์์๋ ๋ณ๊ฐ๋ก ์ ๋ฆฌํ๋ค.
- ์ด๋ค ํจ์, ๋ณ์, ํด๋์ค๋ฅผ ์ถ์ถํ๊ณ ์์น๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ๋ง์ผ๋ก๋ ๋งค์ฐ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
ํจ์ ์ถ์ถํ๊ธฐ <---> ํจ์ ์ธ๋ผ์ธํ๊ธฐ
๋ฐฐ๊ฒฝ
๋ชฉ์ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ผ๋ก ์๊ฐ๋๋ค. ์ฝ๋๋ฅผ ๋ณด๊ณ ํ๋ ์ผ์ ํ์ ํ๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ฉด ํจ์๋ฅผ ์ถ์ถํ์ฌ ์๋ง์ ์ด๋ฆ์ ์ ํ๋ค. (์ด๋ฆ์ง๊ธฐ๊ฐ ์ ์ผ ์ด๋ ต๋ค..)
์ ์ฐจ
- ํจ์๋ฅผ ์๋ก ๋ง๋ค๊ณ
๋ชฉ์
์ ์ ๋ํ๋ด๋ ์ด๋ฆ ์ง๊ธฐ (how ๋ณด๋ค what์ ์ง์ค) - ์ถ์ถํ ์ฝ๋๋ฅผ ์๋ณธ ํจ์์์ ๋ณต์ฌํ์ฌ ์ ํจ์๋ก ์ด๋
- ์ถ์ถํ ์ฝ๋ ์ค ์ง์ญ๋ณ์ ์ฐธ์กฐ, ์ ํจ๋ฒ์๋ฅผ ์ฒดํฌํ๋ค. ์์ผ๋ฉด ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ
- ๋ณ์, ์ ํจ๋ฒ์๋ฅผ ์ฒ๋ฆฌํ ๋ค ์ปดํ์ผ
- ์๋ณธํจ์์์ ์ถ์ถํ ํจ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ก ๋ณ๊ฒฝ
- ํ ์คํธ
- ์ถ์ถํ ํจ์์ ๊ฐ๊ฑฐ๋ ๋น์ทํ ์ฝ๋๊ฐ ์๋์ง ์ฒดํฌ, ์๋ค๋ฉด ์ถ์ถ ํจ์๋ฅผ ํธ์ถํ๋๋ก ๋ฐ๊ฟ์ง ๊ฒํ
์์
์ ํจ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋ณ์๊ฐ ์์ ๋
// ์๋ณธ code
fun printOwing(invoice: Invoice) {
var outstanding = 0
println("**************")
println("***๊ณ ๊ฐ ์ฑ๋ฌด***")
println("**************")
// ๋ฏธํด๊ฒฐ ์ฑ๋ฌด(outstading)์ ๊ณ์ฐ
for(i in invoice.orders) {
outstanding += i.amout
}
// ๋ง๊ฐ์ผ(dueDate)์ ๊ธฐ๋ก
val today = Clock.today // ์์คํ
์๊ฐ์ ์ฌ์ฉํ์ง ์๊ณ ๋ณ๋์ wrapper๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ผ์ ํ๊ฒ ํ ์ ์๋ค.
invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
// ์ธ๋ถ ์ฌํญ ์ถ๋ ฅ
println("๊ณ ๊ฐ๋ช
: ${invoice.customer}")
println("์ฑ๋ฌด์ก: ${outstanding}")
println("๋ง๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")
}
// println ์ถ์ถ
fun printOwing(invoice: Invoice) {
var outstanding = 0
printBanner() // <-- ๋ฐฐ๋ ์ถ๋ ฅ ์ถ์ถ
// ๋ฏธํด๊ฒฐ ์ฑ๋ฌด(outstading)์ ๊ณ์ฐ
for(i in invoice.orders) {
outstanding += i.amout
}
// ๋ง๊ฐ์ผ(dueDate)์ ๊ธฐ๋ก
val today = Clock.today
invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
fun printDetails() { // <-- nested method๋ก ์ถ์ถํ์ฌ invoice์ ์ ๊ทผ ๊ฐ๋ฅ
println("๊ณ ๊ฐ๋ช
: ${invoice.customer}")
println("์ฑ๋ฌด์ก: ${outstanding}")
println("๋ง๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")
}
printDetails()
}
fun printBanner() {
println("**************")
println("***๊ณ ๊ฐ ์ฑ๋ฌด***")
println("**************")
}
์ง์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋
์ง์ญ ๋ณ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ๋, ๋งค๊ฐ๋ณ์๋ก ๊ทธ๋ฅ ๋๊ธฐ์.
// printDetail() ๋ฐ์ผ๋ก ์ถ์ถ
fun printOwing(invoice: Invoice) {
var outstanding = 0
printBanner()
// ๋ฏธํด๊ฒฐ ์ฑ๋ฌด(outstading)์ ๊ณ์ฐ
for(i in invoice.orders) {
outstanding += i.amout
}
// ๋ง๊ฐ์ผ(dueDate)์ ๊ธฐ๋ก
val today = Clock.today
invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
printDetails(invoice, outstanding)
}
fun(invoice: Invoice, outstanding: Int) { // <-- ์ง์ญ ๋ณ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์
println("๊ณ ๊ฐ๋ช
: ${invoice.customer}")
println("์ฑ๋ฌด์ก: ${outstanding}")
println("๋ง๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")
}
fun printBanner() {
println("**************")
println("***๊ณ ๊ฐ ์ฑ๋ฌด***")
println("**************")
}
// invoice date ํ ๋น ๋ก์ง๋ ์ถ์ถ
fun printOwing(invoice: Invoice) {
var outstanding = 0
printBanner()
// ๋ฏธํด๊ฒฐ ์ฑ๋ฌด(outstading)์ ๊ณ์ฐ
for(i in invoice.orders) {
outstanding += i.amout
}
recordDueDate(invoice) // <-- ๋ง๊ฐ์ผ ์ค์ ํจ์ ์ถ์ถ, invoice ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ
printDetails(invoice, outstanding)
}
fun recordDueDate(invoice: Invoice) {
val today = Clock.today
invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
}
fun(invoice: Invoice, outstanding: Int) { // <-- ์ง์ญ ๋ณ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์
println("๊ณ ๊ฐ๋ช
: ${invoice.customer}")
println("์ฑ๋ฌด์ก: ${outstanding}")
println("๋ง๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")
}
fun printBanner() {
println("**************")
println("***๊ณ ๊ฐ ์ฑ๋ฌด***")
println("**************")
}
์ง์ญ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ ๋
์ง์ญ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ค๋ฉด ๋ณ์ ์ชผ๊ฐ๊ธฐ๋ก ์์ ๋ณ์๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๋ณ์์ ๋์ ํ๋ค. ์์ ๋ณ์๋ ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ์ถ์ถ ํจ์์์์๋ง ์ฌ์ฉ๋จ
- ํจ์ ๋ฐ์์ ์ฌ์ฉ๋จ
// 1. ๋ณ์ ์ ์ธ์ ๋ก์ง๊ณผ ๊ฐ๊น์ด ๋ฐ๋ก ์ฎ๊น
fun printOwing(invoice: Invoice) {
printBanner()
// ๋ฏธํด๊ฒฐ ์ฑ๋ฌด(outstading)์ ๊ณ์ฐ
var outstanding = 0 // <-- ๋ก์ง ๊ทผ์ฒ๋ก ์ด๋
for(i in invoice.orders) {
outstanding += i.amout
}
recordDueDate(invoice)
printDetails(invoice, outstanding)
}
// 2. ์ถ์ถ ๋ถ๋ถ์ ์ ํจ์๋ก ๋ณต์ฌ
fun printOwing(invoice: Invoice) {
printBanner()
// ๋ฏธํด๊ฒฐ ์ฑ๋ฌด(outstading)์ ๊ณ์ฐ
var outstanding = 0
for(i in invoice.orders) {
outstanding += i.amout
}
recordDueDate(invoice)
printDetails(invoice, outstanding)
}
fun calculateOutstanding(invoice: Invoice): Int {
var outstanding = 0
for(i in invoice.orders) {
outstanding += i.amout
}
return ourstanding // <-- ์์ ๋ ๊ฐ ๋ฐํ
}
// 3. outstanding ์ ์ธ๊น์ง ํจ์๋ก ์ถ์ถํ์ฌ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ํ์ ์์
// 4. ์ปดํ์ผ
// 5. ์ถ์ถํ ์ฝ๋์ ๋ฐํ ๊ฐ์ ์๋ ๋ณ์์ ์ ์ฅ
// 6. ์ฝ๋ ๋ณ์๋ช
๋ฐ๊พธ๊ธฐ
fun printOwing(invoice: Invoice) {
printBanner()
// ๋ฏธํด๊ฒฐ ์ฑ๋ฌด(outstading)์ ๊ณ์ฐ
val outstanding = calculateOutstanding() // <-- 5. ๋ฐํ ๊ฐ ๋ถ๋ณ์ผ๋ก ์ ์ฅ
recordDueDate(invoice)
printDetails(invoice, outstanding)
}
fun calculateOutstanding(invoice: Invoice): Int {
var result = 0 // <-- 6. ๋ณ์๋ช
๋ฐ๊พธ๊ธฐ
for(i in invoice.orders) {
outstanding += i.amout
}
return result
}
๋ฐํํ ๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด?
- ๊ฐ๊ฐ์ ๋ณ์๋ฅผ ํ๋์ฉ ๋ฐํํ๋ ํจ์๋ค๋ก ์ชผ๊ฐ๊ธฐ ์ถ์ฒ
- ๋ ์ฝ๋๋ก ๋ฌถ์ด ๋ฐํํ ์๋ ์์ง๋ง, ์์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ ์ ์ฉ ํน์ ๋ณ์ ์ชผ๊ฐ๊ธฐ ์ ์ฉ
- ์๋ ํจ์์ ์ค์ฝํ ๋ฐ์ผ๋ก ์ถ์ถํด๋ณด๋ฉด ์ฝ๋๋ฅผ ์ ๋๋ก ์ถ์ถํ๋์ง ์ ์ ์๋ค.
ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ
๋ฐฐ๊ฒฝ
ํจ์๋ ๋ ๊ณ ๋ธ๋ญ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค. ํจ์๋ ์ํํธ์จ์ด ์์คํ ์ ๊ตฌ์ฑ์์๋ฅผ ์กฐ๋ฆฝํ๋ ์ฐ๊ฒฐ๋ถ์ด๋ค. ๋ฐ๋ผ์ ์ฐ๊ฒฐ๋ถ๊ฐ ์ ์ ์๋์ด ์๋ค๋ฉด ์๋ก์ด ๋ถ๋ถ์ ์ถ๊ฐํ๊ธฐ๊ฐ ์ฌ์์ง๋ค. ๋คํ์ด ์ํํธ์จ์ด๋ ๋ง๊ทธ๋๋ก ์ํํธํ๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋ถ๋ฅผ ์์ ํ ์ ์๋ค.
์ฐ๊ฒฐ๋ถ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ด๋ฆ์ด๋ค. ์ฝ๋ ๊ทธ ์์ฒด๋ก ํจ์์ ๋ชฉ์ ์ ์ค๋ช ํ ์ ์์ด ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ณ ์ฝ๋ ์ดํด๊ฐ ์ฌ์์ง๋ค.
์ด๋ฆ์ง๊ธฐ Tip: ์ฃผ์์ผ๋ก ํจ์์ ๋ชฉ์ ์ ์ค๋ช ํด๋ณด๋ฉด ์๋ง์ ์ด๋ฆ์ ์ฐพ์ ์ ์๋ค.
ํจ์์ ๋งค๊ฐ๋ณ์ ๋ํ ์ค์ํ๋ค. ๋งค๊ฐ๋ณ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ๋งฅ(์ํฉ)์ ์ค์ ํ๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋๋์ ๋ฐ๋ผ ํจ์ ํ์ฉ์ ๋ฒ์๋ ๋ฌ๋ผ์ง๋ค. ์ ์ ํ ๋งค๊ฐ๋ณ์ ์ ํ์ ๋ค๋ฅธ ๋ชจ๋๊ณผ์ ๊ฒฐํฉ์ ์ง์ธ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ ์ ํ ๋งค๊ฐ๋ณ์ ์ ํ์๋ ์ ๋ต์ด ์๊ณ ์์คํ ๊ตฌ์ฑ์ ๋ณํ, ์ฝ๋ ๋ก์ง์ ๋ํ ์ดํด์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ๋์ฒํด์ผํ๋ค.
์ ์ฐจ
๊ฐ๋จํ ์ ์ฐจ - ๋จ๋ฒ์ ์์
- ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ํจ์ ๋ณธ๋ฌธ์์ ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํ๋ค.
- ๋ฉ์๋ ์ ์ธ์ ๋ฐ๊พผ๋ค.
- ๊ธฐ์กด ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ๋ถ๋ถ์ ๋ชจ๋ ์ฐพ์ ๋ฐ๊พผ๋ค. (IDE ๊ธฐ๋ฅ ์ฌ์ฉ ์ถ์ฒ)
- ํ ์คํธ
์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ๋ชจ๋ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ๋ก ๋์ด๊ฐ๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ - ์ ์ง์ ์์
- ํจ์์ ๋ณธ๋ฌธ์ ์ ์ ํ ๋ฆฌํฉํฐ๋งํ๋ค. ํ์ง๋ง ์ ์ ํ๊ฐ ๊ฐ์ฅ ์ด๋ ต๋ค.
- ๋ณธ๋ฌธ์ ์๋ก์ด ํจ์๋ก ์ถ์ถํ๋ค.
- ์ถ์ถํ ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํด์ผํ๋ค๋ฉด
๊ฐ๋จํ ์ ์ฐจ
๋ฅผ ๋ฐ๋ผ ์ถ๊ฐํ๋ค. - ํ ์คํธ
- ๊ธฐ์กด ํจ์๋ฅผ ์ธ๋ผ์ธํ๋ค.
- ์ด๋ฆ์ ์์๋ก ๋ถ์ฌ๋์์ผ๋ฉด ์๋ ์ด๋ฆ์ผ๋ก ์์ ํ๋ค.
- ํ ์คํธ
์์
ํจ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ - ๊ฐ๋จํ ์ ์ฐจ
// ์๋ณธ code
fun circum(radius: Double): Double {
return 2 * Math.PI * radius
}
fun circumference(radius: Double): Double { // <-- ์ด๋ฆ ๋ณ๊ฒฝ
return 2 * Math.PI * radius
}
ํจ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ - ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ
fun circum(radius: Double): Double { // <-- ์๋ ํจ์๋ ๋๋๊ณ ๋ฆฌํฉํฐ๋งํ ํจ์๋ฅผ ๋ฆฌํดํ๋ค.
return circumference(radius)
}
fun circumference(radius: Double): Double {
return 2 * Math.PI * radius
}
ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ ๊ณต๊ฐ๋ API๋ฅผ ๋ฆฌํฉํฐ๋ง ํ๊ธฐ์ ์ข๋ค. ๊ธฐ์กด ํจ์์ ๊ป๋ฐ๊ธฐ๋ ์ด๋ ค๋๊ณ ๋ด๋ถ๋ง ๋ฐ๊ฟ ์ ์ฉ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ธฐ์กด ํจ์๋ deprecated๋ฅผ ๊ณ ์งํ๊ณ ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด ํจ์๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด ์ด์ ํจ์๋ ์ง์ธ ์ ์๋ค.(๊ฒ์ผ๋ฅธ ํด๋ผ์ด์ธํธ๋ก ์ธํด ์ง์ฐ์ง ๋ชป ํ ์๋ ์๋ค.)
๋งค๊ฐ๋ณ์ ์ถ๊ฐํ๊ธฐ - ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ
// ์๋ณธ code
fun addReservation(customer: Customer) {
this._reservations.add(customer)
}
์๊ตฌ์ฌํญ: ์ฐ์ ์์ ํ์ customer๋ฅผ ๋ฃ์ด์ผ ํ๋ค.
// 2. ์๋ก์ด ํจ์๋ก ์ถ์ถ
fun addReservation(customer: Customer) {
this.zz_addReservation(customer) // <-- ์์ ์ด๋ฆ
}
fun zz_addReservation(customer: Customer) {
this._resulvations.add(customer)
}
// 3. ๋งค๊ฐ๋ณ์ ์ถ๊ฐ
fun addReservation(customer: Customer) {
this.zz_addReservation(customer, false)
}
fun zz_addReservation(customer: Customer, isPriority: Boolean) {
this._resulvations.add(customer)
}
๋งค๊ฐ๋ณ์๋ฅผ ์์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ
//์๋ณธ code ๊ณ ๊ฐ์ด NewEngland ์ฃผ์ ์ด๊ณ ์๋์ง ํ๋จํ๋ ํจ์
fun inNewEngland(aCustomer: Customer): Boolean {
return listOf("MA", "CT", "ME", "VT", "NH", "RI").contains(aCustomer.address.state)
}
// 1. ๋ณ์ ์ถ์ถ
// 2. ํจ์ ์ถ์ถ
fun inNewEngland(aCustomer: Customer): Boolean {
val stateCode = aCustomer.address.state // <-- 1. ๋ณ์ ์ถ์ถ
return xxNewInNewEngland(stateCode)
}
fun xxNewInNewEngland(stateCode: String): Boolean { // <-- 2. ํจ์ ์ถ์ถ, ์์ ์ด๋ฆ, ๋งค๊ฐ๋ณ์ ๋ณ๊ฒฝ
return listOf("MA", "CT", "ME", "VT", "NH", "RI").contains(stateCode)
}
fun inNewEngland(aCustomer: Customer): Boolean {
return xxNewInNewEngland(aCustomer.address.state) // <-- ์ถ์ถํ ์์ ๋ณ์ ์ธ๋ผ์ธ
}
// ํจ์ ํธ์ถ๋ฌธ
val newEnglanders = somCustomers.filter{ c -> xxNewInNewEngland(c.address.state)} // <-- ํจ์ ์ธ๋ผ์ธ
val newEnglanders = somCustomers.filter{ c -> inNewEngland(c.address.state)} // <-- ํจ์ ์ด๋ฆ ๋ณ๊ฒฝ
fun inNewEngland(stateCode: String): Boolean { // <-- ํจ์ ์ด๋ฆ ๋ณ๊ฒฝ
return listOf("MA", "CT", "ME", "VT", "NH", "RI").contains(stateCode)
}
๋ณ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
๋ฐฐ๊ฒฝ
๋ณ์๋ช ์ ์ฒ์๋ถํฐ ์ ์ง์ผ๋ฉด ์ข๊ฒ ์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง์ ๊ฒ์ด๋ค. ๊ฒฐ๊ตญ ๋์ฑ ์ ์ ํ ๋ณ์๋ช ์ผ๋ก ๊ณ ์ณ์ผ ํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค. ํนํ ๊ฐ์ ๊ณ์ ์ฌ์ฉํ๋ ํ๋์ ๊ฒฝ์ฐ ๋์ฑ ์ ์คํ๊ฒ ์ด๋ฆ์ ์ง์ด์ผ ํ๋ค.
์ ์ฐจ
- ํญ๋๊ฒ ์ฐ์ด๋ ๋ณ์๋ ๋ณ์ ์บก์ํํ๊ธฐ๋ฅผ ๊ณ ๋ คํ๋ค.
- ์ด๋ฆ์ ๋ฐ๊ฟ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๊ณณ์ ๋ชจ๋ ์ฐพ์
ํ๋์ฉ
๋ณ๊ฒฝํ๋ค.- ๋ค๋ฅธ ์ฝ๋ ๋ฒ ์ด์ค์์๋ ์ฐธ์กฐํ๋ ๋ณ์๋ผ๋ฉด ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค.
- ํ ์คํธ
์์
ํจ์ ๋ฐ์์๋ ์ฐธ์กฐ ๊ฐ๋ฅํ ๋ณ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ์์ (์ด ์ธ์๋ ๋๋ฌด ๊ฐ๋จํ๋ค.)
// ์๋ณธ code
var tpHd = "untitled"
// ๋ณ์๋ฅผ ์ฝ๊ธฐ๋งํ๋ ์ฝ๋
var result += "<h1>${tpHd}</h1>"
// ๋ณ์๋ฅผ ์์ ํ๋ ์ฝ๋
tpHd = "anotherString"
// 1. ๋ณ์ ์บก์ํ ํ๊ธฐ
fun title(): String = tpHd
fun setTitle(arg: String) {
tpHd = arg
}
setTitle("anotherString")
result += "<h1>${title()}</h1>"
// ๋ณ์๋ช
์์
var _title = "untitled" // <-- ๋ณ์๋ช
์์
fun title(): String = _title // <-- ์์ ๋ ๋ณ์๋ช
์ ์ฉ
fun setTitle(arg: String) {
_title = arg // <-- ์์ ๋ ๋ณ์๋ช
์ ์ฉ
}
์์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ
๋ฐฐ๊ฒฝ
์ด๋ค ํจ์๋ฅผ ํตํด ์ป์ ๊ฒฐ๊ด๊ฐ์ ๋ค์ ์ฐธ์กฐํ๊ธฐ ์ํด ์์ ๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ฐ๋ณต๋๋ ๊ฒ์ ์ค์ผ ์ ์๊ณ , ๋ณ์ ์ด๋ฆ์ผ๋ก ์ฝ๋ ์ดํด๊ฐ ์ฌ์์ง๊ธฐ๋ ํ๋ค. ๊ทธ๋ฌ๋ ์์ ๋ณ์๋ณด๋ค๋ ํจ์๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ ๋๊ฐ ๋ง๋ค.
์ ์ฐจ
- ๋ณ์๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์ ๊ฐ์ด ํ์คํ ๊ฒฐ์ ๋๋์ง, ๋ณ์๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ๋งค๋ฒ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ง ์๋์ง ํ์ธํ๋ค.
- ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ ๋ณ์๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ ๋ค.
- ํ ์คํธ
- ๋ณ์ ๋์
๋ฌธ์ ํจ์๋ก ์ถ์ถํ๋ค.
- ๋ณ์์ ํจ์๊ฐ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ ์์ผ๋ฉด ์ผ๋จ ์์ ์ด๋ฆ์ ์ง๋๋ค.
- ์ถ์ถํ ํจ์๊ฐ ๋ค๋ฅธ ๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค๋์ง ํ์ธํ๋ค.
- ๋ถ์ํจ๊ณผ๊ฐ ์๋ค๋ฉด ์ง์ ํจ์์ ๋ณ๊ฒฝ ํจ์ ๋ถ๋ฆฌํ๊ธฐ๋ก ๋์ฒํ๋ค.
- ํ ์คํธ
- ๋ณ์ ์ธ๋ผ์ธํ๊ธฐ๋ก ์์ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ค.
์์
class Order(quantity: Int, item: Item) {
fun getPrice(): Double {
var basePrice = quantity * item.price // ์์ ๋ณ์
var discountFactor = 0.98D // ์์ ๋ณ์
if(basePrice > 1000) discountFactor -= 0.03
return basePrice * discountFactor
}
}
class Order(quantity: Int, item: Item) {
fun getPrice(): Double {
val basePrice = quantity * item.price // ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ฐ๊พผ ๋ค ํ
์คํธ, ๋ง์ฝ ์ด ๋ณ์๋ฅผ ๋ฐ๊พธ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ
var discountFactor = 0.98D
if(basePrice > 1000) discountFactor -= 0.03
return basePrice * discountFactor
}
}
class Order(quantity: Int, item: Item) {
fun getPrice(): Double {
val basePrice = getBasePrice() // <-- ์ถ์ถํ ํจ์ ๋์
var discountFactor = 0.98D
if(basePrice > 1000) discountFactor -= 0.03
return basePrice * discountFactor
}
fun getBasePrice(): Int { // ํจ์๋ก ์ถ์ถ
return quantity * item.price
}
}
class Order(quantity: Int, item: Item) {
fun getPrice(): Double {
//val basePrice = getBasePrice() basePrice๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ์ getBasePrice()๋ก ๋์ฒด
//if(getBasePrice() > 1000) discountFactor -= 0.03
return getBasePrice() * getDiscountFactor() // discountFactor๋ฅผ ํจ์๋ก ๋์ฒด
}
fun getBasePrice(): Int {
return quantity * item.price
}
fun getDiscountFactor() { // ํจ์๋ก ์ถ์ถ
var discountFactor = 0.98D
if(getBasePrice() > 1000) discountFactor -= 0.03
return getBasePrice() * discountFactor
}
}
๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ
๋ฐฐ๊ฒฝ
๊ด๋ จ๋ ์ฝ๋๋ค์ ์๋ก ๊ฐ๊น์ด์ ๋๋ฉด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์์ํ๋ค. ๋ฌธ์ฅ ์ฌ๋ผ์ด๋๋ฅผ ํตํด ๊ด๋ จ๋ ์ฝ๋๋ฅผ ๋ชจ์๋ ์ ์๋ค. ๋ฌธ์ฅ ์ฌ๋ผ์ด๋ํ๊ธฐ๋ ๋ณดํต ํจ์ ์ถ์ถํ๊ธฐ์ ์์ ์ ํ๋๋ค
์ ์ฐจ
- ์ฝ๋ ์กฐ๊ฐ์ ์ฎ๊ธธ ๋ชฉํ ์์น๋ฅผ ์ฒดํฌํ๋ค. ๋ค์ ์ํฉ์ด๋ผ๋ฉด ์ด ๋ฆฌํฉํฐ๋ง์ ํ ์ ์๋ค.
- ์ฎ๊ธธ ์ฝ๋์์ ์ฐธ์กฐํ๋ ์์๋ฅผ ์ ์ธํ๋ ๋ฌธ์ฅ ์์ผ๋ก ์ด๋ ๋ถ๊ฐ
- ์ฎ๊ธธ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๋ ์์์ ๋ค๋ก ์ด๋ ๋ถ๊ฐ
- ์ฎ๊ธธ ์ฝ๋์์ ์ฐธ์กฐํ๋ ์์๋ฅผ ์์ ํ๋ ๋ฌธ์ฅ ๊ฑด๋ ๋ฐ๊ธฐ ๋ถ๊ฐ
- ์ฎ๊ธธ ์ฝ๋๊ฐ ์์ ํ๋ ์์๋ฅผ ์ฐธ์กฐํ๋ ์์๋ฅผ ๊ฑด๋ ๋ฐ๊ธฐ ๋ถ๊ฐ
- ์ฝ๋ ์กฐ๊ฐ์ ์๋ผ ๋ชฉํ ์์น๋ก ์ฎ๊ธด๋ค.
- ํ ์คํธ
์์
์ฝ๋๋ฅผ ์ฌ๋ผ์ด๋ ์ํค๋ ค๋ฉด ๋ฌด์์ ์ฌ๋ผ์ด๋ํ ์ง, ์ฌ๋ผ์ด๋๊ฐ ๊ฐ๋ฅํ์ง ์ฒดํฌํ๋ค. ์ฌ๋ผ์ด๋ํ ์ฝ๋ ์์ฒด์ ๊ทธ ์ฝ๋๊ฐ ๊ฑด๋ ๋ฐ์ด์ผํ ์ฝ๋ ๋ชจ๋ ์ดํด์ผํ๋ค. ์ฝ๋์ ์์๊ฐ ๋ฐ๋๋ฉด ๋์์ด ๋ฌ๋ผ์ง๋์ง ์ฒดํฌํ๋ค.
val pricingPlan = retrievePricingPlan()
val order = retreiveOrder() // <-- order๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ val units = .. ์๋ก ์ด๋
val baseCharge = pricingPlan.base
var charge = 0
val chargePerUnit = pricingPlan.unit
val units = order.units
var discount = 0 // <-- discount๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ discount = .. ์๋ก ์ด๋
charge = baseCharge + units * chargePerUnit
var discountableUnits = Math.max(units - pricingPlan.discountThreshold, 0)
discount = discountable * pricingPlan.discountFactor
if(order.isRepeat) discount += 20
charge = charge - discount
chargeOrder(charge)
order์ ํ ๋นํ๋ retreiveOrder() ์ฝ๋ ๋ด๋ถ๋ ์ดํด๋ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ์ง์ ํจ์๋ฅผ ์ ๋ง๋ค์ด ๋จ๋ค๋ฉด ๋๋ถ๋ถ ์ฝ๋ ์ด๋์ด ๊ฐ๋ฅํ๋ค.
ํญ์ ํ ์คํธ๋ฅผ ํตํด ๋ฆฌํฉํฐ๋ง์ด ๊ฐ๋ฅํ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ณด์์ผ ํ๋ค. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋์ง ์๋ค๋ฉด ๋์ฑ ์ ์คํ ๋ฆฌํฉํฐ๋งํ๋ค. ํ ์คํธ๋ฅผ ์คํจํ๋ค๋ฉด ๋ ์๊ฒ ์ฌ๋ผ์ด๋ ํด๋ณด๊ฑฐ๋ ๋ ์ํํ ๋ถ๋ถ๊น์ง ์ฌ๋ผ์ด๋ ํด๋ณธ๋ค.
์์: ์กฐ๊ฑด๋ฌธ์ด ์์ ๋ ์ฌ๋ผ์ด๋
์กฐ๊ฑด๋ฌธ ๋ฐ์ผ๋ก ์ฌ๋ผ์ด๋ํ๋ฉด ์ค๋ณต ๋ก์ง์ด ์ ๊ฑฐ๋ ๊ฒ์ด๊ณ ์กฐ๊ฑด๋ฌธ ์์ผ๋ก ์ฌ๋ผ์ด๋ํ๋ฉด ๋ก์ง์ด ์ค๋ณต๋ ๊ฒ์ด๋ค.
var result = null
if(availableResources.length == 0) {
result = createResource()
allocatedResouces.push(result!!) // ์ค๋ณต๋ก์ง
} else {
result = availableResources.pop()
allocatedResources.push(result!!) // ์ค๋ณต๋ก์ง
}
return result
var result = null
if(availableResources.length == 0) {
result = createResource()
} else {
result = availableResources.pop()
}
allocatedResources.push(result!!) // ์กฐ๊ฑด๋ฌธ ๋ฐ์ผ๋ก ์ฌ๋ผ์ด๋ํ์ฌ ์ค๋ณต๋ก์ง์ด ํฉ์ณ์ง
return result
ํ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
๋ฐฐ๊ฒฝ
ํ๋ก๊ทธ๋จ ๊ณณ๊ณณ์ ์ฐ์ด๋ ๋ ์ฝ๋ ๊ตฌ์กฐ์ฒด์ ํ๋ ์ด๋ฆ์ ๋งค์ฐ ์ค์ํ๋ค. ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ฝ๋๋ฅผ ์ดํดํ๋๋ฐ ํต์ฌ ์ญํ ์ ํ๋ค. ๋ฐ๋ผ์ ๋ ์ฝ๋์ ํ๋ ์ด๋ฆ์ ๋์ฑ ์๋ง๊ฒ ๋ฐ๊ฟ์ผ ํ๋ค. ๋ํ ํด๋์ค์์ ๊ฒํฐ ์ธํฐ์ ์ด๋ฆ์ ํ๋์ ๋ค๋ฅผ๋ฐ ์๋ค. ๊ฒํฐ ์ธํฐ์ ์ด๋ฆ๋ ํ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ํ๋ค.
์ ์ฐจ
- ๋ ์ฝ๋์ ์ ํจ ๋ฒ์๊ฐ ์ ํ์ ์ด๋ผ๋ฉด ํ๋์ ์ ๊ทผํ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์์ ํ ํ ์คํธํ๋ค. ๋ค์ ์ ์ฐจ๋ ํ์ ์๋ค.
- ๋ ์ฝ๋๊ฐ ์บก์ํ ๋์ด ์์ง ์๋ค๋ฉด ์บก์ํํ๋ค.
- ์บก์ํ๋ ๊ฐ์ฒด ๋ด๋ถ์ private ํ๋๋ช ์ ๋ฐ๊พธ๊ณ ๊ทธ์ ๋ง๊ฒ ๋ด๋ถ ๋ฉ์๋ ๋ณ๊ฒฝํ๋ค.
- ํ ์คํธ
- ์์ฑ์์ ๋งค๊ฐ๋ณ์์ ํ๋๊ฐ ๊ฒน์น๋ฉด ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ก ๋ณ๊ฒฝํ๋ค.
- ์ ๊ทผ์๋ค์ ์ด๋ฆ๋ ๋ณ๊ฒฝํ๋ค.
์์
์๋ฐ์คํฌ๋ฆฝํธ์ ์ต๋ช ๊ฐ์ฒด๋ฅผ ์ฝํ๋ฆฐ์ผ๋ก ํํํ๊ธฐ ์ด๋ ต๋ค. dynamic์ด ์์ง๋ง jvm์ ์ํ ํ์ ์ด ์๋๋ค. ๋ฐ๋ผ์ data class๋ถํฐ ์์ํ๋ค.
//์๋ณธ ์ฝ๋ js
const organization = {name: "์ ํฌ๋ฏธ ๊ตฌ์ค๋ฒ ๋ฆฌ", country: "GB"};
data class Organization(val data: Person) {
var _name: String = data.name
// ์๋ฐ๋ก ๋ฐ๋๋ฉด
@NotNull
private final String _name;
@NotNull
private final String _country;
@NotNull
public final String get_name() {
return this._name;
}
@NotNull
public final String get_country() {
return this._country;
}
// ์๋ฐ ๋
var _country: String = data.country
}
//ํ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
data class Organization(val data: Person) {
private var _title: String = data.name // <-- ํ๋ ์ด๋ฆ ๋ณ๊ฒฝ
private var _country: String = data.country
}
kotlin์ ํ์ ์ธ์ด์ด๋ฏ๋ก ํ๋ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ฉด ์ด๋ฏธ ์ปดํ์ผ ํ์์ ์๋ฌ๊ฐ ์๊ธด๋ค. ๋ฐ๋ผ์ js ๋ณด๋ค ํจ์ฌ ํด๋จผ์๋ฌ๋ฅผ ์ค์ผ ์ ์๋ค.
๋ฉ์๋ ์ฌ๋ฆฌ๊ธฐ <---> ๋ฉ์๋ ๋ด๋ฆฌ๊ธฐ
๋ฐฐ๊ฒฝ
์ค๋ณต์ฝ๋๋ ํ์ชฝ์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ํ์ชฝ์๋ ๋ฐ์๋์ง ์์ ์ ์๋ ์ํฉ์ ๋ง๋ค ์ ์๋ค. ํ์ง๋ง ์ค๋ณต์ฝ๋๋ฅผ ์ฐพ๊ธฐ๋ ์ฝ์ง ์๋ค.
๋ฉ์๋ ์ฌ๋ฆฌ๊ธฐ๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์ ํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ ๋๊ฐ ๋ง๋ค. ๋ค๋ฅธ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋งค๊ฐ๋ณ์ํ ํ๋ฉด ๊ฐ์ ๋ฉ์๋๊ฐ ๋๊ธฐ๋ ํ๋ค. ๊ทธ ํ ๋ฉ์๋๋ฅผ ์์ ๊ณ์ธต์ ์๋ก ์ฌ๋ฆฐ๋ค. ๋ฐ๋ฉด ๋ฉ์๋ ์ฌ๋ฆฌ๊ธฐ๋ฅผ ์ ์ฉํ๊ธฐ ๊ฐ์ฅ ๋ณต์กํ ์ํฉ์ ๋ฉ์๋ ๋ณธ๋ฌธ์์ ์๋ธํด๋์ค์ ํ๋๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์ด๋ค. ์ด๋ด ๋, ๋จผ์ ํ๋๋ฅผ ์ํผํด๋์ค๋ก ์ฌ๋ฆฌ๊ณ ๋ฉ์๋๋ฅผ ์ฌ๋ฆฐ๋ค.
์ ์ฐจ
- ๋๊ฐ์ด ๋์ํ๋ ๋ฉ์๋์ธ์ง ํ์ธ, ์ผ์ ๊ฐ์ง๋ง ์ฝ๋๊ฐ ๋ค๋ฅด๋ค๋ฉด ๊ฐ์์ง ๋๊น์ง ๋ฆฌํฉํฐ๋งํ๋ค.
- ๋ฉ์๋ ์์์ ํธ์ถํ๋ ๋ค๋ฅธ ๋ฉ์๋์ ์ฐธ์กฐํ๋ ํ๋๋ค์ ์ํผํด๋์ค์์๋ ํธ์ถ, ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ์ง ํ์ธํ๋ค.
- ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ก ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋์ผํ๊ฒ ๋ง๋ ๋ค.
- ์ํผํด๋์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ , ๋์ ๋ฉ์๋ ๋ณธ๋ฌธ์ ๋ฃ๋๋ค.
- ์ ์ ๊ฒ์ฌ ์ํ
- ์๋ธํด๋์ค ์ค ํ๋์ ๋ฉ์๋๋ฅผ ์ ๊ฑฐํ๋ค.
- ํ ์คํธ
- ๋ชจ๋ ์๋ธํด๋์ค์ 6, 7๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์์
class Employee : Party() {
val monthlyCost = 10
fun annualCost() : Int = monthlyCost * 12
}
class Department : Party() {
val monthlyCost = 20
fun totalAnnualCost() : Int = monthlyCost * 12
}
๋ ํด๋์ค์์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฐพ์๋ค. ๋ ๋ฉ์๋์ ์ด๋ฆ์ด ๋ค๋ฅด๋ฏ๋ก ํจ์ ์ ์ธ ๋ฐ๊พธ๊ธฐ๋ก ์ด๋ฆ์ ํต์ผํ๋ค.
์๋ธํด๋์ค ์ค ํ๋์ ์ด๋ฆ์ ๋ณต์ฌํด ์ํผํด๋์ค์ ๋ฃ๋๋ค. ์ด๋ ์ฝํ๋ฆฐ์ ์ ์ ์ธ์ด์ด๋ฏ๋ก ์ํผ ํด๋์ค๋ open ํค์๋๋ฅผ ๊ฐ๊ณ ์๊ณ , open function์ด ์๋๋ฉด ์ปดํ์ผ ์ ์๋ฌ๊ฐ ๋๋ค. ๋ฐ๋ผ์ ํ๋ฒ์ ์๋ธ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๋ค.
open class Party {
val monthlyCost = 10
fun annualCost(): Int = monthlyCost * 12 // <-- ์ํผํด๋์ค๋ก open ํค์๋ ์์ด ์ฌ๋ฆฌ๋ฉด ์๋ธํด๋์ค์์ override ๋ถ๊ฐ
}
class Employee : Party() {
val monthlyCost = 10
fun annualCost() : Int = monthlyCost * 12 // ๋ฐ๋ผ์ ์๋ฌ ๋ฐ์
}
class Department : Party() {
override val monthlyCost = 20
fun annualCost() : Int = monthlyCost * 12 // <-- ํจ์ ์ด๋ฆ ๋ง์ถ๊ธฐ
}