Skip to content

โ† ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๐ŸŸช Kotlin ์ƒ์„ธ ๊ฐ€์ด๋“œ โ€‹

"์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์„ ์ ๋ นํ•˜๊ณ  Java ์ƒํƒœ๊ณ„๋ฅผ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์žฌ์ •์˜ํ•œ ๋ชจ๋˜ ํ•ด๊ฒฐ์‚ฌ"


๐Ÿ’ก 1. 30๋…„์ฐจ ์„ ๋ฐฐ์˜ ์‰ฌ์šด ์„ค๋ช… โ€‹

์•ˆ๋“œ๋กœ์ด๋“œ ์Šค๋งˆํŠธํฐ ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ๊ณผ๊ฑฐ์—๋Š” ๋ฌด์กฐ๊ฑด ์ž๋ฐ”(Java)๋ฅผ ์ผ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”๋Š” ๋ฌธ๋ฒ•์ด ๋„ˆ๋ฌด ๊ธธ๊ณ , ์‚ฌ์†Œํ•œ ์‹ค์ˆ˜๋กœ NullPointerException (์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์•ฑ์ด ํŠ•๊ธฐ๋Š” ํ˜„์ƒ)์„ ์ผ์œผ์ผœ ์•…๋ช…์ด ๋†’์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์šฉ ๋„๊ตฌ ์ œ์ž‘ ์ „๋ฌธ ๊ธฐ์—…์ธ JetBrains๊ฐ€ ๋งŒ๋“ค๊ณ , ๊ตฌ๊ธ€์ด ๊ณต์‹ ํŒŒํŠธ๋„ˆ๋กœ ์ธ์ •ํ•œ ์–ธ์–ด๊ฐ€ ๋ฐ”๋กœ Kotlin(์ฝ”ํ‹€๋ฆฐ) ์ž…๋‹ˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ”์˜ ๋šฑ๋šฑํ•˜๊ณ  ๋ฌด๊ฑฐ์šด ์˜ท์„ ๋ฒ—๊ฒจ๋‚ด์–ด ๋ฌธ๋ฒ•์„ ๊ทน๋„๋กœ ์••์ถ•ํ–ˆ๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ Null์„ ์ ˆ๋Œ€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์•ˆ์ „๋ง์„ ๊ธฐ๋ณธ์œผ๋กœ ์„ธํŒ…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋ฉด ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค๊ณ  ์•ฑ์ด ์ฃฝ๋Š”(Crash) ํ™•๋ฅ ์ด ๋น„์•ฝ์ ์œผ๋กœ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

  • ๋น„์œ ํ•˜์ž๋ฉด: ์˜ค๋žซ๋™์•ˆ ์•ˆ์ „ํ•˜์ง€๋งŒ ๋ฌด๊ฒ๊ณ  ๋А๋ฆฐ ๋คํ”„ํŠธ๋Ÿญ(Java)์„ ์šด์ „ํ•˜๋˜ ๊ธฐ์‚ฌ์—๊ฒŒ, ๋˜‘๊ฐ™์ด ํŠผํŠผํ•˜๋ฉด์„œ๋„ ๋น ๋ฅด๊ณ  ์กฐ์ž‘์ด ์‰ฌ์šด ์ตœ์‹ ํ˜• SUV(Kotlin)๋ฅผ ์ฅ์–ด์ค€ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ 2. ์–ด๋””์— ์ฃผ๋กœ ์“ฐ์ด๋‚˜์š”? โ€‹

  1. ์•ˆ๋“œ๋กœ์ด๋“œ(Android) ์•ฑ ๊ฐœ๋ฐœ: ๊ตฌ๊ธ€์ด ๊ณต์‹ ์ธ์ •ํ•œ ํ‘œ์ค€ ์–ธ์–ด๋กœ, ๋ชจ๋ฐ”์ผ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” Jetpack Compose์™€ ๊ฒฐํ•ฉํ•ด ๋ฉ”์ธ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋˜ ์ž๋ฐ” ๋ฐฑ์—”๋“œ ๋Œ€์ฒด: ์ž๋ฐ”์™€ 100% ํ˜ธํ™˜๋˜๋ฏ€๋กœ, ๊ธฐ์กด ์ž๋ฐ” Spring Boot ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ์— ์ž๋ฐ” ๋Œ€์‹  ๋„์ž…ํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ณ  ์„ธ๋ จ๋œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

โš–๏ธ 3. ์žฅ์ ๊ณผ ๋‹จ์  (์„ ๋ฐฐ์˜ ์†”์ง ํ•œ๋งˆ๋””) โ€‹

  • ์žฅ์  (์ž๋ฐ”์˜ ์™„๋ฒฝํ•œ ์ƒ์œ„ ํ˜ธํ™˜):
    • ์ž๋ฐ”์™€์˜ 100% ๊ณต์กด: ๊ธฐ์กด์— ์“ฐ๋˜ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ž๋ฐ” ํŒŒ์ผ๋“ค์„ ์•„๋ฌด๋Ÿฐ ํ˜ธํ™˜ ๋ฌธ์ œ ์—†์ด ๊ทธ๋Œ€๋กœ ์„ž์–ด์„œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋„ ์•ˆ์ „์„ฑ(Null Safety): ์ปดํŒŒ์ผ ํƒ€์ž„์— Null ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ•๊ฒฉํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ์•ฑ์˜ ํŠ•๊น€ ์‚ฌ๊ณ ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์  (์ปดํŒŒ์ผ ์ฒด๊ฐ):
    • ์ดˆ๊ธฐ ๋นŒ๋“œ ์†๋„: ์ž๋ฐ” ์ปดํŒŒ์ผ ์†๋„์— ๋น„ํ•˜๋ฉด ์ฒซ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์‚ด์ง ๋” ์†Œ์š”๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ 4. ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ์ฒซ๊ฑธ์Œ ์ฝ”๋“œ โ€‹

์ฝ”ํ‹€๋ฆฐ์˜ ํ•ต์‹ฌ์ ์ธ ๋„ ์•ˆ์ „์„ฑ(Null Safety) ๋ฌธ๋ฒ• ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

kotlin
fun main() {
    // 1. ๊ธฐ๋ณธ ์„ ์–ธ์€ Null์„ ์ ˆ๋Œ€ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    var normalName: String = "Kotlin Senior"
    // normalName = null // โŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ! (Null ๋Œ€์ž… ์ฐจ๋‹จ)

    // 2. ํƒ€์ž… ๋’ค์— ๋ฌผ์Œํ‘œ(?)๋ฅผ ๋ถ™์—ฌ์•ผ๋งŒ Null์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    var nullableName: String? = null

    // 3. Null์ผ ์ˆ˜๋„ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์•ˆ์ „ ํ˜ธ์ถœ ๊ธฐํ˜ธ(?.)๋ฅผ ์”๋‹ˆ๋‹ค.
    println(nullableName?.length) // Null์ด๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฑ‰๋Š” ๋Œ€์‹  null ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ด
    
    // 4. ์—˜๋น„์Šค ์—ฐ์‚ฐ์ž(?:)๋กœ Null์ผ ๋•Œ์˜ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    val nameLength = nullableName?.length ?: 0
    println("์ด๋ฆ„ ๊ธธ์ด: $nameLength")
}

๐ŸŽฏ 5. ์ดˆ๋ณด์ž ์ถ”์ฒœ ๊ณต๋ถ€ ๋ฐฉํ–ฅ โ€‹

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”(Java) ์–ธ์–ด๊ฐ€ ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์ƒ๊ฒผ๋Š”์ง€ ๊ฐ€๋ณ๊ฒŒ ๋น„๊ตํ•ด ๋ณด๋ฉด์„œ ํ•™์Šตํ•˜๋ฉด ์ฝ”ํ‹€๋ฆฐ์ด ์ œ๊ณตํ•˜๋Š” ๋ฌธ๋ฒ•์  ํŽธ์˜์„ฑ(Lombok ๋ถˆํ•„์š”, Getter/Setter ์ž๋™ ๋“ฑ)์„ ํ›จ์”ฌ ์ž˜ ์ฒด๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ฝ”๋ฃจํ‹ด(Coroutine) ์ด๋ผ๋Š” ๊ฐ€๋ฒผ์šด ๋น„๋™๊ธฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ตํ˜€๋‘๋ฉด, ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๊ณผ ๋ฐ์ดํ„ฐ ๋กœ๋“œ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ค๋ฌด ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์˜ ์ฝ”์–ด ๊ธฐ์ˆ ์„ ์ตํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ตฌ๊ธ€ ๊ณต์‹ ๊ฐœ๋ฐœ์ž ์›น์‚ฌ์ดํŠธ์˜ ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ ๋žฉ ๊ณผ์ •(Android Basics in Kotlin)์„ ๋ฌด๋ฃŒ๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์‹ค์Šตํ•˜๋Š” ๊ฒƒ์„ ๊ถŒํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ง€์‹DB โ€” ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์œ„ํ•ด