Skip to content

Latest commit

ย 

History

History
120 lines (67 loc) ยท 5.12 KB

Why doesn't Kotlin use a @Builder.md

File metadata and controls

120 lines (67 loc) ยท 5.12 KB

๋ถ€์ œ: Hey, Kotiln (์ฝ”ํ‹€๋ฆฐ ๊ธฐ๋ณธ ์ƒ์‹ ์•Œ์•„๊ฐ€๊ธฐ)

์†”์งํžˆ ํฅ๋ฏธ๋กญ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€๊ฐ€? lombok์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ์• ๋…ธํ…Œ์ด์…˜ ๋‘ ๊ฐœ๋ฅผ ๋ฝ‘๋Š”๋‹ค๋ฉด ๋‚˜๋Š” @Getter์™€... @Builder์„ ๋ฝ‘์„ ๊ฒƒ์ด๋‹ค. ์–ด๊น€์—†์ด Kotlin์—์„œ๋„ @Builder ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ž ๊น, ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ์š”?


์šฐ๋ฆฌ์˜ ์นœ๊ตฌ ๊ตฌ๊ธ€์— ๋‹น์žฅ ์ฐพ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์นœ๊ตฌ์˜ ๋Œ€๋‹ต์€, Kotlin์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Builder ํŒจํ„ด์„ ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š” ์—†๋‹ค.


์šฐ๋ฆฌ๊ฐ€ Builder Pattern์„ ์“ฐ๋Š” ์ด์œ 

Builder Pattern์— ๊ด€ํ•œ ๊ฑด ๊นƒํ—ˆ๋ธŒ languageStudy->Java์— ์ •๋ฆฌํ•ด๋’€๋‹ค. ๐Ÿ˜“

Builder Pattern์˜ ์žฅ์ ์œผ๋กœ๋Š”

  1. ๊ฐ ์ธ์ž๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ๊ธฐ ์‰ฝ๋‹ค.

    ํƒ€์ž…์ด ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—ฐ๋‹ฌ์•„ ์žˆ์„ ๋•Œ ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ๊ฐ’์„ ์ž˜๋ชป ์ „๋‹ฌํ–ˆ์„ ๋•Œ ์ฐพ๊ธฐ ์–ด๋ ค์šด ๋ฒ„๊ทธ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

  2. setter ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (๊ฐ์ฒด ์ผ๊ด€์„ฑ์ด ๊นจ์ง€์ง€ ์•Š๋Š”๋‹ค.)

  3. ๊ฐ์ฒด๋“ค๋งˆ๋‹ค ๋“ค์–ด๊ฐ€์•ผํ•  ์ธ์ž๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅผ ๋•Œ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋“ฑ์ด ์žˆ๋‹ค.


Kotlin constructor

๋‹ค์‹œ ๋ณด์ž.

  1. ๊ฐ ์ธ์ž๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ๊ธฐ ์‰ฝ๋‹ค.
  2. ํ•„๋“œ๊ฐ€ ์„ ์–ธ๋œ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  4. ๊ฐ์ฒด๋“ค๋งˆ๋‹ค ๋“ค์–ด๊ฐ€์•ผํ•  ์ธ์ž๊ฐ€ ๋‹ค๋ฅผ ๋•Œ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋ชจ๋‘ constructor๋กœ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (์ •๋ง?)

Java์˜ ์ƒ์„ฑ์ž์™€๋Š” ๋‹ค๋ฅธ ์ ์ด Kotlin์€ default ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๋ฅผ ํ•œ ๋ฒˆ์— ์ •์˜ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ข‹์€ ๊ธ€.

Named Argument: ๋„ค์ž„๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ

User(email="[email protected]", "nickname", "password")

๋„ค์ž„๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ ์ธ์ž๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ๊ธฐ ์‰ฝ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„๋“œ์˜ ์ˆœ์„œ ์ƒ๊ด€์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์ง„๋‹ค. (๊ฐœ์ธ์ ์œผ๋กœ ์˜๋ฏธ๋ฅผ ์•Œ๊ธฐ ์‰ฌ์šด๊ฑด Builder parttern์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ์‰ฝ์ง€๋งŒ.... ๊ทธ๋ž˜์„œ ๋ฌด์กฐ๊ฑด Kotlin์—์„œ Builder Pattern? ์•ˆ ๋ผ,๋Š” ์•„๋‹ˆ๋‹ค.)

๐Ÿ‘‰ ๊ฐ ์ธ์ž๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ๊ธฐ ์‰ฝ๋‹ค. / ํ•„๋“œ๊ฐ€ ์„ ์–ธ๋œ ์ˆœ์„œ์™€ ์ƒ๊ด€ ์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Setter๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๋ถˆ๋ณ€

์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์ด๋‹ค. ํ•ด๋‹น ์ปฌ๋Ÿผ์— ๊ธฐ๋ณธ๊ฐ’์„ ์ฃผ๊ฒŒ ๋˜๋ฉด ๊ทธ ์ธ์ž๋Š” ๊ฐ’์„ ํ• ๋‹นํ•ด์ฃผ์ง€ ์•Š๋”๋ผ๋„ ๊ธฐ๋ณธ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‰ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Default Argument: default ํŒŒ๋ผ๋ฏธํ„ฐ

class User(name: String, age: Int = 10)

age์ฒ˜๋Ÿผ ๊ธฐ๋ณธ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ž์— ๊ฐ’์„ ํ• ๋‹นํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด๋“ค๋งˆ๋‹ค ๋“ค์–ด๊ฐ€์•ผํ•  ์ธ์ž๊ฐ€ ๋‹ค๋ฅผ ๋•Œ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

๐Ÿ‘‰ ๊ฐ์ฒด๋“ค๋งˆ๋‹ค ๋“ค์–ด๊ฐ€์•ผํ•  ์ธ์ž๊ฐ€ ๋‹ค๋ฅผ ๋•Œ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


Lombok? ๐Ÿ˜‹ We have a data class

lombok๋„ ํ•„์š” ์—†๋‹ค. ์™œ? Kotlin์—๋Š” data class๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ.

data ํด๋ž˜์Šค๋Š” toString(), hashCode(), equals(), copy() ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. Kotlin ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ ์งค ๋•Œ data class์˜ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ณ  ๊นœ์ง ๋†€๋ž๋‹ค. ๋ฐ์ดํ„ฐ๋งŒ์„ ๋‹ค๋ฃจ๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๊ฐ„ํŽธํ•œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•ด์ฃผ๊ณ , ์‚ฌ์šฉ๋ฒ•๋„ ๊ทธ๋ƒฅ ํด๋ž˜์Šค ์•ž์— data๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. data class User()

ํŠน์ง•

  • ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
  • 1๊ฐœ ์ด์ƒ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • toString()์€ ์ƒ์„ฑ์ž์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.

copy()

์‹ ๊ธฐํ•œ ๊ฑธ ๋ฐฉ๊ธˆ ํ•˜๋‚˜ ๋” ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœ ํ•„๋“œ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•ด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ data class์˜ copy๋ฅผ ์ด์šฉํ•œ๋‹ค.

val fUser = User("name", "pass", 30)
val sUser = fUser.copy(name = "nickname")

์ •๋ง ์‹ ๊ธฐํ•˜๋‹ค.


์ด๋Ÿฐ Kotlin ํŠน์„ฑ ์ƒ id๋ฅผ ์•„๋ž˜๋กœ ๋„ฃ๋Š” ๊ฒŒ ์ข‹๋‹ค๋Š” ๊ธ€์„ ๋ณด์•˜๋‹ค.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0L

id ๊ฐ’์„ ๋„ฃ์–ด ์ค„ ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ์— id๋ฅผ ์•ž์— ๋„ฃ์œผ๋ฉด ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ๊ฐ€ ๋งž์ง€ ์•Š๊ธฐ์— ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. (์ด๋ฉ”์ผ์„ ๋„ฃ์—ˆ๋”๋‹ˆ ์—ฌ๊ธฐ id ์ž๋ฆฌ์ธ๋ฐ์š”.)

๋„ค์ž„๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. id๋ฅผ ๋งจ ์•„๋ž˜์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ. ๋„ค์ž„๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ 

Builder Pattern - ๋ด„์„ ๋‹˜ ๋ธ”๋กœ๊ทธ

Id๋ฅผ ์„ ์–ธํ•  ๋•Œ, ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ ์ƒ ๊ฐ€์žฅ ๋ฐ‘์œผ๋กœ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์€ ์ด์œ  - Hyung ๋‹˜ ๋ธ”๋กœ๊ทธ

data class ์ดํ•ดํ•˜๊ธฐ - Kenneths ๋‹˜ ๋ธ”๋กœ๊ทธ

Kotlin init์ด๋ž€? - Taehwan ๋‹˜ ๋ธ”๋กœ๊ทธ