TDD, Clean Code Preview

TDD, Clean Code with Kotlin Preview

TDD, Clean Code with Kotlin ๊ธ€์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Start Kotlin

Kotlin Web Compiler Site

https://play.kotlinlang.org/


๋ณ€์ˆ˜์™€ ์ž๋ฃŒํ˜•

โœ… ๋ณ€์ˆ˜์˜ ์„ ์–ธ

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

public (default)
์–ด๋–ค ํŒจํ‚ค์ง€์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ

internal

๊ฐ™์€ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

private

๊ฐ™์€ ํŒŒ์ผ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

protected

๋ฏธ์‚ฌ์šฉ

Class Scope

public (default)
ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ํ•ญ์ƒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

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

Entity

PrimaryKeyEntity.kt

User.kt

Tag.kt

Board.kt

Tip

(1) allopen

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” JPA Entity ์„ค๊ณ„์‹œ allopen, no-args constructor ์˜ต์…˜ ํ•„์š”

JPA์—์„œ๋Š” ํด๋ž˜์Šค ํ™•์žฅ ๋ฐ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋ ค ํ•˜๋Š”๋ฐ ํด๋ž˜์Šค๊ฐ€ final class๋ผ๋ฉด ํ™•์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ

  • JPA ํ”Œ๋Ÿฌ๊ทธ์ธ์€ JPA ๊ด€๋ จ ํด๋ž˜์Šค ์ƒ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” No-arg plugin๋„ ํฌํ•จ๋˜๋Š”๋ฐ, ์ด๋Š” JPA์—์„œ ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ ๋ฐฉ์‹์ด ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•œ ํ”„๋กœํผํ‹ฐ ์ฃผ์ž…์ด๊ธฐ ๋•Œ๋ฌธ

  • ๊ทธ๋ž˜์„œ ๋ณดํ†ต ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ JPA ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•  ๋•Œ, ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์„œ ํด๋ž˜์Šค๋“ค์ด ์ž๋™์œผ๋กœ open๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ • ํ•„์š”

โš ๏ธ ํ•˜์ง€๋งŒ, ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ Entity Decompile์„ ํ•ด๋ณด๋ฉด final ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋‹ค.

  • ๊ทธ๋ž˜์„œ Hibernate ์‚ฌ์šฉ์„ ์œ„ํ•ด Entity, Entity์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” final์ด ์•„๋‹ˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”

(2) PrimaryKeyEntity

โœ… ์—”ํ‹ฐํ‹ฐ ๊ณตํ†ต ์‹๋ณ„์ž

๋ชจ๋“  Entity๊ฐ€ PrimaryKeyEntity๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋ฉด ๊ณตํ†ต๋œ PrimaryKey ๋ฅผ ์‚ฌ์šฉ

  • Integer, Long ํƒ€์ž…์€ Entity ๊ฐ„์—๋„ ํ‚ค ๊ฐ’์ด ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๊ณ  MAX_VALUE์˜ ์ฐจ์ด๋„ ์žˆ์–ด์„œ UUID๋ฅผ ๋งŽ์ด ์„ ํƒํ•˜๋Š” ์ถ”์„ธ

  • ํ•˜์ง€๋งŒ, UUID ๋˜ํ•œ ์ •๋ ฌ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹จ์ ๊ณผ Long๋ณด๋‹ค ํฌ๊ธฐ๋‚˜ ์ƒ์„ฑ๋น„์šฉ๋„ ํฌ๋‹ค๋Š” ๋‹จ์  ์กด์žฌ

    • ์ •๋ ฌ์€ ULID๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ 

    • ํฌ๊ธฐ๋Š” ๊ณ ๋ คํ•  ์ •๋„์˜ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ORM ์‚ฌ์šฉ ์ž์ฒด๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์•„์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

ULID๋Š” UUID์™€ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์ง€๋ฉฐ ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•

  • ULID ๊ตฌํ˜„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ULID Creator๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ

    • Monotinic ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์ค˜์„œ ๊ธฐ์กด ULID๊ฐ€ ๋ฐ€๋ฆฌ์ดˆ๊นŒ์ง€๋งŒ ์ œ๊ณต๋˜๋Š”๋ฐ, ๋™์ผํ•œ ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋‹ค์Œ ์ƒ์„ฑ ULID์˜ ๋ฐ€๋ฆฌ์ดˆ๋ฅผ 1์ฆ๊ฐ€์‹œ์ผœ ์ƒ์„ฑ

โœ… Nullable ํƒ€์ž…์„ ๋ฐฉ์ง€

๊ธฐ์กด ์ž๋ฐ”์—์„œ๋Š” JPA ์—”ํ‹ฐํ‹ฐ์˜ New ์—ฌ๋ถ€๋ฅผ ์‹๋ณ„์ž(null or 0)๋กœ ํŒ๋‹จํ•˜์ง€๋งŒ

PrimaryKeyEntity๋Š” Persistable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ Persistable.isNew ํ•จ์ˆ˜ ํ™œ์šฉ

โœ… ๊ณตํ†ต ๋™์ผ์„ฑ ๋ณด์žฅ

Entity๋Š” ๊ฐ™์€ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•ด์•ผ ํ•˜๊ธฐ๋ฏ€๋กœ equals, hashCode ์žฌ์ •์˜๊ฐ€ ํ•„์š”ํ•œ๋ฐ

PrimaryKeyEntity ์—์„œ equals, hashCode๋ฅผ ์žฌ์ •์˜ ํ•œ ๋’ค ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ๋ถˆํŽธํ•จ์„ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค.

(3) ์ฑ„๋ฒˆ ์œ ๋ฐœ์„ ๋ฐฉ์ง€

๊ธฐ์กด JPA์—์„œ์˜ ID ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ @GeneratedValue์˜ auto_increment, sequence, sequence table ๋“ฑ์˜ ์ „๋žต์„ ์‚ฌ์šฉ

  • ํ•˜์ง€๋งŒ, ์ด ๋ฐฉ์‹์€ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฑ…์ž„์„ ์ „๊ฐ€ํ•˜๊ณ  ๋ถ€ํ•˜๋ฅผ ์œ ๋ฐœํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์ด ํฐ ์„œ๋น„์Šค์—์„œ๋Š” ์ด๋Ÿฐ ์ฑ„๋ฒˆ ํ™œ๋™์ด ์ƒ๋‹นํ•œ ๋ถ€ํ•˜๋กœ ์ž‘์šฉ

ํ•ด๊ฒฐ์ฑ…์œผ๋กœ PrimaryKeyEntity ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด Entity ์ƒ์„ฑ์‹œ Primary Key๋„ ํ•จ๊ป˜ ์ƒ์„ฑ

  • ULID๋Š” ํ•ญ์ƒ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค.

โš ๏ธ PrimaryKeyEntity ๋ฅผ ์ด์šฉํ•ด์„œ ์˜์†ํ™” ์ „ Key๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ฐฉ์‹์˜ ์ฃผ์˜์ 

  • null์ธ ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ์šด Entity๋กœ ํŒ๋‹จํ•˜์—ฌ, ์˜์†ํ™” ๋˜์ง€์•Š์€ ์—”ํ‹ฐํ‹ฐ์— Key๊ฐ€ ํ• ๋‹น๋˜๋ฉด persist ๋˜๋Š”๊ฒŒ ์•„๋‹Œ merge ๋™์ž‘

  • ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ํ•œ ๋ฒˆ ์กฐํšŒ ํ›„ ์ €์žฅํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰

  • ๐Ÿ™†๐Ÿปโ€โ™‚๏ธ ์ด๊ฒƒ์€ Persistable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐฉ์ง€

    • getId, isNew(์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ ํŒŒ์•…) ํ•จ์ˆ˜ ์ œ๊ณต

    • Persistable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ Entity๋ฅผ ์˜์†ํ™” ํ•˜๋ คํ•˜๋ฉด

    • JpaPersistableEntityInformation.isNew ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ Persistable.isNew ํ•จ์ˆ˜ ํ˜ธ์ถœ

(4) Property ์ ‘๊ทผ ์ œ์–ด

โœ… ํ”„๋กœํผํ‹ฐ์˜ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”

protected set์„ ํ†ตํ•œ setter์˜ ์ ‘๊ทผ ์ œํ•œ

Entity ์ž์‹ ์ด๋‚˜ ์ƒ์† Entity์—์„œ๋งŒ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

  • Entity์— ๋Œ€ํ•ด allOpen ์˜ต์…˜์„ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, open property์˜ ๊ฒฝ์šฐ private setter ๋ฏธํ—ˆ์šฉ

โœ… ์ƒ์„ฑ์ผ, ์ˆ˜์ •์ผ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ์ด ํ•„์š” ์—†๋Š” ํ”„๋กœํผํ‹ฐ

  • ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ์ฒ˜๋Ÿผ setter์˜ ์ ‘๊ทผ์ œ์–ด๋ฅผ protected๋กœ ์„ ์–ธ

  • ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ๋ณ€๊ฒฝ์„ ์—ด์–ด๋’€๊ธฐ์— ์ง์ ‘ ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ๋ณ€๊ฒฝ์„ ํ•˜์ง€ ์•Š๋Š” ํ•œ ์•ˆ์ „

  • ๊ฐ์ฒด ์ž์ฒด์—์„œ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ(immutable)๋„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ€๊ฒฝ ํ”„๋กœํผํ‹ฐ(mutable)๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค๊ณ  ํŒ๋‹จ

(5) nullable

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ Entity์˜ ์Šคํ‚ค๋งˆ๊ฐ€ ๋ถˆ์ผ์น˜ ํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž…์ด ๋‹ค๋ฅธ๊ฑด JPA์—์„œ ์žก์•„์„œ ๋นŒ๋“œ ์‹œ์ ์— ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ,

  • nullableํ•œ Column์„ Entity์— non-nullableํ•˜๊ฒŒ ์„ ์–ธํ•œ ๊ฒฝ์šฐ Column์— ๊ฐ’์ด null์ด๋ผ๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ

์ด ๊ฒฝ์šฐ @Column ์• ๋…ธํ…Œ์ด์…˜์˜ nullable ์†์„ฑ์„ ๋ช…์‹œํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ์˜ ์†์„ฑ ํƒ€์ž…์„ ์•Œ๋ ค์ฃผ๋ฉด, ์œ„์™€ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ง‰์•„์ฃผ๊ณ , ํŒŒ์•…ํ•˜๊ธฐ ์‰ฌ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค

(6) ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋Š” ์—ฐ๊ด€๊ด€๊ณ„๋Š” Immutable Collection์„ ๋…ธ์ถœ

JPA์—์„œ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์š”์†Œ ๋ณ€๊ฒฝ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ถˆ๋ณ€(val)์œผ๋กœ ์„ ์–ธํ•ด๋„ ์œ„/๋ณ€์กฐ๊ฐ€ ๊ฐ€๋Šฅ

ํ•˜์ง€๋งŒ, ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒƒ์€ Entity์˜ ํŠน์„ฑ์ƒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— MutableList๋ฅผ List๋กœ ๋ฐ”๊ฟ€ ์ˆœ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‚ด๋ถ€ ์กฐ์ž‘์šฉ ํ”„๋กœํผํ‹ฐ์™€ ์™ธ๋ถ€ ๋…ธ์ถœ์šฉ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ„๋„๋กœ ๋‘์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

boards๋ฅผ ์กฐํšŒํ•˜๋Š” ์‹œ์ ์— ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ดํ›„ ๊ฒŒ์‹œํŒ์„ ์ถ”๊ฐ€ํ–ˆ์„๋•Œ ๋‚ด์šฉ์ด ์—ฐ๋™


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์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ˆœ์„œ

  1. [Red] : ์‹คํŒจํ•˜๋Š” ์ž‘์€ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ(์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฌด์‹œ)

  2. [Green] : ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋˜๋„๋ก ์ˆ˜์ •. ์–ด๋– ํ•œ ํด๋ฆฐ์ฝ”๋“œ๋„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ

  3. [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