์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

fun main(args: Array<String>) {
    println("Hello, World!")
}
[1]

๊ณต์‹ ์‚ฌ์ดํŠธ

1. ์†Œ๊ฐœ2. ๋ฌธ๋ฒ•3. ํŠน์ง•
3.1. ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•3.2. ์•ˆ์ „์„ฑ3.3. ๊ทธ ์™ธ
4. ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ5. ๊ธฐํƒ€6. ๊ด€๋ จ ๋ฌธ์„œ7. ๋ฐ”๊นฅ ๋งํฌ

1. ์†Œ๊ฐœ[ํŽธ์ง‘]

IntelliJ IDEA์˜ ๊ฐœ๋ฐœ์‚ฌ JetBrains์—์„œ 2011๋…„์— ๊ณต๊ฐœํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด. Java์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์„ธ๋ฏธ์ฝœ๋ก ์€ ์˜ต์…˜์ด๋‹ค. JVM ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์ด๋ฉฐ, Java์™€์˜ ์ƒํ˜ธ ์šด์šฉ์ด 100% ์ง€์›๋œ๋‹ค. JVM ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ๊ธฐ๋ณธ์ด์ง€๋งŒ, Kotlin/Native ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๊ณ„์–ด๋กœ ์ตœ์ข…์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ, ํ†ฐ์บฃ[3], JavaScript, Java EE, HTML5, iOS, ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด ๋“ฑ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ˜„์žฌ ์ตœ์‹  ๋ฒ„์ „์€ 1.4.20.

2017๋…„์— ๊ตฌ๊ธ€์ด ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๊ณต์‹ ์–ธ์–ด๋กœ Kotlin์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ์ด๋Š” ์˜ค๋ผํด๊ณผ์˜ Java API ์ €์ž‘๊ถŒ ๋ถ„์Ÿ์˜ ์—ฌํŒŒ๋กœ ๋ณด๋Š” ์‹œ๊ฐ์ด ๋งŽ๋‹ค. 2018๋…„ ์นด์นด์˜ค๊ฐ€ ์นด์นด์˜คํ†ก ๋ฉ”์‹œ์ง• ์„œ๋ฒ„์— Kotlin์„ ์‚ฌ์šฉํ•ด ๋ณธ ๊ฒฐ๊ณผ, ์ฝ”๋“œ๋Ÿ‰์ด ๋น„์•ฝ์ ์œผ๋กœ ๊ฐ์†Œํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์ด ๋Œ€ํญ ํ–ฅ์ƒ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. # 2019๋…„ 1์›”๋ถ€ํ„ฐ๋Š” ๊ตฌ๊ธ€ ๋‚ด๋ถ€์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ๋„ Java ๋Œ€์‹  Kotlin์„ ์‚ฌ์šฉํ•œ๋‹ค. # ์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต์‹ ๋ฌธ์„œ์˜ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋„ Java๋ณด๋‹ค Kotlin์œผ๋กœ ์ž‘์„ฑ๋œ ์˜ˆ์ œ๊ฐ€ ๋จผ์ € ๋‚˜์˜จ๋‹ค. ์˜ˆ์‹œ

์ด๋ฆ„์€ JetBrains์˜ R&D ์„ผํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ ์ƒํŠธํŽ˜ํ…Œ๋ฅด๋ถ€๋ฅดํฌ ๊ทผ์ฒ˜์˜ ์ฝ”ํ‹€๋ฆฐ(ะšะพฬั‚ะปะธะฝ) ์„ฌ์—์„œ ๋”ฐ์™”๋‹ค. Andrey Breslav(ะะฝะดั€ะตะน ะ‘ั€ะตัะปะฐะฒ)์˜ ๋ฐœํ‘œ ์ฐธ๊ณ  Java๊ฐ€ ์ธ๋„๋„ค์‹œ์•„์˜ ์„ฌ์ด๋ผ๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹ค๋ถ„ํžˆ Java๋ฅผ ์˜์‹ํ•œ ๋“ฏํ•œ ์ด๋ฆ„.

2. ๋ฌธ๋ฒ•[ํŽธ์ง‘]

3. ํŠน์ง•[ํŽธ์ง‘]

  • ์žฅํ™ฉํ–ˆ๋˜ Java์™€ ๋น„๊ตํ•˜๋ฉด ๋ˆˆ๋ฌผ๋‚  ์ •๋„๋กœ ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค.
  • ์˜ค๋ฒ„ํ—ค๋“œ ์—†๋Š” ๋„ ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. Kotlin์˜ ๋ณ€์ˆ˜๋Š” Nullable(๋„ ๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)๊ณผ NotNull(๋„ ๊ฐ’ ์‚ฌ์šฉ ๋ถˆ๊ฐ€)๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ '?'๋ฅผ ๋ถ™์—ฌ Nullable๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Swift์—์„œ๋„ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์“ฐ๋Š”๋ฐ Kotlin ์ชฝ์ด ์ œ์•ฝ์ด ์ข€ ๋œํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๋‹ค.
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. JSONObject๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ˆˆ๋ฌผ์ด ๋‚œ๋‹ค...
  • ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  • Java์˜ 'Integer'๋‚˜ 'Double'์ฒ˜๋Ÿผ primitive type์„ ์œ„ํ•œ ๋ณ„๋„์˜ wrapper class๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“  primitive type์€ ๊ฐ์ฒด ์ทจ๊ธ‰์„ ๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ Int ๊ฐ™์€ ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด์— ํ• ๋‹น๋œ toString ํ•จ์ˆ˜ ๋“ฑ์„ ๋ฐ”๋กœ๋ฐ”๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ™•์žฅํ•จ์ˆ˜, ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ง€์›ํ•œ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด intํ˜•์„ ํ™•์žฅํ•ด 'i = 3 power 4' ๊ฐ™์€ ์‹์œผ๋กœ ์ƒˆ ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.[4]
  • API ๋ฌธ์„œ์— Java์˜ HTML ๋Œ€์‹  Markdown์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • == ์—ฐ์‚ฐ์ž๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค.
    Java์—์„œ๋Š” String i์™€ String j๊ฐ€ ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ๋‹ด๊ณ  ์žˆ์–ด๋„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ i == j๋Š” false๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์“ฐ๋Š” ํ•จ์ˆ˜๊ฐ€ equals()์ธ๋ฐ, Kotlin์—์„œ ==๋Š” equals()์™€ ๋˜‘๊ฐ™์ด, ์ฆ‰ content equality๋กœ ์ž‘๋™ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ i == j๋Š” true๋‹ค. Java์ฒ˜๋Ÿผ identity equality๋ฅผ ๋น„๊ตํ•˜๋ ค๋ฉด ===๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. !=๋ฅผ ์“ฐ๋ ค๋ฉด !==๋ฅผ ์“ฐ์ž.
  • static ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค. companion object๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค. Java ์ฝ”๋“œ์—์„œ ์ ‘๊ทผํ•˜๋ ค๋ฉด 'ํด๋ž˜์Šค๋ช….Companion.๋ฉ”์„œ๋“œ_ํ˜น์€_get๋ณ€์ˆ˜๋ช…()' ๋˜๋Š” @JvmStatic annotation์„ ์“ฐ๋ฉด ๋œ๋‹ค.
  • Java 6์— ํ˜ธํ™˜๋œ๋‹ค.[5]
  • Java์™€์˜ ์ƒํ˜ธ ์šด์šฉ์ด 100% ์ง€์›๋œ๋‹ค.[6]

3.1. ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•[ํŽธ์ง‘]

  • getter์™€ setter๋ฅผ ๋ฐฐ์ œํ–ˆ๋‹ค. ๊ทธ๋ƒฅ ์“ฐ์ง€ ๋ง๋ผ๊ณ  IntelIiJ์˜ ์ฝ”๋“œ ์ œ๋„ˆ๋ ˆ์ดํŠธ(Alt+Insert)์—์„œ ๋นผ๋ฒ„๋ ธ๋‹ค. ๋ฌผ๋ก  ์“ฐ๋ ค๋ฉด ๋‹น์—ฐํžˆ ์“ธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ตฌ๊ธ€์€ Java์—์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ์™€ ์†๋„ ๋ฉด์—์„œ ์ € ๋‘˜์„ ์“ฐ์ง€ ๋ง๊ณ  ๊ทธ๋ƒฅ ๋ณ€์ˆ˜๋ฅผ public์œผ๋กœ ํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•ด ์™”๋‹ค.[7]
  • ํด๋ž˜์Šค์˜ getters, setters, equals(), hashCode(), toString()๊ณผ copy()๋ฅผ ํ•œ ์ค„๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค! ๋ณ€์ˆ˜(var) ๋ฐ ์ƒ์ˆ˜(val)๋กœ ์ง€์ •๋œ ์ƒ์„ฑ์ž ํŒจ๋Ÿฌ๋ฏธํ„ฐ๋Š” ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜/์ƒ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.
data class Customer(var name: String, var email: String, var company: String)
  • ๋žŒ๋‹ค ์‹์„ ์ง€์›ํ•œ๋‹ค.
  • ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์˜ ๊ฐ์ฒด๋ฅผ object๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
object ThisIsASingleton {
    val companyName: String = "JetBrains"
}
  • in๊ณผ Range๋ฌธ์ด ์žˆ๋‹ค.
if (i in 1..10) { // equivalent of 1 <= i && i <= 10
    println(i)
}
  • for๋ฌธ์—๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค!
for (i in 0..12 step 3) print("$i ") // 0 3 6 9 12 ์ถœ๋ ฅ
for (i in 12 downTo 0 step 2) print("$i ") // 12 10 8 6 4 2 0 ์ถœ๋ ฅ
  • switch/case๊ฐ€ when ->์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค. ์œ„์˜ in๊ณผ Range๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
when (x) {
    0, 1 -> print("boolean")
    2 -> print("์ฝฉ\n์ฝฉ")
    !in 1..9 step 2 -> print("ํ™€์ˆ˜ ์•„๋‹˜")
    in 0..9 -> print("ํ•œ์ž๋ฆฟ์ˆ˜")
    else -> print("otherwise")
}
  • is ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋‹ค. ํƒ€์ž… ์ฒดํฌ, ์ž๋™ ํ˜•๋ณ€ํ™˜ ๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
npcContainer.forEach { npc ->
    if (npc is Visible) npc.drawBody(gc, g) // npc๊ฐ€ Visibleํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜์—ˆ๋‹ค.
    if (npc is Glowing) npc.drawGlow(gc, g) // npc๊ฐ€ Glowingํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜์—ˆ๋‹ค.
}
  • when๋ฌธ์—๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
when (expr) {
    is Num -> expr.value // expr์ด Numํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜์—ˆ๋‹ค.
    is Sum -> eval(expr.left) + eval(expr.right) // expr์ด Sumํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜์—ˆ๋‹ค.
    else -> throw IllegalArgumentException("ํ‰ค์—์—ฃ")
}
  • if๋ฌธ์ด ํ‘œํ˜„์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
val max = if (a > b) { 
        print("Choose a") 
        a 
    } 
    else { 
        print("Choose b") 
        b 
    }

3.2. ์•ˆ์ „์„ฑ[ํŽธ์ง‘]

  • Null ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์•Œ์•„์„œ ๋ณดํ˜ธํ•ด์ค€๋‹ค. Java์—์„œ ๊ฐ€์ ธ์˜จ ํด๋ž˜์Šค ๋“ฑ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ณ€์ˆ˜๋ช…?๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ์•ˆ์˜ ๋ฉ”์†Œ๋“œ๋‚˜ ๋ณ€์ˆ˜ (ex. length)๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ ๋ณ€์ˆ˜๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋Ÿฐํƒ€์ž„ NullPointerException์˜ ๊ณ ํ†ต์„ ๋œ์–ด์ฃผ๋Š” ๊ณ ๋งˆ์šด ๊ธฐ๋Šฅ์ด๋‹ค.
return b?.length //b๊ฐ€ null์ด๋ฉด null ๋ฆฌํ„ด
  • ์˜ค๋ฅ˜ ๋ฐฉ์ง€๋กœ null-safe ์—ฐ์‚ฐ์ž๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค. (ex. s as String?)
  • ์•ˆ์ „ํ•œ ํ˜•๋ณ€ํ™˜ ํ‚ค์›Œ๋“œ์ธ as? ๊ฐ€ ์กด์žฌํ•œ๋‹ค. (ex. s as? String)
/*
null์ด๊ฑฐ๋‚˜ null์€ ์•„๋‹ˆ์ง€๋งŒ ๋Œ€์ƒ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜๋  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์€
ํ˜•๋ณ€ํ™˜์ด ์‹คํŒจํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜๊ฒŒ null์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
*/
null as? String // null
"string" as? File // null

/*
๋ฐ˜๋ฉด as๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผ kotlin.TypeCastException์ด๋‚˜
java.lang.ClassCastException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค
*/
null as File // kotlin.TypeCastException ์˜ˆ์™ธ ๋ฐœ์ƒ
null as File? // null
"string" as File // java.lang.ClassCastException ์˜ˆ์™ธ ๋ฐœ์ƒ
"string" as File? // java.lang.ClassCastException ์˜ˆ์™ธ ๋ฐœ์ƒ

3.3. ๊ทธ ์™ธ[ํŽธ์ง‘]

  • new ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋‹ค.
  • ์„ธ๋ฏธ์ฝœ๋ก ์ด ํ•„์š”์—†๋‹ค.[8]
  • Function parameter๊ฐ€ immutableํ•œ val์ด๋‹ค.
  • System.out.println/printf ๋“ฑ์ด println/printf ๋“ฑ์œผ๋กœ ์ค„์—ˆ๋‹ค.
  • String์—์„œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” interpolation($)์„ ์ง€์›ํ•œ๋‹ค.
val name: String = "Wikineet"
val greet_en: String = "Hello, $name!"
val greet_ko: String = "${name}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”!"
println(greet_en) // ์ถœ๋ ฅ: Hello, Wikineet!
println(greet_ko) // ์ถœ๋ ฅ: Wikineet๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”!
  • Nullable์ด ์•„๋‹Œ ๋ณ€์ˆ˜์—์„œ null ์‚ฌ์šฉ์‹œ ์˜ค๋ฅ˜๋ฅผ ๋ฑ‰์–ด๋‚ธ๋‹ค.
var a: String = "abc"
a = null // ์ปดํŒŒ์ผ ์—๋Ÿฌ
  • ?์„ ์‚ฌ์šฉํ•ด Nullable๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ์“ธ ์ˆ˜ ์žˆ๋‹ค.
var b: String? = "abc"
b = null // ok
  • Elvis ์—ฐ์‚ฐ์ž(?:)๊ฐ€ ์กด์žฌํ•œ๋‹ค.
val testee_hometown: String? = null // ์—ฌ๊ธฐ์— ์ ์ ˆํ•œ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด '<ํ”ผ์‹คํ—˜์ž ๊ณ ํ–ฅ ์ง€๋ช…>' ๋Œ€์‹  ๋„ฃ์€ ๊ฐ’์ด ํ‘œ์‹œ๋œ๋‹ค.
val hometown_display = testee_hometown ?: "<ํ”ผ์‹คํ—˜์ž ๊ณ ํ–ฅ ์ง€๋ช…>" // testee_hometown์ด null์ธ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. null์ด๋ฉด ์—ฐ์‚ฐ์ž์˜ ์šฐ๋ณ€์— ์žˆ๋Š” ๊ฐ’์ด ๋Œ€์‹  ๋Œ€์ž…๋œ๋‹ค.
println("์ด ์žฅ์น˜๋Š” ${hometown_display}์— ์‚ฌ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์†Œ๋“ ๊ธˆ์•ก์„ ํ•ฉ์นœ ๊ฒƒ๋ณด๋‹ค ๋” ๋น„์Œ‰๋‹ˆ๋‹ค.")

4. ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ[ํŽธ์ง‘]

JetBrains์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ตฌ๊ธ€์ด ๋ฐ€์–ด์ฃผ๋Š” ์–ธ์–ด์ธ ๋งŒํผ ์ด์ชฝ์— ํŠนํ™”๋œ ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฃผ๋กœ ์ง€์›๋œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด IntelliJ IDEA์™€ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค. ์ดํด๋ฆฝ์Šค์—์„œ๋„ Kotlin ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ๊ธฐํƒ€[ํŽธ์ง‘]

  • ๊ฐ€์ƒ๋จธ์‹ ์„ ์ด์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์ด๋‚˜ ์ž„๋ฒ ๋””๋“œ, IoT ํ™˜๊ฒฝ์„ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ Kotlin/Native ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๊ธฐ๊ณ„์–ด ์ตœ์ข… ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. LLVM์— ๊ธฐ๋ฐ˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ฐธ์กฐ ํšŸ์ˆ˜ ์นด์šดํŒ… ๋ฐฉ์‹์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. iOS๋‚˜ Raspberry Pi ๊ฐœ๋ฐœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ตœ์‹  ์–ธ์–ด์—์„œ ๊ฐœ๋ฐœ๋œ ์–ธ์–ด ๋””์ž์ธ ์ปจ์…‰๋“ค์„ ๋งŽ์ด ํ™œ์šฉํ–ˆ์ง€๋งŒ, ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค๊ฑฐ๋‚˜ ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ๋–จ์–ด์ง€๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ฑฐํ•ด ์–ธ์–ด ์ž์ฒด๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ํˆด๋ง์„ ๊ฐ•ํ™”ํ•œ ์–ธ์–ด๋ผ๋Š” ํ‰๊ฐ€๋ฅผ ๋ฐ›๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ณธ๋ฌธ์— ์†Œ๊ฐœ๋œ Kotlin์˜ ?(null ์•ˆ์ „์„ฑ)๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ Scala์— ์ด๋ฏธ ์กด์žฌํ–ˆ๋˜ ๊ธฐ๋Šฅ๋“ค์ด๊ณ , ๋ฐ˜๋Œ€๋กœ Scala์— ์กด์žฌํ•˜์ง€๋งŒ Kotlin์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์€ ์ •๋ง ๋งŽ๋‹ค.[13]
  • ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด Kotlin ์งˆ๋ฌธ๋“ค์€ ๊ฑฐ์˜ ์—†๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, Java์™€ Kotlin์€ ์„œ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต์ด ์•ˆ ๋‚˜์˜จ๋‹ค๋ฉด Java๋กœ ์งˆ๋ฌธ๋œ ๋ฌธ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.
  • Kotlin๊ณผ IntelliJ IDEA๋ฅผ ๋งŒ๋“  JetBrains์—์„œ ์ œ์ž‘ํ•œ ์ฝ”ํ‹€๋ฆฐ ์ „์šฉ ์›น ํ”„๋ ˆ์ž„์›Œํฌ Ktor๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • Java์™€ ์ƒํ˜ธ ํ˜ธํ™˜๋˜๋Š” ์–ธ์–ด์ธ๋งŒํผ JetBrains์˜ Java, Kotlin IDE์ธ IntelliJ IDEA์— Java ์ฝ”๋“œ๋ฅผ Kotlin ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์กด์žฌํ•œ๋‹ค.[15]

6. ๊ด€๋ จ ๋ฌธ์„œ[ํŽธ์ง‘]

7. ๋ฐ”๊นฅ ๋งํฌ[ํŽธ์ง‘]

[1] ์ฝ”ํ‹€๋ฆฐ ๋ฒ„์ „ 1.3๋ถ€ํ„ฐ main ๋ฉ”์„œ๋“œ์— ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์—†์–ด๋„ ์‹คํ–‰๋œ๋‹ค. 1.3 ์ดํ›„์—์„  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์—ฌ๋„ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.
fun main() {
    println("Hello World!")
}
[2] ๋ ˆ๊ฒŒ์™€๋Š” ๋‹ค๋ฅด๋‹ค! ๋ ˆ๊ฒŒ์˜ ๋ฆฌ๋“ฌ์„ ์ฐจ์šฉํ•ด ๋งŒ๋“  ๋ผํ‹ด ํด๋Ÿฝ์Œ์•… ์žฅ๋ฅด์ด๋‹ค. ๋ ˆ๊ฒŒํ†ค ์Œ์•…์„ ๋’ค์ง€๋‹ค ๋ณด๋ฉด Despacito์™€ ๊นœ์ง ๋†€๋ž„ ๋งŒํผ ๋น„์Šทํ•œ ์Œ์•…์ด ์Ÿ์•„์ ธ ๋‚ด๋ฆฐ๋‹ค.
[3] JVM ํ™˜๊ฒฝ์—์„œ๋„ ๋Œ์•„๊ฐ„๋‹ค.
[4] ์‹ค์ œ๋กœ๋Š” ์ƒˆ infix ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ์‚ฌ์น™์—ฐ์‚ฐ ๋˜ํ•œ infix ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋˜์–ด 'a * 3'์œผ๋กœ๋„, 'a.times(3)'์œผ๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์—ฐ์‚ฐ์ž์™€ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ๋„ ์ด infix ํ•จ์ˆ˜๋กœ ๋Œ์•„๊ฐ„๋‹ค.
[5] JVM6๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค. JVM8 ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
[6] Kotlin์—์„œ Java ์ฝ”๋“œ ์‚ฌ์šฉ ์‹œ์—๋Š” ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Java์—์„œ Kotlin ์ฝ”๋“œ ์‚ฌ์šฉ ์‹œ์—๋Š” @Jvm* ๊ณ„์—ด์˜ annotation ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
[7] ๋ณ€์ˆ˜๋ฅผ private์œผ๋กœ ์„ ์–ธํ•ด๋†“์œผ๋ฉด ์ ‘๊ทผํ•  ๋•Œ getXX() ๋˜๋Š” setXX() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•˜๋ฏ€๋กœ public์œผ๋กœ ์„ ์–ธํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ์˜ ๋™์ž‘์€ ์ฒด๊ฐํ•˜๊ธฐ ์–ด๋ ค์šธ ์ง€ ๋ชฐ๋ผ๋„ ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ์ฝ”๋“œ์—์„œ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.
[8] ๋„ฃ์–ด๋„ ์˜ค๋ฅ˜๋Š” ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
[9] 1996๋…„ ๋จธ๋ผ์ด์–ด ์บ๋ฆฌ์™€ ๋ณด์ด์ฆˆ ํˆฌ ๋ฉ˜์˜ One Sweet Day ์—ญ์‹œ 16์ฃผ ์—ฐ์† 1์œ„๋ผ๋Š” ์‹ ๊ธฐ๋ก์„ ๊นผ์œผ๋‚˜ ๋กœ์Šค ๋ธ ๋ฆฌ์˜ค์˜ Macarena์— ๋ฐ€๋ ค ์—ฐ๋ง ์ฐจํŠธ์—์„œ๋Š” 2์œ„๋ฅผ ์ฐจ์ง€ํ•ด์•ผ ํ–ˆ๋‹ค.
[10] Shakira์˜ Chantaje์™€, ๋ฎค์ง ๋น„๋””์˜ค์˜ ์กฐํšŒ์ˆ˜๊ฐ€ ๋…ธ๋ž˜์˜ ์ธ๊ธฐ์— ๋น„ํ•ด ์ž˜ ์•ˆ ๋‚˜์˜ค๋Š” ์นด๋”” ๋น„์˜ ๊ฒฝ์šฐ๋„ I Like It์ด ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ด๋‹ค. ํ•ด๋‹น ๋ฎค์ง ๋น„๋””์˜ค๋Š” ๊ทธ๋…€์˜ ์œ ์ผํ•œ 10์–ต ์กฐํšŒ์ˆ˜ ๋ฎค์ง๋น„๋””์˜ค์ด๋‹ค.
[11] ์ด์™ธ์—๋„ ๋งˆ๋ฃฌ 5์˜ ๋Œ€ํ‘œ๊ณก 'Sugar'๋„ ์ œ๋ชฉ์ด 'Hacked by Kuroi'SH & Prosox' ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.
[12] ํ˜„์žฌ ์œ ํŠœ๋ธŒ์—์„œ Despacito ์ด์™ธ์—๋Š” 60์–ต ํšŒ๋ฅผ ๋‹ฌ์„ฑํ•œ ์˜์ƒ์€ ์ƒ์–ด ๊ฐ€์กฑ์˜ ์˜์–ด ๋ฒ„์ „์ธ Baby Shark ํ•˜๋‚˜๋ฟ์ด๊ณ , 50์–ต ํšŒ ์ด์ƒ๋„ ์—๋“œ ์‹œ๋Ÿฐ์˜ Shape of You ํ•˜๋‚˜ ๋ฟ์ด๋‹ค. ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€ ์ถ”์ด๊ฐ€ ์ƒ๋‹นํžˆ ๋นจ๋ผ ์กฐ๋งŒ๊ฐ„ ์กฐํšŒ์ˆ˜์—์„œ Despacito๋ฅผ ์ถ”์›”ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค
[13] ?๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ž„๊ณผ ๋™์‹œ์— ํƒ€์ž…์‹œ์Šคํ…œ ์ƒ์˜ ๋…ผ๋ฆฌ์ ์ธ ์˜ค๋ฅ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์•ˆ์ •์„ฑ์— ๊ทน๋„๋กœ ๊ณต์„ ๋“ค์ด๋Š” Scala ๊ฐ™์€ ์–ธ์–ด์—์„œ ๋„์ž…ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์—†๋‹ค. Scala 2์—์„œ null์— ๋Œ€์ฒ˜ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํ•œ ๋นŒํŠธ์ธ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ธ Option ํƒ€์ž…์ด๊ณ , ์–ธ์–ด ์ž์ฒด์— null ์•ˆ์ •์„ฑ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์€ ์—†๋‹ค. ํ•˜์ง€๋งŒ Scala 3์—์„œ๋Š” `-Yexplicit-nulls` ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ํƒ€์ž… ์œ„๊ณ„๋ฅผ ์™„์ „ํžˆ ๋ฐ”๊พธ์–ด์„œ ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์ด๋ผ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ nullableํ•˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ, Null์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด `String|Null` ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ํƒ€์ž…์‹œ์Šคํ…œ์— ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ null ์•ˆ์ •์„ฑ์„ ์–ป์€ ์—ฐ๊ตฌ ์„ฑ๊ณผ์ด๋‹ค.
[14] ์ด๋Š” ์‡ผ๋ฏธ๋”๋จธ๋‹ˆ์™€ ํ”„๋กœ๋“€์Šค 101์˜ ์˜ํ–ฅ์ด ํฐ๋ฐ, ์‡ผ๋ฏธ๋”๋จธ๋‹ˆ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํ•œ๊ตญํž™ํ•ฉ์— ๋Œ€ํ•œ ์žฌ์กฐ๋ช…์„ ์ด‰๋ฐœ์‹œํ‚ค๋ฉฐ ์ข…๋ž˜์˜ ์•„์ด๋Œํž™ํ•ฉ์ด ์•„๋‹Œ ์–ธ๋”ํž™ํ•ฉ๋“ค์ด ์ฃผ๋ฅ˜๋กœ ์˜ฌ๋ผ์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , ํž™ํ•ฉ์ด ํ•˜๋‚˜์˜ ํ™”๋‘๊ฐ€ ๋˜๋ฉด์„œ ๊ด€๋ จํ•œ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ปจํ…์ธ ๋“ค์ด ์šฐํ›„์ฃฝ์ˆœ ๋‚œ๋ฆฝํ–ˆ๋‹ค. ๋˜ํ•œ ๋™์‹œ์— ํ”„๋กœ๋“€์Šค 101์ด ๋Œ€๋ฐ•์„ ์น˜๋ฉด์„œ ์ฃผ๋กœ ์—ฌ์ž ์•„์ด๋Œ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ๊ฐ์ข… ์ปจํ…์ธ ๋‚˜ ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ๋˜๋‹ค์‹œ ๋Œ€์ค‘๋งค์ฒด๋ฅผ ์ ๋ นํ•ด๋ฒ„๋ ธ๋‹ค. ์ž์—ฐํžˆ ๋ฌผ๊ฑด๋„ˆ์˜ ํŒ์€ ๊ด€์‹ฌ์—์„œ ๋ฉ€์–ด์ง€๊ฒŒ ๋œ ๊ฒƒ. ๋”๋ถˆ์–ด V์•ฑ ๋“ฑ ํ•œ๊ตญ๊ฐ€์š”์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ์žฌ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ๋“ค์ด ๋ฐœ๋‹ฌํ•˜๊ฒŒ ๋˜๋‹ˆ ์ผ์„  ๊ฐ€์ˆ˜๋“ค์ด ์ง์ ‘ ํŒ์„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๋Š”ํ•œ ํŒ์— ์ฃผ๋ชฉํ•  ์—ฌ๊ฑด์ด ์•„๋‹ˆ๊ฒŒ ๋œ ์…ˆ.
[15] ์ด ๊ธฐ๋Šฅ์€ IntelliJ IDEA๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ IDE์ธ Android Studio์—๋„ ์กด์žฌํ•œ๋‹ค.
[16] ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ™์ด ์žˆ๋˜ ์ด์ˆ˜๊ทผ๊ณผ ์ •ํ˜•๋ˆ์ด ์ด ๋…ธ๋ž˜๋ฅผ ๋ชจ๋ฅธ๋‹ค๊ณ  ํ•˜์—ฌ์„œ ์ถฉ๊ฒฉ๋จน์—ˆ๋‹ค.
[17] ์ „ํ˜„๋ฌด๋Š” Despacito๋ž€ ๋…ธ๋ž˜๋ฅผ ์ฒ˜์Œ ๋“ฃ๋Š”๋‹ค๊ณ  ํ–ˆ๋‹ค.
[18] ํ•œ๊ตญ์€ ์•„๋‹ˆ์ง€๋งŒ ์„ ์ˆ˜๋ณ„ ๋“ฑ์žฅ๊ณก์ด ์‚ด์•„์žˆ๋Š” ์ผ๋ณธํ”„๋กœ์•ผ๊ตฌ๋ฅผ ๋ณด๋ฉด ์ค‘๋‚จ๋ฏธ ์ชฝ ์„ ์ˆ˜๋“ค์ด ์ด ๋…ธ๋ž˜๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์ด ๋“ฑ์žฅ๊ณก์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋งˆ KBO์—์„œ๋„ ๋“ฑ์žฅ๊ณก ๋ฌธํ™”๊ฐ€ ์‚ด์•„๋‚จ์•˜๋”๋ผ๋ฉด ์šฉ๋ณ‘ ์„ ์ˆ˜๋“ค์ด ๊ฝค ๋“ฑ์žฅ๊ณก์œผ๋กœ ์ผ๊ฒ ์ง€๋งŒ..