DevLog ๐Ÿ˜ถ

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ์ •๋ฆฌ - Data Class, Companion Object, lateInit, val vs var ๋ณธ๋ฌธ

โœ๏ธ/Kotlin

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ์ •๋ฆฌ - Data Class, Companion Object, lateInit, val vs var

dolmeng2 2022. 10. 22. 01:24

- ์ฝ”ํ‹€๋ฆฐ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋„ˆ๋ฌด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๋ช‡ ๊ฐ€์ง€ ํŠน์ง•๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.


โœ”๏ธ Kotlin Data class

  • ๋ฐ์ดํ„ฐ์˜ ๋ณด๊ด€ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค.
  • ์ž๋™์œผ๋กœ toString(), hashCode(), equals(), copy() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • ํŠน์ง•
    • ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” 1๊ฐœ ์ด์ƒ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ”„๋กœํผํ‹ฐ๋Š” val ๋˜๋Š” var์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์— abstract, open, sealed, inner ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์—†๋‹ค.
    • ํด๋ž˜์Šค์—์„œ toString(), hashCode(), equals(), copy()๋ฅผ overrideํ•˜๋ฉด, ๊ทธ ํ•จ์ˆ˜๋Š” ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋Š” ์ƒ์† ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • toString()
    • ์ƒ์„ฑ์ž์˜ ํ•„๋“œ๋“ค๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‚ด๋ถ€์—์„œ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฒƒ์€ ์ ์šฉ X
  • copy()
    • ๊ฐ์ฒด์˜ ์–•์€ ๋ณต์‚ฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
    • copy์˜ ์ธ์ž๋กœ ์ƒ์„ฑ์ž์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋™์ผํ•œ ์ธ์ž๊ฐ€ ์„ธํŒ…๋œ๋‹ค.
    • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์„ฑ์ž์— ์ •์˜๋œ ํ•„๋“œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 


 

โœ”๏ธ Destructuring Declarations

  • ๊ฐ์ฒด ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ’์„ ๊บผ๋‚ด์„œ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹น์„ ํ•ด์ค„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ•์•ฝํ•˜์—ฌ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
val hello = Site("Kotlin", 20)
val (name, age) = hello
  • name = "Kotlin", age = 20
    • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ์ž ๋‚ด๋ถ€์— ์žˆ๋Š” ํ•„๋“œ๊ฐ’๋“ค์ด ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  • ๋™์ž‘ ์›๋ฆฌ)
    • componentN() - ์—ฌ๊ธฐ์„œ N์€ ์ˆซ์ž ๊ฐ’๋“ค์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
    • ์ฆ‰, ์œ„์˜ ๊ฐ’์€ val url = site1.component1()์ด๋ผ๊ณ  ๋‚ด๋ถ€์—์„œ ๋ณ€ํ™˜๋˜๋ฉฐ, component1() ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ site1์˜ ๊ฐ์ฒด์— ๋“ค์–ด๊ฐ€์žˆ๋Š” ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ํ˜•ํƒœ์ด๋‹ค.
  • ์ด๋•Œ, ์ƒ์„ฑ์ž์— ์„ ์–ธ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ ์œ„์น˜๋ฅผ ์ž˜ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 


โœ”๏ธ Companion Object

companion object {
    val initialCustomers = arrayOf(
    Customer(1, "Hello1"),
    Customer(2, "Hello2"),
    Customer(3, "Hello3"))
}
  • ์ž๋ฐ”์—์„œ์˜ static ํ‚ค์›Œ๋“œ๋ž‘ ๋น„์Šทํ•˜๋ฉด์„œ๋„ ๋‹ค๋ฅด๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ static ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ๋  ๋•Œ ํ•จ๊ป˜ ๋กœ๋”ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—†์ด๋„ ํด๋ž˜์Šค๋ช… + .์„ ํ†ตํ•ด ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์šฐ์„ , ์ฝ”ํ‹€๋ฆฐ์˜ object ํ‚ค์›Œ๋“œ๋ถ€ํ„ฐ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.
    • object ํ‚ค์›Œ๋“œ๋Š” ์‹ฑ๊ธ€ํ†ค ์„ ์–ธ ๋ฐฉ์‹์„ ๋ณด์žฅํ•œ๋‹ค.
    • ํŠน์ • ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ธฐ์กด์˜ ์„ ์–ธ์‹() ๋Œ€์‹ ์— {}๋ฅผ ํ™œ์šฉํ•œ ํ‘œํ˜„์‹์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • companion object๋Š” object์˜ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ๋กœ์„œ, ์ ‘๊ทผํ•  ๋•Œ ํด๋ž˜์Šค๋ช….name์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜, ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํด๋ž˜์Šค๋ช….Companion.name์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉฐ, ์ด๋ฅผ ์ถ•์•ฝํ•˜์—ฌ ํด๋ž˜์Šค๋ช….name์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.
    • ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๋Š” ์ผ์ข…์˜ ๋™๋ฐ˜ (Companion) ‘๊ฐ์ฒด’๋ผ๊ณ  ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ์ฒด!์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, companion object๋Š” ์œ„์—์„œ ๋งํ•œ ์ถ•์•ฝ ๊ทœ์น™ ๋•๋ถ„์— ๋‹จ์ˆœํžˆ ํด๋ž˜์Šค๋ช…์œผ๋กœ๋„ ์ฐธ์กฐ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค!
  • companion ๋Œ€์‹ ์— ๋‹ค๋ฅธ ์ด๋ฆ„ ํ• ๋‹น๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋””ํดํŠธ๊ฐ€ Companion)
  • ํด๋ž˜์Šค ๋‚ด์—์„œ companion Object๋Š” ๋”ฑ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 


โœ”๏ธ ์ดˆ๊ธฐํ™” ์ง€์—ฐ ๋ฐฉ๋ฒ•

  • lateinit
    • lateinit var hello : Hello
    • ๋ณ€์ˆ˜๋ฅผ ํ•„์š”ํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋ฉด Exception์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • var์—๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, primitive type์— ์ ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    • custom getter/setter ์„ค์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
      • ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„ ์‹œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ null check ํ›„ (null์ด๋ฉด Exception ๋ฐœ์ƒ) getXXX()๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐํ™” ์ „์— getter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ๋ง‰๋Š” ์šฉ๋„์ธ ๊ฒƒ ๊ฐ™๋‹ค.
    • null์ด ์•„๋‹Œ ํ”„๋กœํผํ‹ฐ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ? ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
      • nullable ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ ์‹œ null๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ์„ ๋•Œ null checking์„ ํ†ตํ•ด ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํŒ๋‹จ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • lazyinit
    • val hello : String by lazy {”hi”}
    • ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ์ •์˜ํ•˜์—ฌ, ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์‹œ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋ฉฐ ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
    • ๋‚ด๋ถ€์— {} ์ •์˜ํ•œ ๋ถ€๋ถ„์€ ๋ณ€์ˆ˜๊ฐ€ ์ฒ˜์Œ ์‚ฌ์šฉ๋  ๋•Œ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰์— ์„ ์–ธ๋œ ๊ฐ’์ด ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ํ• ๋‹น๋œ๋‹ค. ์ด๋•Œ, ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.
    • val ํ”„๋กœํผํ‹ฐ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • lazy์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค.

 


โœ”๏ธ ๋ณ€์ˆ˜ ์„ ์–ธํ•˜๊ธฐ

  • val
    • immutable type
    • ์ดˆ๊ธฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๋‚˜์ค‘์— ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์ž๋ฐ”์—์„œ์˜ final๊ณผ ๋น„์Šทํ•œ ๋Š๋‚Œ.
    • ์ดˆ๊ธฐํ™” ์‹œ ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ž…์„ ์ง€์ •ํ•ด์•ผ ๋˜๋ฉฐ, ๊ฐ’์„ ์ง€์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž… ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์„ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.
    • val hello : String
    • val hello = “Hello!”
  • var
    • mutable type
    • ์ดˆ๊ธฐ์— ๊ฐ’์„ ํ• ๋‹นํ•ด๋„ ์ถ”ํ›„์— ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 


โœ”๏ธ ์ฝ”ํ‹€๋ฆฐ์—์„œ ๋นˆ ๋“ฑ๋กํ•˜๊ธฐ

  • @Configuration + @Bean์„ ์ด์šฉํ•ด์„œ ๋“ฑ๋กํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ CGLIB๋ฅผ ํ†ตํ•ด์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„, ํ•ด๋‹น ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•ด ์ƒ์†์ด ๊ฐ€๋Šฅํ•ด์•ผ ๋œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, ์ฝ”ํ‹€๋ฆฐ์˜ ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋Š” final ํ‚ค์›Œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ™๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์† ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. → open ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

'โœ๏ธ > Kotlin' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Kotlin] ์ฝ”ํ‹€๋ฆฐ์˜ ๋ณ€์ˆ˜์™€ ํƒ€์ž…  (0) 2023.02.22
Comments