TDD, Clean Code Preview
TDD, Clean Code with Kotlin Preview
TDD, Clean Code with Kotlin ๊ธ์ ์ฐธ๊ณ ํ์ฌ ์์ฑํ ๊ธ์ ๋๋ค.
Start Kotlin
Kotlin Web Compiler Site
๋ณ์์ ์๋ฃํ
โ ๋ณ์์ ์ ์ธ
var: ์ผ๋ฐ์ ์ผ๋ก ํต์ฉ๋๋ ๋ณ์. ์ธ์ ๋ ์ง ์ฝ๊ธฐ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅval: ์ ์ธ์์๋ง ์ด๊ธฐํ ๊ฐ๋ฅ. ์ค๊ฐ์ ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ
๋ณ์์ ์ ์ธ ์์น์ ๋ฐ๋ฅธ ์ด๋ฆ
Property: ํด๋์ค์ ์ ์ธ๋ ๋ณ์Local Variable: ์ด์ธ์ Scope ๋ด์ ์ ์ธ๋ ๋ณ์
| ์ฝํ๋ฆฐ์ ๊ธฐ๋ณธ ๋ณ์์์ null์ ํ์ฉํ์ง ์๋๋ค.
๋ณ์์ ๊ฐ์ ํ ๋นํ์ง ์์์ฑ๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ปดํ์ผ ์๋ฌ
โ ์ฝํ๋ฆฐ์ ๊ธฐ๋ณธ ์๋ฃํ
์๋ฐ์์ ํธํ์ ์ํด ์๋ฐ์ ๊ฑฐ์ ๋์ผ
์ง์๋๋ ํน์๋ฌธ์

ํ๋ณํ๊ณผ ๋ฐฐ์ด
โ ํ๋ณํ
์ฝํ๋ฆฐ์ ํ๋ณํ ์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ง๊ธฐ ์ํด ์์์ ํ๋ณํ์ ๋ฏธ์ง์
โ ๋ฐฐ์ด
arrayOf,arrayOfNulls
ํ์
์ถ๋ก ๊ณผ ํจ์
โ ํ์ ์ถ๋ก
๋ณ์ ํจ์๋ค์ ์ ์ธํ ๋๋ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง ๋ ์๋ฃํ์ ์ฝ๋์ ๋ช ์ํ์ง ์์๋ ์๋์ผ๋ก ์๋ฃํ์ ์ถ๋ก
๋ฐ๋ ํน์ ํ ์๋ฃํ์ผ๋ก ์ง์ ํด์ผํ๋ ์ํฉ์ด ์๋๋ผ๋ฉด ๋๋ถ๋ถ์ ์ฝํ๋ฆฐ์ ํ์ ์ถ๋ก ๊ธฐ๋ฅ์ ์ด์ฉ
โ ํจ์
์ฝํ๋ฆฐ์์ ํจ์๋ ๋ด๋ถ์ ์ผ๋ก ๊ธฐ๋ฅ์ ๊ฐ์ง ํํ์ง๋ง, ์ธ๋ถ์์ ๋ณผ ๋๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ๋๋ค๋ ์ ์ธ์๋ ์๋ฃํ์ด ๊ฒฐ์ ๋ ๋ณ์๋ผ๋ ๊ฐ๋ ์ผ๋ก ์ ๊ทผ
์กฐ๊ฑด๋ฌธ๊ณผ ๋น๊ต์ฐ์ฐ์
โ ์กฐ๊ฑด๋ฌธ
if
when
๋ฑํธ๋ ๋ถ๋ฑํธ๋ ์ฌ์ฉ ๋ถ๊ฐ
โ ๋น๊ต์ฐ์ฐ์
๋ถ๋ฑํธ: <, โค, >, โฅ, โ
๋ฑํธ: ==
์๋ฃํ ํ์ธ: is, !is
ํธํ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๊ณ ํ๋ณํ๊น์ง ํ๋ฒ์ ์งํ
๋ฐ๋ณต๋ฌธ
๋ค๋ฅธ ์ธ์ด์์์ ๋ฐ๋ณต๋ฌธ๊ณผ๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค.
๋ ์ด๋ธ์ด ๋ฌ๋ฆฐ ๋ฐ๋ณต๋ฌธ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃ์์ผ์ฃผ๋ ๊ธฐ๋ฅ
๋ ์ด๋ธ ์ด๋ฆ๊ณผ @๊ธฐํธ๋ก ์ฆ์ ๋ฐ๋ณต๋ฌธ ์ข ๋ฃ
ํด๋์ค
์์
์ค๋ฒ๋ผ์ด๋ฉ
์ถ์ํ
์ถ์ ํด๋์ค: ์ถ์ ํจ์๋ฅผ ํฌํจํ๋ ํด๋์ค
์ธํฐํ์ด์ค: ์์ฑ, ์ถ์ํจ์, ์ผ๋ฐํจ์ ํฌํจ
๊ตฌํ๋ถ๊ฐ ์๋ ํจ์ โ open ํจ์๋ก ๊ฐ์ฃผ
๊ตฌํ๋ถ๊ฐ ์๋ ํจ์ โ abstract ํจ์๋ก ๊ฐ์ฃผ
โ ๏ธ ์ฌ๋ฌ๊ฐ์ ์ธํฐํ์ด์ค๋ ํด๋์ค์์ ๊ฐ์ ์ด๋ฆ๊ณผ ํํ๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ฉด,
์๋ธํด๋์ค์์๋ ํผ์ ์ด ์ผ์ด๋์ง ์๋๋ก ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ฌ๊ตฌํ ํ์
ํ๋ก์ ํธ ๊ตฌ์กฐ
Project๋ชจ๋ ๋ด์ฉ์ ๋ด๋ ํฐ ํ
Moduleํ๋์ ํ๋ก์ ํธ๋ ์ฌ๋ฌ๊ฐ์ ๋ชจ๋๋ก ์ด๋ฃจ์ด์ง ์ ์๋ค.
๋ชจ๋์ ์ง์ ๋ง๋ค ์๋ ์๊ณ , ํ์ํ ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ๊ตฌํํด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋์ ๊ฐ์ ธ์ ์ฌ์ฉ ๊ฐ๋ฅ
๋ชจ๋ ์์๋ ๋ค์์ ํด๋(kt, ๋ชจ๋ ๊ด๋ จ ์ค์ , ๋ฆฌ์์ค ํ์ผ ๋ฑ)์ ํ์ผ์ด ์กด์ฌ
Package์์ค ์ฝ๋์ ์์์ ์ง์ ํ๊ธฐ ์ํ ๋ ผ๋ฆฌ์ ๋จ์
์ผ๋ฐ์ ์ผ๋ก ํจํค์ง ์ด๋ฆ์ ์ง์ ๋ ํ์ฌ ๋๋ฉ์ธ์ ๊ฑฐ๊พธ๋ก ํด์ ํ๋ก์ ํธ๋ช ๊ณผ ์ธ๋ถ ๊ธฐ๋ฅ์ ๋ถ์ด๋ ๋ฐฉ์
com.youtube.aaron
com.youtube.aaron.base
com.youtube.aaron.kotlin
com.youtube.aaron.talk
์ฝํ๋ฆฐ์ ์๋ฐ์ ๋ฌ๋ฆฌ ํด๋ ๊ตฌ์กฐ์ ํจํค์ง ๋ช ์ ์ผ์น์ํค์ง ์์๋ ๋๋ค.
๋จ์ํ ํ์ผ ์๋จ์ ํจํค์ง๋ง ๋ช ์ํด ์ฃผ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ฒ๋ฆฌ
์ฝํ๋ฆฐ์ ํด๋์ค๋ช ๊ณผ ํ์ผ๋ช ์ด ์ผ์นํ์ง ์์๋ ๋๋ฉฐ,
ํ๋์ ํ์ผ์ ์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ฅผ ๋ฃ์ด๋ ์์์ ์ปดํ์ผ ๊ฐ๋ฅ
ํ์ผ์ด๋ ํด๋ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ง ์๊ณ ํ์ผ๋ด์ ์๋
packageํค์๋ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถ
์ค์ฝํ์ ์ ๊ทผ ์ ํ์
โ ์ค์ฝํ
ํจํค์ง ์์ ๋ณ์, ํจ์, ํด๋์ค๋ ๋ชจ๋ ํ๋์ ์ค์ฝํ์ ์๋ ๋ฉค๋ฒ
ํจ์, ํด๋์ค์์ ๋๋ค๋ฅธ ๋ณ์, ํจ์๊ฐ ์กด์ฌํ๋ค๋ฉด ํจํค์ง ์์ ๋๋ค๋ฅธ ํ์ ์ค์ฝํ๋ก ๋์

์ค์ฝํ์ ๋ํ ์ธ ๊ฐ์ง ๊ท์น
(1) ์ค์ฝํ ์ธ๋ถ์์๋ ์ค์ฝํ ๋ด๋ถ์ ๋ฉค๋ฒ๋ฅผ
์ฐธ์กฐ์ฐ์ฐ์๋ก๋ง ์ฐธ์กฐ ๊ฐ๋ฅ
(2) ๋์ผ ์ค์ฝํ ๋ด์์๋ ๋ฉค๋ฒ๋ค์
๊ณต์ํ ์ ์์(3) ํ์ ์ค์ฝํ์์๋ ์์ ์ค์ฝํ์ ๋ฉค๋ฒ๋ฅผ ์ฌ์ ์ ๊ฐ๋ฅ
โ ์ ๊ทผ ์ ํ์
๋ณ์, ํจ์, ํด๋์ค ์ ์ธ ์ ๋งจ ์์ ๋ถ์ฌ ์ฌ์ฉ
์ค์ฝํ ์ธ๋ถ์์ ์ค์ฝํ ๋ด๋ถ์ ์ ๊ทผํ ๋ ๊ทธ ๊ถํ์ ๊ฐ๋ฐ์๊ฐ ์ ์ดํ ์ ์๋ ๊ธฐ๋ฅ
public
internal
private
protected
Package Scope
internal
๊ฐ์ ๋ชจ๋ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
private
๊ฐ์ ํ์ผ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
protected
๋ฏธ์ฌ์ฉ
Class Scope
private
ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
protected
ํด๋์ค ์์ ๊ณผ ์์๋ฐ์ ํด๋์ค์์ ์ ๊ทผ ๊ฐ๋ฅ
internal
๋ฏธ์ฌ์ฉ
๊ณ ์ฐจํจ์์ ๋๋คํจ์
โ ๊ณ ์ฐจํจ์
ํจ์๋ฅผ ๋ง์น ํด๋์ค์์ ๋ง๋ค์ด๋ธ
์ธ์คํด์ค์ฒ๋ผ์ทจ๊ธํ๋ ๋ฐฉ๋ฒ
ํจ์๋ฅผ
ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ค ์๋ ์๊ณ ,๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํ๋ฐ์ ์๋ ์๋ ๋ฐฉ๋ฒ
์ฝํ๋ฆฐ์์๋ ๋ชจ๋ ํจ์๋ฅผ ๊ณ ์ฐจํจ์๋ก ์ฌ์ฉ ๊ฐ๋ฅ
::โ ์ผ๋ฐ ํจ์๋ฅผ ๊ณ ์ฐจ ํจ์๋ก ๋ณ๊ฒฝํด ์ฃผ๋ ์ฐ์ฐ์ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๊ฒฝ์ฐ ํ์ ์ ํจ์์
(ํ๋ผ๋ฏธํฐ ์๋ฃํ) -> ๋ฐํํ ์๋ฃํ
โ ๋๋คํจ์
๋๋คํจ์๋ ์ผ๋ฐํจ์์ ๋ฌ๋ฆฌ ๊ทธ ์์ฒด๊ฐ ๊ณ ์ฐจํจ์์ด๋ฏ๋ก ๋ณ๋์ ์ฐ์ฐ์ ์์ด ๋ณ์์ ๋ด์ ์ ์๋ค.
โน๏ธ ๊ณ ์ฐจํจ์์ ๋๋คํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์ผ์ข ์ ๋ณ์๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ํธ์์ฑ
์ปฌ๋ ์ ์กฐ์์ด๋ ์ค์ฝํ ํจ์์๋ ๋์
์ค์ฝํ ํจ์
ํจ์ํ ์ธ์ด์ ํน์ง์ ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๊ธฐ๋ณธ ์ ๊ณตํ๋ ํจ์๋ค
ํด๋์ค์์ ์์ฑํ ์ธ์คํด์ค๋ฅผ ์ค์ฝํ ํจ์์ ์ ๋ฌํ๋ฉด,
์ธ์คํด์ค์ ์์ฑ์ด๋ ํจ์๋ฅผ ์ข ๋ ๊น๋ํ๊ฒ ๋ถ๋ฌ ์ธ ์ ์๋ค.
๐ฆ apply
์ธ์คํด์ค ์์ฑ ํ ๋ณ์์ ๋ด๊ธฐ ์
์ด๊ธฐํ ๊ณผ์ ์ ์ํํ ๋ ์ฃผ๋ก ์ฌ์ฉ
apply์ scope ์์์ ์ง์ ์ธ์คํด์ค์ ์์ฑ๊ณผ ํจ์๋ฅผ ์ฐธ์กฐ์ฐ์ฐ์ ์์ด ์ฌ์ฉ ๊ฐ๋ฅ
๋ํ ์ธ์คํด์ค ์์ ์ ๋ค์ ๋ฐํํ๋ฏ๋ก ์์ฑ๋์๋ง์ ์กฐ์๋ ์ธ์คํด์ค๋ฅผ ๋ณ์์ ๋ฐ๋ก ์ด๊ธฐํ ๊ฐ๋ฅ
๐ฆ run
์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง ํ์
์ธ์คํด์ค์ ํจ์๋ ์์ฑ์ ์ค์ฝํ ๋ด์์ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ ์ ์ฉ
apply์ ๋์ผํ๊ฒ ์ค์ฝํ ์์์ ์ฐธ์กฐ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค๋ ์ ์ ๊ฐ์ง๋ง, ์ผ๋ฐ ๋๋คํจ์์ฒ๋ผ ์ธ์คํด์ค๋์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํ
๐ฆ with
run๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ง์ง๋ง, ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐ์ฐ์ฐ์ ๋์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค๋ ์ฐจ์ด
๐ฆ also
apply์ ์ ์ฌํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์ธ์คํด์ค๋ฅผ ๋ฐํํ์ง๋ง, ํ๋ผ๋ฏธํฐ๋ก ์ธ์คํด์ค๋ฅผ ๋๊ธด ๊ฒ๊ณผ ๊ฐ์ด
it์ ํตํด ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ ํจ์๊ฐ ์ค์ฝํ ๋ฐ๊นฅ์ ์ค๋ณต๋์ด ์๋ ๊ฒฝ์ฐ ํผ๋์ ๋ฐฉ์งํ๊ธฐ ์ํจ
๐ฆ let
run๊ณผ ์ ์ฌํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์ต์ข ๊ฐ์ ๋ฐํํ์ง๋ง, ํ๋ผ๋ฏธํฐ๋ก ์ธ์คํด์ค๋ฅผ ๋๊ธด ๊ฒ๊ณผ ๊ฐ์ด
it์ ํตํด ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ ํจ์๊ฐ ์ค์ฝํ ๋ฐ๊นฅ์ ์ค๋ณต๋์ด ์๋ ๊ฒฝ์ฐ ํผ๋์ ๋ฐฉ์งํ๊ธฐ ์ํจ
Object
๋จ ํ๋์ ๊ฐ์ฒด๋ง์ผ๋ก ๊ณตํต์ ์ธ ์์ฑ๊ณผ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
์์ฑ์ ์์ด๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑ
object๋ก ์ ์ธ๋ ๊ฐ์ฒด๋ ์ต์ด ์ฌ์ฉ ์ ์๋์ผ๋ก ์์ฑ๋๊ณ , ์ดํ์๋ ์ฝ๋ ์ ์ฒด์์ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
Companion Object
๊ธฐ์กด ํด๋์ค ์์ ์๋ ์ค๋ธ์ ํธ(static ๋ฉค๋ฒ์ ์ ์ฌ)
์ต๋ช
๊ฐ์ฒด์ ์ต์ ๋ฒ ํจํด
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค
์ฆ๊ฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ง๋๋ ํจํด
์ด๋ฒคํธ๋ฅผ ์์ ํ๋ ํด๋์ค์ ์ด๋ฒคํธ์ ๋ฐ์ ๋ฐ ์ ๋ฌ์ ๋ด๋นํ๋ ํด๋์ค์ ํต์ ์ ์ํด ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค๋ฅผ Observer, ์ฝํ๋ฆฐ์์๋ listener ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ฒคํธ๋ฅผ ๋๊ฒจ์ฃผ๋ ํ์๋
callback
์ต๋ช ํด๋์ค ํ์ฉ
object์ ํํ๋ ๋น์ทํ์ง๋ง ์ด๋ฆ์ด ์๋ค๋ ์ฐจ์ด
ํด๋์ค์ ๋คํ์ฑ
Up-casting: ์์ ์๋ฃํ์ธ ์ํผํด๋์ค๋ฅผ ๋ณํ
Down-casting: Up-casting๋ ์ธ์คํด์ค๋ฅผ ๋ค์ ํ์ ์๋ฃํ์ผ๋ก ๋ณํ
as: ๋ณ์๋ฅผ ํธํ๋๋ ์๋ฃํ์ผ๋ก ๋ณํํด์ฃผ๋ ์บ์คํ ์ฐ์ฐ์๋ฐํ๊ฐ๋ฟ๋ง ์๋๋ผ ๋ณ์ ์์ฒด๋ ๋ค์ด์บ์คํ
is: ๋ณ์๊ฐ ์๋ฃํ์ ํธํ๋๋์ง ์ฒดํฌํ ํ ๋ณํํด์ฃผ๋ ์บ์คํ ์ฐ์ฐ์ (์กฐ๊ฑด๋ฌธ ๋ด์์ ์ฌ์ฉ)
Example
์ ๋๋ฆญ
ํด๋์ค๋ ํจ์์์ ์ฌ์ฉํ๋ ์๋ฃํ์ ์ธ๋ถ์์ ์ง์ ํ ์ ์๋ ๊ธฐ๋ฅ
ํจ์๋ ํด๋์ค๋ฅผ ์ ์ธํ ๋ ๊ณ ์ ์ ์ธ ์๋ฃํ ๋์ ์ค์ ์๋ฃํ์ผ๋ก ๋์ฒด๋๋ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ฌ์ฉ
์ ๋ค๋ฆญ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋ฃํ์ ๋์ฒดํ๊ฒ ๋์ด ์บ์คํ ์ ๋ฐฉ์งํ ์ ์๊ณ , ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค.
ํด๋์ค์ ์ ์ฉ
ํจ์์ ์ ์ฉ
๋ฆฌ์คํธ
์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ์์๋ก ๋ฃ์ด ๊ด๋ฆฌ
๋ฆฌ์คํธ์๋ ๋ ๊ฐ์ง์ ์ข ๋ฃ๊ฐ ์กด์ฌ
List<out T>
์์ฑ ์ ๋ฃ์ ๊ฐ์ฒด๋ฅผ ๋์ฒด/์ถ๊ฐ/์ญ์ ๋ถ๊ฐ
์ ์ฉ ํจ์: listOf(1, 2, 3)
MutableList<T>
์์ฑ ์ ๋ฃ์ ๊ฐ์ฒด๋ฅผ ๋์ฒด/์ถ๊ฐ/์ญ์ ๊ฐ๋ฅ
์ ์ฉ ํจ์: mutableListOf(1, 2, 3)
์์ ์ถ๊ฐ(add), ์ญ์ (remove, removeAt) ๊ธฐ๋ฅ ์ธ์๋
๋ฌด์์ ์๊ธฐ(shuffle), ์ ๋ ฌ(sort) ๊ธฐ๋ฅ๋ ์ ๊ณต
๋ฌธ์์ด ๋ค๋ฃจ๊ธฐ
๋ฌธ์์ด ๋ณํ
๋ฌธ์์ด ํ์ธ
๋ฌธ์์ด ํ์
Null ์ฒ๋ฆฌ์ ๋์ผ์ฑํ์ธ
Null ์ฒ๋ฆฌ
null์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ค
?. : null safe operator
์ฐธ์กฐ์ฐ์ฐ์ ์คํ ์ ๋จผ์ ๊ฐ์ฒด๊ฐ null์ธ์ง ํ์ธํ๊ณ , ๊ฐ์ฒด null ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค์ ์ค๋ ๊ตฌ๋ฌธ ์คํ ์ฌ๋ถ ํ๋จ
sample?.toUpperCase()
?: : elvis operator
๊ฐ์ฒด๊ฐ null์ด ์๋๋ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ์ง๋ง, null์ด๋ผ๋ฉด ์ฐ์ฐ์ ์ฐ์ธก ๊ฐ์ฒด๋ก ๋์ฒด
sample?:โdefaultโ
!!. : non-null assertion operator
์ฐธ์กฐ์ฐ์ฐ์ ์ฌ์ฉ ์ null ์ฌ๋ถ๋ฅผ ์ปดํ์ผ ์ ํ์ธํ์ง ์๋๋ก ํ์ฌ ๋ฐํ์ ์ NPE์ด ๋ฐ์ํ๋๋ก ์๋์ ์ผ๋ก ๋ฐฉ์น
sample!!.toUpperCase()
null safe ์ฐ์ฐ์๋ ์ค์ฝํ ํจ์์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌ
null ์ฒดํฌ๋ฅผ ์ํด if ๋ณด๋ค ํธ๋ฆฌํ ๊ธฐ๋ฅ
๋์ผ์ฑ ํ์ธ
๋ด์ฉ์ ๋์ผ์ฑ
์๋์ผ๋ก ํ๋จ๋๋ ๊ฒ์ด ์๋ ์ฝํ๋ฆฐ ๋ชจ๋ ํด๋์ค๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์๋ฐ๋
Any์ต์์ ํด๋์ค์ equals() ํจ์๊ฐ ๋ฐํํ๋ Boolean ๊ฐ์ผ๋ก ํ๋จa == b
๊ฐ์ฒด์ ๋์ผ์ฑ
a === b
ํจ์์ argument๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ๊ณผ infix ํจ์
โ default arguments
ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ผ ํ๋ ํจ์์ด์ง๋ง ํ๋ผ๋ฏธํฐ๊ฐ ์๋๋ผ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์ํด์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉ
๋จ, ํ๋ผ๋ฏธํฐ์ ์ค๊ฐ์ ๋น์ฐ๋ฉด ๋์ํ์ง ์๋๋ค.
์ด ๊ฒฝ์ฐ์๋
named arguments์ฌ์ฉํ๋ผ๋ฏธํฐ์ ์์์ ๊ด๊ณ์์ด ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ง์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ํ ๋น
โ
variable number of arguments (vararg)
๊ฐ์ ์๋ฃํ์ ๊ฐ์์ ์๊ด์์ด ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
๊ฐ์๊ฐ ์ง์ ๋์ง ์์ ํ๋ผ๋ฏธํฐ๋ผ๋ ํน์ง์ด ์์ผ๋ฏ๋ก ๋ค๋ฅธ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋งจ ๋ง์ง๋ง์ ์ ์ธ
fun sample(text: String, vararg x: Int)
โ infix ํจ์
ํจ์ ์ ์ ์ ์์
infix๋ฅผ ๋ถ์ธ ํ, ํจ์ ์ด๋ฆ์ infix ํจ์๊ฐ ์ ์ฉ๋์๋ฃํ.์ด๋ฆ์ผ๋ก ์ง์
์ฐธ๊ณ ๋ก, ํด๋์ค ์์์ infix ํจ์ ์ ์ธ ์ ์ ์ฉ ํด๋์ค๊ฐ ์๊ธฐ ์์ ์ด๋ฏ๋ก ํด๋์ค ์ด๋ฆ์ ์๋ต ๊ฐ๋ฅ
infix fun multiply(x: Int): Int = this * x
์ค์ฒฉ ํด๋์ค์ ๋ด๋ถ ํด๋์ค
Nested Class(์ค์ฒฉ ํด๋์ค)
ํํ๋ง ๋ด๋ถ์ ์กด์ฌํ ๋ฟ, ์ธ๋ถ ํด๋์ค์ ๋ด์ฉ์ ๊ณต์ ํ ์ ์๋ ๋ณ๊ฐ์ ํด๋์ค
Inner Class (๋ด๋ถ ํด๋์ค)
์ธ๋ถ ํด๋์ค ๊ฐ์ฒด ์์์ ์ฌ์ฉ๋๋ ํด๋์ค๋ก ์ธ๋ถ ํด๋์ค์ ์์ฑ๊ณผ ํจ์ ์ฌ์ฉ ๊ฐ๋ฅ
ํผ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์๋ ์๊ณ , ์ธ๋ถ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์์ด์ผ๋ง ์์ฑ๊ณผ ์ฌ์ฉ์ด ๊ฐ๋ฅ
Data Class & Enum Class
โ Data Class
๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ต์ ํ๋ ํด๋์ค
5๊ฐ์ง ๊ธฐ๋ฅ์ ๋ด๋ถ์ ์ผ๋ก ์๋ ์์ฑ
equals(): ๋ด์ฉ์ ๋์ผ์ฑ ํ๋จ
hashcode(): ๊ฐ์ฒด ๋ด์ฉ์์ ๊ณ ์ ํ ์ฝ๋๋ฅผ ์์ฑ
toString(): ํฌํจ๋ ์์ฑ์ ๋ณด๊ธฐ ์ฝ๊ฒ ํํ
copy()
Example
โ componentX(): ์์ฑ์ ์์๋๋ก ๋ฐํ
Example
โ Enum Class
enumerated type (์ด๊ฑฐํ)
enum ํด๋์ค ์์ ๊ฐ์ฒด๋ค์ ๊ดํ์ ์ผ๋ก ์์๋ฅผ ๋ํ๋ผ ๋ ์ฌ์ฉํ๋ ๋๋ฌธ์๋ก ๊ธฐ์
enum์ ๊ฐ์ฒด๋ค์ ๊ณ ์ ํ ์์ฑ์ ๊ฐ์ง ์ ์์
Set & Map
โ Set
์์๊ฐ ์ ๋ ฌ๋์ง ์์ผ๋ฉฐ, ์ค๋ณต์ด ํ์ฉ๋์ง ์๋ ์ปฌ๋ ์
โ Map
๊ฐ์ฒด๋ฅผ ๋ฃ์ ๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฐพ์๋ผ ์ ์๋ Key๋ฅผ ์์ผ๋ก ๋ฃ์ด์ฃผ๋ ์ปฌ๋ ์
์ปฌ๋ ์
ํจ์
forEach
์ปฌ๋ ์ ์์์ ๋ชจ๋ ์์๋ฅผ it ์ ํตํด ์ฐธ์กฐ
collection.forEach { println(it) }
filter
์ปฌ๋ ์ ์์์ ์กฐ๊ฑด์ ๋ง๋ ์์๋ฅผ ๋ชจ์์ ๋ค์ ์ปฌ๋ ์ ์ผ๋ก ๋ฐํ
collection.filter { it < 4 }
map
์์์ ํตํด ์ฐ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ์ ์ผ๋ก ๋ฐํ
collection.map { it * 2 }
any
ํ๋๋ผ๋ ์กฐ๊ฑด์ ๋ง์ผ๋ฉด true
collection.any { it == 0 }
all
๋ชจ๋ ์กฐ๊ฑด์ ๋ง์ผ๋ฉด true
collection.all { it == 0 }
none
ํ๋๋ผ๋ ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด true
collection.none { it == 0 }
first
collection.first(): ์ปฌ๋ ์ ์ ์ฒซ ๋ฒ์งธ ์์ดํ ๋ฐํ
collection.first{ it > 3 } : ์กฐ๊ฑด์ ๋ง๋ ์ฒซ๋ฒ์งธ ์์ดํ ๋ฐํ
findํจ์๋ก ๋์ฒด ๊ฐ๋ฅ
last
collection.last{ it > 3 } : ์กฐ๊ฑด์ ๋ง๋ ๋ง์ง๋ง ์์ดํ ๋ฐํ
findLastํจ์๋ก ๋์ฒด ๊ฐ๋ฅ
โ ๏ธ first, last ํจ์๋ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ NoSuchElementException ๋ฐ์
์ด ๊ฒฝ์ฐ firstOrNull, lastOrNull ํ์ฉ
count
collection.count() : ์ปฌ๋ ์ ์ ๋ชจ๋ ์์ดํ ๊ฐ์ ๋ฐํ
collection.count { it > 7 } : ์กฐ๊ฑด์ ๋ง๋ ์์ดํ ๊ฐ์ ๋ฐํ
associateBy
list์ ์์ดํ ์์ key๋ฅผ ์ถ์ถํ์ฌ map ์ผ๋ก ๋ณํํ๋ ํจ์
collection.associateBy { it.name }
groupBy
key๊ฐ ๊ฐ์ ์์ดํ ๋ผ๋ฆฌ ๋ฐฐ์ด๋ก ๋ฌถ์ด map์ผ๋ก ๋ง๋๋ ํจ์
collection.groupBy { it.birthYear }
partition
์์ดํ ์ ์กฐ๊ฑด์ ๊ฑธ์ด ๋ ๊ฐ์ ์ปฌ๋ ์ ์ผ๋ก ๋๋๋ ํจ์
collection.partition { it.birthYear > 2002 }
val (over2002, under2002) = collection.partition { it.birthYear > 2002 }
flatMap
์์ดํ ๋ง๋ค ๋ง๋ค์ด์ง ์ปฌ๋ ์ ์ ํฉ์ณ์ ๋ฐํํ๋
collection.flatMap { listOf(it * 3, it * 3 }
getOrElse
์ธ๋ฑ์ค ์์น์ ์์ดํ ์ด ์์ผ๋ฉด ์์ดํ ์ ๋ฐํํ๊ณ , ์๋ ๊ฒฝ์ฐ ์ง์ ํ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํ
collection.getOrElse(1) { 50 }
zip
์ปฌ๋ ์ ๋ ๊ฐ์ ์์ดํ ์ 1:1๋ก ๋งค์นญํ์ฌ ์ ์ปฌ๋ ์ ์ผ๋ก ์์ฑ
๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์์ดํ ๊ฐ์๋ ๋ ์์ ์ปฌ๋ ์ ์ ๋ฐ๋ผ๊ฐ
๋ณ์์ ๊ณ ๊ธ ๊ธฐ์
โ ์์
์ปดํ์ผ ์์ ์ ๊ฒฐ์ ๋์ด ๋ฐ๊ฟ ์ ์๋ ๊ฐ
์์๋ก ์ ์ธ๋ ์ ์๋ ๊ฐ์ ๊ธฐ๋ณธ ์๋ฃํ๋ง ๊ฐ๋ฅ
๋ฐํ์์ ์์ฑ๋ ์ ์๋ ์ผ๋ฐ์ ์ธ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ค์ ๋ด์ ์ ์๋ค.
ํด๋์ค์ ์์ฑ์ด๋ ์ง์ญ๋ณ์๋ก๋ ์ฌ์ฉ ๋ถ๊ฐ
๋ฐ๋์ companion object ์์ ์ ์ธํ์ฌ ๊ฐ์ฒด์ ์์ฑ๊ณผ ๊ด๊ณ์์ด ํด๋์ค์ ๊ด๊ณ๋ ๊ณ ์ ์ ์ธ ๊ฐ์ผ๋ก๋ง ์ฌ์ฉ ๊ฐ๋ฅ
๋ณ์์ ๊ฒฝ์ฐ ๋ฐํ์ ์ ๊ฐ์ฒด ์์ฑ์ ์๊ฐ์ด ๋ ์์๋์ด ์ฑ๋ฅ ํ๋ฝ์ด ์์ด ์ด๋ฅผ ๋ง๊ณ ์ ์์๋ฅผ ์ฌ์ฉ
Example
โ lateinit
์ผ๋ฐ ๋ณ์๋ง ์ ์ธํ๊ณ ์ด๊ธฐ๊ฐ์ ํ ๋น์ ๋์ค์ ํ ์ ์๋๋ก ํ๋ ํค์๋
์ด๊ธฐ๊ฐ ํ ๋น ์ ๊น์ง ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์(์๋ฌ ๋ฐ์)
๊ธฐ๋ณธ ์๋ฃํ์๋ ์ฌ์ฉ ๋ถ๊ฐ
lateinit ๋ณ์์ ์ด๊ธฐํ ์ฌ๋ถ ํ์ธ
Example
โ lazy delegate properties
๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์์ ๊น์ง ์ด๊ธฐํ๋ฅผ ์๋์ผ๋ก ๋ฆ์ถฐ์ฃผ๋ ์ง์ฐ ๋๋ฆฌ์ ์์ฑ
์ฝ๋์์ผ๋ก๋ ์ฆ์ ๊ฐ์ฒด๋ฅผ ์์ฑ ๋ฐ ํ ๋นํ์ฌ ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ํํ๋ฅผ ๊ฐ์ง๋ง
์ค์ ์คํ์์๋ val ๋ณ์ ์ฌ์ฉ ์์ ์ ์ด๊ธฐํ
Example
์ฝ๋ฃจํด์ ํตํ ๋น๋๊ธฐ ์ฒ๋ฆฌ
โ ์ฝ๋ฃจํด์ Scope
์ฝ๋ฃจํด์ ์ ์ด๋ฒ์ ๋ฐ ์คํ๋ฒ์ ์ง์ ๊ฐ๋ฅ
GlobalScope
ํ๋ก๊ทธ๋จ ์ด๋์๋ ์ ์ด, ๋์์ด ๊ฐ๋ฅํ ๊ธฐ๋ณธ ๋ฒ์
CoroutineScope
ํน์ ํ ๋ชฉ์ ์ Dispatcher๋ฅผ ์ง์ ํ์ฌ ์ ์ด ๋ฐ ๋์์ด ๊ฐ๋ฅํ ๋ฒ์
โ CoroutineScope Dispatcher
Dispatchers.Default: ๊ธฐ๋ณธ์ ์ธ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋์Dispatchers.IO: I/O์ ์ต์ ํ ๋ ๋์Dispatchers.Main: ๋ฉ์ธ(UI) ์ค๋ ๋์์ ๋์
๋ชจ๋ ํ๋ซํผ์์ ์ง์๋์ง๋ ์์ผ๋ ์ง์๋๋ ํ๋ซํผ์ ๋ฐ๋ผ ์ฌ์ฉ
์ฝ๋ฃจํด์ ์ด๋ฌํ Scope์์ ์ ์ด๋๋๋ก ์์ฑ๋ ์ ์์
launch vs. async : ๋ฐํ๊ฐ์ด ์๋์ง์ ์ฌ๋ถ
launch: ๋ฐํ๊ฐ์ด ์๋ Job ๊ฐ์ฒดasync: ๋ฐํ๊ฐ์ด ์๋ Deffered ๊ฐ์ฒด
โ ๋ฃจํด์ ๋๊ธฐ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ํจ์๋ค
์ฝ๋ฃจํด ๋ด๋ถ ๋๋ runBlocking ๊ฐ์ ๋ฃจํด์ ๋๊ธฐ๊ฐ ๊ฐ์ผํ ๊ตฌ๋ฌธ ์์์๋ง ๋์ ๊ฐ๋ฅ
delay(milisecond: Long): ms ๋จ์๋ก ๋ฃจํด์ ์ ์ ๋๊ธฐ์ํค๋ ํจ์Job.
join(): Job์ ์คํ์ด ๋๋ ๋๊น์ง ๋๊ธฐํ๋ ํจ์Deferred.
await(): Deferred์ ์คํ์ด ๋๋ ๋๊น์ง ๋๊ธฐํ๋ ํจ์Deferred ๊ฒฐ๊ณผ๋ ๋ฐํ
โ ์ฝ๋ฃจํด ์คํ ๋์ค ์ค๋จํ๊ธฐ
์ฝ๋ฃจํด์
cancel()์ ๊ฑธ์ด์ฃผ๋ฉด ๋ค์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ด ๋ฐ์ํ๋ฉฐ ์ฝ๋ฃจํด์ ์ค๋จ ๊ฐ๋ฅ
์ฝ๋ฃจํด ๋ด๋ถ์ delay() ํจ์ ๋๋ yield() ํจ์๊ฐ ์ฌ์ฉ๋ ์์น๊น์ง ์ํ๋ ๋ค ์ข ๋ฃ
cancel()๋ก ์ธํด ์์ฑ์ธ isActive๊ฐ false ๋๋ฏ๋ก ์ด๋ฅผ ํ์ธํ์ฌ ์๋์ผ๋ก ์ข ๋ฃ
โ
์ ํ์๊ฐ ๋ด์ ์ํ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ์ ์๋ ๊ฒฝ์ฐ null ๋ฐํํ๋ withTimeoutOrNull()
Kotlin Steps
JPA Entity ์ฝํ๋ฆฐ์ค๋ฝ๊ฒ ์ฌ์ฉํ๊ธฐ
Kotlin์์ JPA Entity ์ค๊ณํ๊ธฐ
๐คท๐ปโโ๏ธ Data Calss ํ์ฉ?
Entity์ ๋๋ฑ์ฑ ์ฒดํฌ๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๋น๊ตํ๋๊ฒ ์๋๋ผ ์๋ณ์๋ฅผ ํตํด์๋ง ๋น๊ต
equals์hashCode๋ฅผ ๋ฐ๋ก ์ฌ์ ์๋ฅผ ํ์ง ์์ผ๋ฉด ์ฐธ์กฐ ๋น๊ต๋ฅผ ํตํด ๋์ผ์ฑ ํ์ธ์ ํ๋ฏ๋ก์๋ณ์๋ฅผ ํตํ ๋๋ฑ์ฑ ํ๋จ์ ์ ๊ณตํ๋ ค๋ฉด
equals์hashCode์ฌ์ ์ ํ์
๐คท๐ปโโ๏ธ lateinit ์ ์ฌ์ฉํ ์ด๊ธฐํ ๋ฏธ๋ฃจ๊ธฐ?
์ด๊ธฐํ๋ฅผ ์ต๋ํ ๋ค๋ก ๋ฆ์ถฐ์ ์ฑ๋ฅ ๋ฐ ํจ์จ์ฑ์ ๋ํ๋ ค๋ ์ฉ๋๋ก ์ฌ์ฉ
์ผ๋ฐ์ ์ผ๋ก ์ฐ๊ด๊ด๊ณ ์์ด Column๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ
lateinit๋ฅผ ์ฌ์ฉํ์ง ์์ํ์ง๋ง, ์ฐ๊ด๊ด๊ณ๋ฅผ ์ ์ํ๋ ๊ฒฝ์ฐ
lateinit์ ์๊ฐ ํ์ํ๋ฐ์์ํ๋ ์ํฐํฐ๋ฅผ ์กฐํํ ๋๋ JPA๊ฐ lateinit ํ๋๋ฅผ ์ด๊ธฐํํด ์ฃผ์ง๋ง
์ด์ ๋ง ์์ฑํ Entity๋ JPA๊ฐ lateinit ํ๋๋ฅผ ์ด๊ธฐํ ํด์ฃผ์ง ์์์ผ๋ฏ๋ก ์ํฐํฐ ๊ทธ๋ํ ํ์ ์์ ์ ์ค๋ฅ๊ฐ ๋ฐ์
๐๐ปโโ๏ธ lateinit์ ์ฌ์ฉํ์ง ์๊ณ Java์ฒ๋ผ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ ์ํ๋ ค๋ฉด?
์ํฐํฐ ์์ฒด๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ
Example
Kotest
์ฝํ๋ฆฐ์ ํ ์คํธ๋๊ตฌ Kotest
Junit๊ณผ Kotest์ ์ฐจ์ด์ ์ค ๊ฐ์ฅ ํฐ ๋ถ๋ถ์
๊ฐ๊ฒฐํจ
JUnit 5 vs Kotest. Part 1: Is it the new way we test?
Get Start
build.gradle.kts
IntelliJ ํ๋ฌ๊ทธ์ธ
Preference โ Plugins โ Kotest
Kotest ์ฅ์ ๋ค
โ ์ ์ฐ์ฑ
๋ค์ํ ํ ์คํธ ์คํ์ผ์ ์ง์
ํ์ ์ฃผ๋ ํ ์คํธ(BDD)๋ฟ ์๋๋ผ
WordSpec,FunSpec,AnnotationSpec,FreeSpec๋ฑ ๋ค์ํ ์คํ์ผ ์ง์
โ ๊ฐ๋ ฅํ๊ณ ๋ค์ํ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ณต์กํ ํํ์์ด๋, ์ปฌ๋ ์ , ์์ธ ๋ฑ์ ๊ฒ์ฆํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(assertion) ์ ๊ณต
โ ํ๋กํผํฐ ๊ธฐ๋ฐ ํ ์คํธ
ํ๋กํผํฐ ๊ธฐ๋ฐ ํ ์คํธ๋ฅผ ์ง์
์์์ ์ ๋ ฅ๊ฐ์ ๋ง๋ค์ด ์ฝ๋์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋ฐฉ์์ผ๋ก ๋ค์ํ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ํ ์คํธ
โ ๋ฐ๋ณต ๋ฐ ์ค์ฒฉ ํ ์คํธ
๋ฐ๋ณต ๋ฐ ์ค์ฒฉ ํ ์คํธ๋ฅผ ์ง์ํ์ฌ ์ฌ๋ฌ ๋ณต์กํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ ์ฝ๊ณ ๊ฐ๊ฒฐํ๊ฒ ๊ด๋ฆฌ
Testing Style
https://kotest.io/docs/framework/testing-styles.html
โ StringSpec
โ FunSpec
โ AnnotationSpec
JUnit ํ ์คํธ ๋ฐฉ์๊ณผ ์ ์ฌ
โ DescribeSpec
describe๊ฐ ํ ์คํธ ๋์์ ์ง์นญ๋ด๋ถ์ ์ผ๋ก ์กฐ๊ฑด์ด๋ ์ํฉ์ ์ค๋ช ํ ๋๋
context์ฌ์ฉํ ์คํธ ๋ณธ์ฒด์๋
it์ ์ฌ์ฉํด์ ํ ์คํธ ์คํ ๋ฆฌํ ๋ง
๋ง์ผ ํ ์คํธ ๋์
disabled๋ฅผ ์ ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐxdescribe์ฌ์ฉ
โ BehaviorSpec
ํ์ ์ฃผ๋ ํ ์คํธ ๋ฐฉ์
JUnit Nested ์ ๋ ธํ ์ด์ ์ ํ์ฉํ ๊ณ์ธต ๊ตฌ์กฐ ํ ์คํธ ๋ฐฉ์๊ณผ ์ ์ฌํ์ง๋ง ๋ ํธํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
Assertion
https://kotest.io/docs/assertions/assertions.html
๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ์ฌ๋ฌ ๊ฒ์ฆ ํจ์
์ฝํ๋ฆฐ ๊ธฐ์ด, ๋จ์ ํ
์คํธ
์ฝํ๋ฆฐ์ ์๋ฐ ํ๋ซํผ์์ ๋์ํ๋ ์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด.
๊ทธ๋ฆฌ๊ณ ์ ์ ํ์ ์ง์ ์ธ์ด
Person class
.
Person Test
TDD
ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(Test-Driven development, TDD)
์งง์ ๊ฐ๋ฐ ์ฌ์ดํด์ ๋ฐ๋ณตํ๋ SW ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ค ํ๋
aka. TFD(Test First Development) + ๋ฆฌํฉํฐ๋ง
TDD์ ํ๋ก๊ทธ๋๋ฐ ์์
[Red] : ์คํจํ๋ ์์ ํ ์คํธ ์์ฑ(์ปดํ์ผ ์๋ฌ ๋ฌด์)
[Green] : ํ ์คํธ๊ฐ ํต๊ณผ๋๋๋ก ์์ . ์ด๋ ํ ํด๋ฆฐ์ฝ๋๋ ๊ณ ๋ คํ์ง ์์
[Blue] : Green ๊ณผ์ ์์ ๋ฐ์ํ ์ ๋ณด๋ค์ ๋ชจ๋ ์ฒญ์ฐ. ์ฌ๊ธฐ์ ํด๋ฆฐ์ฝ๋๋ฅผ ์งํ
.
Why TDD โ
(1) ๊ธฐ๋ฅ์ ์์์ ์ผ๋ก ๋ง๋ค๊ฒ ๋๋ค.
๋จ์ ํ ์คํธ๋ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฅ ์์ ๋จ์๋ฅผ ๊ฐ์ง๋ค ๋ณด๋ ํ ์คํธ์ ๋ฒ์๋ ์ข๋ค.
ํ๋์ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๋์์ ์ํํ์ง ์๊ฒ ๋ ํ๋ฅ ์ด ๋์์ง๋ค.
(2) ์ ์ดํ ์ ์๋ ๋ฒ์๋ฅผ ๋๋ฆด ์ ์๋ค.
๊ธฐ๋ฅ ๋ช ์ธ๋ฅผ ์์ธํ๊ฒ ํ๊ณ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด์ ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ๋ฉ์๋๊ฐ ๋ด๊ฐ ์ ์ดํ ์ ์๋๋ก ๋ง๋ค์ด์ผ ํ๋๋ฐ
์ด ๊ณผ์ ์ ํตํด ๋ด๊ฐ ์ ์ดํ ์ ์๋ ์์ญ์ ์ต์ํํ ์ ์๋ค.
(3) ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์๋ค.
ํ๋ก์ ํธ๊ฐ 5๋ ์ด์ ์ ์ง๊ฐ ๋๊ณ , ๊ด๋ จ ์์ค์ฝ๋๋ง ์๋ฐฑ ๊ฐ๊ฐ ๋์ด๊ฐ๋ ์ํฉ์ด ๋์์ ๋ ํ๋์ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํด๋์ค๊ฐ ์์ญ ๊ฐ๊ฐ ๋์ ๊ฒ์ด๋ค.
์์ญ/์๋ฐฑ ๊ฐ์ค ํ๋์ ํด๋์ค์ ํน์ ๋ฉ์๋๊ฐ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค๊ณ ํ ๋ ์ด ์๋ฌ๋ฅผ ์ฐพ๋ ์๊ฐ์ด ์งง์ ๋ ๋ช ๋ถ์ผ ์ ์์ง๋ง ๊ธธ ๋๋ ๋ฉฐ์น ๋ก๋ ๋ถ์กฑํ ์ ์๋ค.
์ด๋ ํด๋น ํด๋์ค์ ๋ํ ํ ์คํธ ์ฝ๋๊ฐ ์์ฑ๋์ด ์๋ค๋ฉด, ๋ฐฐํฌ ์ ํ ์คํธ ๋น๋ ์ฌ์ดํด์ ํตํด ์ฐพ์๋ผ ์ ์๋ค.
FP, ์ฝํ๋ฆฐ DSL
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
Why FPโ
๋์์ฑ ์ด์
๋ฐ์ดํฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ๋ ํ๊ณ ์กด์ฌ
๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋ฐ๋ฅธ ๋ถ๋ด
๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ๋๋ฐ ํฐ ๋ถ๋ด
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ํจ์ธ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ ์ฐ์ฐ์ด ํ์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ชจ๋ํ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํจ์๋ฅผ ๋ชจ๋ํํ ๊ฒฝ์ฐ ์ ๋ง์ ๊ณณ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
๋ ์ ์ฉํ๊ณ , ์ฌ์ฌ์ฉ์ด ํธ๋ฆฌํ๊ณ , ๊ตฌ์ฑ์ด ์ฉ์ดํ๊ณ , ํ ์คํธํ๊ธฐ ๋ ๊ฐํธํ ์ถ์ํ๋ฅผ ์ ๊ณต
๋ ๋น ๋ฅด๊ฒ ์์ ํด์ผ ํ๋ค.
๊ฐ์ฒด์ ๋ํ ๋ชจ๋ธ๋ง์ ๋ง์ ์๊ฐ์ ํฌ์ํ๊ธฐ๋ณด๋ค ์ฌ์ฉ์ ์๊ตฌ ์ฌํญ์ ๋ํด์ ์ต์ํ์ผ๋ก ์ถฉ๋ถํ ์์ค์ ์ ์งํ๋ฉด์
๋์์ ๋ณํ์ ๋ํด์๋ ์ ์ฐํ๊ฒ ๋์ํ๋๋ฐ ๋์
๋จ์ํจ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ํตํด ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ๊ฐ์ ํด ๋ ๊น๋ํ ์ฝ๋๋ก ๊ตฌํ
๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ vs ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ
ํ๋ก๊ทธ๋๋ฐ์ ์ํ์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๊ตฌ๋ฌธ์ ๊ด์ ์ผ๋ก ์ ๊ทผํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์.
์ปดํจํฐ๊ฐ ์คํํ ๋ช ๋ น๋ค์ ์คํ ์์๋๋ก ๊ตฌํ
๋๋ถ๋ถ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
์๊ณ ๋ฆฌ์ฆ ์ฒ๋ฆฌ ์์ ์ ์ ํฉํ ์ธ์ด
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
์ ์ธ์ผ๋ก๋ง ํ๋ก๊ทธ๋จ์ ๋์์ํค๋ ๋ฐฉ์
ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ๊ตฌ์ฒด์ ์ธ ์๋ ์์๋ฅผ ๋์ดํ์ง ์์
์์ ํ์ง ์์ง๋ง ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํด ์ผ์ ์์ค์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ข ๋ฅ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง
์์ ์ ์ด๋ป๊ฒ ์ํํ ๊ฒ์ธ์ง, How์ ์ง์ค
๊ตฌ์ฒด์ ์ธ ์์ ๋ฐฉ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฒฐ์ ํ๊ณ , ๋ฌด์(What)์ ์ํํ ๊ฒ์ธ์ง์ ์ง์ค
side-effect๊ฐ ๋ฐ์ํ์ง ์์
๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ ํ์ฉ
๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ํ์ฉํ๋ฉด ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ด ์ด๋ ต๋ค.
๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๋์ฌ ๋ฒ๊ทธ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ธ๋ค.
์ผ๊ธ ๊ฐ์ฒด๋ก์์ ํจ์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ํจ์๊ฐ ์ผ๊ธ ๊ฐ์ฒด(first-class citizen)์ ์ญํ ์ ์ํ
ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ก ํ์ฉ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํจ์๋ฅผ ํจ์์ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ํจ์์ ๋ฐํ ๊ฐ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅ
๋๋ค
๋๋ค๋ ์ต๋ช ํจ์์ ๋ค๋ฅธ ํํ
์ฆ, ํจ์๋ ํจ์์ธ๋ฐ ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฐ์ตํ๋ ๋ฐฉ๋ฒ
ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ ํ์
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐํจ์ ๋ด๋ถ ๊ตฌํ์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์งํฅ๊ฐ์ฒด์ ์ํ ๊ด๋ฆฌ๋
๋ถ๋ณ์ ์งํฅ
์ํ์ค
์ฝํ๋ฆฐ ์ปฌ๋ ์ ์ ํจ์๋ ๊ฒฐ๊ณผ ์ปฌ๋ ์ ์ ์ฆ์ ์์ฑ
์ปฌ๋ ์ ํจ์๋ฅผ ์ฐ์ํ๋ฉด ๋งค ๋จ๊ณ๋ง๋ค ๊ณ์ฐ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ์ปฌ๋ ์ ์ ์์๋ก ๋ณด๊ด
์๋ ์ฐ์ ํธ์ถ์ ๋ฆฌ์คํธ๋ฅผ 2๊ฐ ์์ฑ(map์ ๊ฒฐ๊ณผ์ filter์ ๊ฒฐ๊ณผ)
์ํ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๊ฐ ์์ ์ปฌ๋ ์ ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ปฌ๋ ์ ์ฐ์ฐ์ ์ฐ์
์์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ๋์ ๋๊ฒ ํฅ์
์๋ฐ ์คํธ๋ฆผ๊ณผ ๋์ผํ ๊ฐ๋
๐ก ํฐ ์ปฌ๋ ์
์ ๋ํด์ ์ฐ์ฐ์ ์ฐ์์ํฌ ๋๋ ์ํ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ท์น์ผ๋ก ์ผ์.
๐ก ์ํ์ค ์์๋ฅผ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ์ ๊ทผํ๋ ๋ฑ์ ๋ค๋ฅธ API ๋ฉ์๋๊ฐ ํ์ํ๋ค๋ฉด ์ํ์ค๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐํํ์.
Example
์ต๋ช ํด๋์ค๋ฅผ ๋๋ค๋ก ์ ํํ๊ธฐ
๋๋ค๋ฅผ ํ์ฉํด ์ค๋ณต ์ ๊ฑฐํ๊ธฐ
์ฝํ๋ฆฐ DSL
์ฝํ๋ฆฐ DSL
๋ฒ์ฉ ์ธ์ด(=์ฝํ๋ฆฐ)๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ
๋ฒ์ฉ ์ธ์ด์ ๋์ผํ ๋ฌธ๋ฒ์ ์ฌ์ฉ
ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ํ์๊ฐ ์์
ํ์ ์์ ์ฑ์ ๋ณด์ฅ
์ฝํ๋ฆฐ ์ฝ๋๋ฅผ ์ํ๋ ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ
์ฝํ๋ฆฐ์ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ์ง์
ํ์ฅ ํจ์(Extension functions)
์ค์ ํธ์ถ(Infix notation)
์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ(Operator overloading)
get ๋ฉ์๋์ ๋ํ ๊ด๋ก(Indexed access operator)
๋๋ค๋ฅผ ๊ดํธ ๋ฐ์ผ๋ก ๋นผ๋ด๋ ๊ด๋ก(Passing a lambda to the last parameter)
์์ ๊ฐ์ฒด ์ง์ ๋๋ค(Lambda with receiver)
์ฝํ๋ฆฐ DSL ์ค์ต
Last updated
