[ ] π₯λͺ©ν
Spring Boot + JPA + Kafka with Kotlin
[ ] π³Dockerizingλ₯Ό ν΅ν μ¬μ΄ λ°°ν¬μ ν μ€νΈ ν경ꡬμ±
μ½νλ¦°μ΄λ?
JetBrainμμ λ³μ μλ‘μ΄ νλ‘κ·Έλλ° μΈμ΄μ΄λ€. νΉμ§μΌλ‘λ Java νλ«νΌμμ μ¬μ©μ΄ κ°λ₯νλ©° Javaλ₯Ό λ체ν μ μλ μΈμ΄μ΄λ€.
μ½νλ¦°μ μ² ν
μ€μ©μ±
μ½νλ¦°μ νμ μ μ΄κ³ μλ‘μ΄ κΈ°μ λ‘ λ§λ€μ΄μ§ μΈμ΄κ° μλλ€. κΈ°μ‘΄μ μ°λ¦¬κ° μ¬μ©νκ³ μκ³ μ±κ³΅ν νλ‘κ·Έλλ° μΈμ΄μμ μ±νν μ΄λ―Έ μ±κ³΅μ μΌλ‘ κ²μ¦λ ν΄λ²κ³Ό κΈ°λ₯μ μμ‘΄ν΄μ λ§λ€μ΄μ‘λ€. κ·Έλ κΈ° λλ¬Έμ λ² μ΄μ€κ° λ μΈμ΄(Java)λ₯Ό μ μκ³ μμΌλ©΄ λΉ λ₯΄κ² μ΅λν μ μλ€.
κ·Έλ¦¬κ³ μ΄λ νΉμ νλ‘κ·Έλλ° μ€νμΌμ΄λ ν¨λ¬λ€μμ μ¬μ©ν κ²μΌλ‘ κ°μ λ‘ μꡬνμ§ μλλ€. μ²μμλ Javaμμ μ¬μ©ν΄ μ¨ μ΅μν κΈ°λ²μ μ¬μ©νκ² μ§λ§, μ½νλ¦°μ μ΅μν΄μ§κ³ κ°λ ₯ν νΉμ§μ λ°κ²¬νκ³ μ΅λνκ² λλ©΄ κ°λ ₯νκ² μ’μ κ°κ²°ν μ½λλ₯Ό νμ μν¬ μ μλ€.
λν μ½νλ¦°μ μΈμμ λ³μ μ¬λλ€μ λꡬ(IDE)λ₯Ό λ§λλ μ¬λλ€μ΄κΈ° λλ¬Έμ λꡬμλ μ½νλ¦°μ μ¬μ©νλλ° μμ΄ νΈλ¦¬μ±μ΄ νΌν λμ΄ μλ€.
κ°κ²°μ±
κ°κ²°νλ€λΌλ μλ―Έλ κ·Έ μΈμ΄λ‘ μμ±λ μ½λλ₯Ό μ½μ λ μλλ₯Ό μ½κ² νμ ν μ μλ ꡬ문 ꡬ쑰λ₯Ό μ 곡νκ³ , κ·Έ μλλ₯Ό λ¬μ±νλ λ°©λ²μ μ΄ν΄ν λ λ°©ν΄κ° λ μ μλ λΆκ°μ μΈ μ€λΉ μ½λ(ex. ν΄λμ€μ Getter, Setter, Constructor)κ° μ λ€λ λ»μ΄λ€.
μμ μ±
JVMμμ μ€νν μ μλ€λ κ²λΆν°κ° μμ μ±μ΄ μλ€. μλ°μ λμΌνκ² μ μ νμ μ§μ μΈμ΄λ‘ μ ν리μΌμ΄μ μ νμ μμ μ±μ 보μ₯νλ€. νμ§λ§ μλ° λ³΄λ€ λ μ μ λΉμ©μΌλ‘ νμ μμ μ±μ μ¬μ©ν μ μλ€. μ½νλ¦°μ νμ μΆλ‘ (Type inference)μ μ΄μ©ν΄μ μ¬μ©μκ° νμ μ μ§μ νμ§ μμλ μ»΄νμΌκ° μλμΌλ‘ λ°μ΄ν° νμ μ μΆλ‘ νκΈ° λλ¬Έμ μ§μ νμ μ 보λ₯Ό μ§μ ν νμκ° μλ€.
μ½νλ¦°μ NullPointerExceptionμ μμ κΈ° μν΄ λ§μ λ Έλ ₯μ νλ€. μ»΄νμΌ μμ κ²μ¬λ₯Ό ν΅ν΄ μ€λ₯λ₯Ό λ°°μ νκ³ , nullμ΄ λ μ μλ κ°μ μΆμ²νλ©°, μ€ν μμ μ NullPointerExceptionμ΄ λ°μν μ μλ μ°μ°μ μ¬μ©νλ μ½λλ₯Ό κΈμ§νλ€.
μνΈμ΄μ©μ±
μ½νλ¦°μ μλ°μ μνΈμ΄μ©μ΄ κ°λ₯νλ©°, λ³ν μμ μμ΄ μ¬μ©μ΄ κ°λ₯νλ€. κ·Έλ¦¬κ³ μ½νλ¦°μμ μλ°μ APIλ₯Ό νΈμΆνμ¬ μ¬μ©κ°λ₯νλ©° μλ°μμ μ μ©νκ² λ§μ΄ μ¬μ©λλ APIμ κ²½μ° wrapperλ‘ κ°μΈ μ½νλ¦° λ°©μλλ‘ μ 곡νλ€.(ex. μλ°μ System.out.println()μ κ²½μ° println()λ‘ μ 곡νλ€.)
Hello Kotlin
Statement(λ¬Έμ₯)κ³Ό Expression(ννμ)μ ꡬλΆ
μ½νλ¦°μμ if
λ ννμμ΄μ§ λ¬Έμ₯μ΄ μλλ€. ννμμ κ°μ λ§λ€μ΄ λ΄λ©° λ€λ₯Έ μμ νμ μμλ‘ κ³μ°μ μ°Έμ¬ ν μ μλ€. λ°λ©΄ λ¬Έμ₯μ μμ μ λλ¬μΈκ³ (μ€κ΄νΈ{}) μλ κ°μ₯ μμͺ½ λΈλ‘μ μ΅μμ μμλ‘ μ‘΄μ¬νλ©° μλ¬΄λ° κ°μ λ§λ€μ΄λ΄μ§ μλλ€λ μ°¨μ΄ μλ€.
μλ μ½λλ₯Ό 보면μ μ΄μΌκΈ°ν΄λ³΄μ. μλμ 첫λ²μ§Έ μ½λλ μ½νλ¦°μ ifμμ΄λ€. μλ°μ λ€λ₯΄κ² μ μ΄ κ΅¬μ‘°μ²λΌ λμνλ κ²μ΄ μλλΌ κ°μ λ§λ€μ΄ λΈλ€. μλ°μ μΌν μ°μ°μμ μ μ¬νλ€.
/* Kotlin if expression */
fun main(args: Array<String>){
fun max(x: Int, y: Int){
return if(x > y) x else y
}
/* Java if statement */
public int max(int x, int y){
int result = 0;
if(x > y){
result = x;
}else{
result = y;
}
}
λ³μ
λ³μμ μΈ
val variableName: dataType = value
val variableName = value
val variableName: dataType
var variableName: dataType = value
var variableName = value
var variableName: dataType
var
κ³Ό val
λ ν€μλλ₯Ό μ΄μ©νμ¬ λ³μλ₯Ό μ μΈν μ μλ€. μ΄ λμ μ°¨μ΄μ μ var
μ κ²½μ° κ°μ ν λΉν νμ μ¬ν λΉμ΄ κ°λ₯νλ, val
λ₯Ό μ¬ν λΉμ΄ λΆκ°λ₯νλ€.
λ³μλ₯Ό μ΄κΈ°ννλ κ²½μ° νμ μ μ μνμ§ μμλ λλ€. μ»΄νμΌ μμ μ μ»΄νμΌλ¬κ° νμ μ μΆλ‘ νμ¬ νμ μ μ§μ νλ€.
μ΄κΈ°ν μ(Expression)μ μ¬μ©νμ§ μλλ€λ©΄ 무쑰건 νμ μ μ μ μΌλ‘ μ§μ ν΄μΌ νλ€.
// μ£Όμμ²λ¦¬λ Javaμ λ¬Έλ²κ³Ό λμΌνλ€.
// var λ³μμ΄λ¦: λ°μ΄ν°νμ
(λλ¬Έμ) = κ°
// var λ³μμ΄λ¦ = κ°
var number: Int
var number: Int = 42
val number = 42
var isBoolean: Boolean = true
var ch: Char = 'C'
val question = "μΆ, μ°μ£Ό, κ·Έλ¦¬κ³ λͺ¨λ κ²μ λν κΆκ·Ήμ μΈ μ§λ¬Ό"
val stringText = "Hello Kotlin"
νμ μΆλ‘
μμ μμ μ½λ μ€ stringTextλ³μ μ²λΌ λ³μ μ μ μ, λ°μ΄ν° νμ μ μλ΅νλ€λ©΄ μ»΄νμΌ μ ν λΉλ κ°μ μ νμ κΈ°λ°μΌλ‘ νμ μ μΆλ‘ ν μ μμ΅λλ€.(Pythonμ λ°μ΄ν° νμ μΆλ‘ κ³Ό λΉμ·ν κ²μΌλ‘ 보μ¬μ§λλ€.)
var k = "Hello Kotlin"
println(k.toUpperCase()) // output: HELLO KOTLIN
println(k is String) // output: true
Null μμ
μΌλΆ λ€λ₯Έ μΈμ΄μμλ λ³μ μ μΈ μ, μ΄κΈ° κ°μ λͺ μμ μΌλ‘ μ 곡νμ§ μκ³ μ°Έμ‘°νμΌλ‘ λ³μλ₯Ό μ μΈν μ μλ€. κ·Έλ κ² λλ©΄ κΈ°λ³Έμ μΌλ‘ null κ°μ΄ ν λΉλλλ° Kotlin λ³μλ κΈ°λ³Έμ μΌλ‘ null κ° ν λΉμ΄ λΆκ°λ₯νλ€. κ·Έλ κΈ°λλ¬Έμ NullPointerExceptionμ΄ λ°μνμ§ μλλ€.
κ·Έλ¬λ, Null κ°μΌλ‘ ν λΉμ ν΄μΌνλ κ²½μ°κ° μλ€. μ΄λ μ°λ¦¬λ nullable typeμ λ³μλ₯Ό μ¬μ©νλ©΄ λλ€. λ¬Έλ²μ νμμ μλμ μμ μ²λΌ λ³μλͺ λ€μ ?(λ¬Όμν, μλΉμ€)μ°μ°μλ₯Ό λΆμ¬μ μ μΈνλ©΄ nullable typeμΌλ‘ λ³μλ₯Ό μ μΈ ν μ μλ€.
var notNullAble = null // Fails to compile
var nullAble? = null // Success to compile
ν¨μ(Function)
μ½νλ¦°λ΅κ² ν¨μ μ μνκΈ°
println(joinToString(list,separator=";",prefix="(", postfix=")"))
separator: String =', ', prefix: String = '', postfix: String = '',
μ΄λ¦ μλ μΈμμ λν΄νΈ νλΌλ―Έν°λ₯Ό μ¬μ©νλ©΄ μ€λ²λ‘λ©(Overloading)μ λ μ κ² μ¬μ©ν μ μλ€. κ·Έλ κ² λλ©΄ μ€λ³΅μ λμ±λ λ§μ΄ μ κ±° ν μ μκ³ κ°λ μ±μ λμΌ μ μλ€.
fun <T> joinToString(
collection: Collection<T>,
separator: String,
prefix: String,
postfix: String,
): String {
val result = StringBuilder(prefix)
for ((index, element) in collection.withIndex()) {
if (index > 0) result.append(separator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
val list = listOf(1,2,3)
println(joinToString(list,separator=";",prefix="(", postfix=")"))
μ μ μΈ μ νΈλ¦¬ν° ν΄λμ€ μμ κΈ°: μ΅μμ ν¨μμ νλ‘νΌν°
μ μ μΈ μ νΈλ¦¬ν° ν΄λμ€λ? μ°λ¦¬κ° νλ‘μ νΈ μ§ν μ 곡ν΅μΌλ‘ μμ£Ό μ¬μ©νλ κΈ°λ₯μ λͺ¨μμ μ μνλ ν΄λμ€λ₯Ό λ§νλ€. λ³΄ν΅ UtilsλΌλ ν΄λμ€λ₯Ό μ΄λ¦ κ°λλ€.
μ½λ₯Όλ¦°μμλ μ΄λ° 무μλ―Έν ν΄λμ€κ° νμ μλ€. λμ ν¨μλ₯Ό μ§μ μμ€ νμΌμ μ΅μμ μμ€, λͺ¨λ λ€λ₯Έ ν΄λμ€μ λ°μ μμΉμν€λ©΄ λλ€.
μλ°μ κ²½μ°, 무쑰건 ν΄λμ€ λ΄λΆμ ν¨μλ νλ‘νΌν°λ₯Ό μ μΈν΄μΌνμ§λ§, μ½νλ¦°μ κ·Έλ μ§ μμλ λλ€. Javascript λ¬Έλ²κ³Ό μ μ¬νκ² νμΌ μ΅μμ μμ€μ μ μΈμ ν μ μλ€. κ·Έλ κ² νλ―λ‘μ¨ νμνμ§ μλ ν΄λμ€λ₯Ό μ μΈνμ§ μμ μ μλ€.
ν¨μ
λ¬Έλ²
fun ν€μλλ₯Ό μ¬μ©ν΄μ ν¨μμ΄λ¦μ μ μνκ³ νλΌλ―Έν°μ λ¦¬ν΄ νμ μ μ μΈν΄μ£Όλ©΄ λλ€.
fun FUNCTION_NAME(params1: paramsType, params2: paramsType, ... )
: RETURN_TYPE {
// Functino Body
}
μμ ν¨μ
νμ λμΌν κ²°κ³Ό κ°μ returnνλ ν¨μ
κ³ μ°¨ ν¨μ
μΈμ(or 맀κ°λ³μ)λ‘ ν¨μ(function or lambda function)λ₯Ό μ λ¬λ°λ ν¨μ
λλ€ ν¨μ
μ΅λͺ ν¨μ or μ΄λ¦μ΄ μλ ν¨μ
λλ€λ κΈ°λ³Έμ μΌλ‘ λ€λ₯Έ ν¨μμ λκΈΈ μ μλ μμ μ½λ μ‘°κ°μ λ»νλ€. λλ€λ₯Ό μ¬μ©νλ©΄ μ½κ² κ³΅ν΅ μ½λ ꡬ쑰λ₯Ό λΌμ΄λΈλ¬λ¦¬ ν¨μλ‘ λ½μλΌ μ μλ€.
μμ κ°μ²΄ μ§μ λλ€(Lambda with receiver)
μΌλ ¨μ λμμ λ³μμ μ μ₯νκ±°λ λ€λ₯Έ ν¨μμ λκ²¨μΌ νλ κ²½μ°κ° μμ£Ό μλ€. ν¨μν νλ‘κ·Έλλ°μμλ ν¨μλ₯Ό κ°μ²λΌ λ€λ£¨λ μ κ·Ό λ°©λ²μ νν¨μΌλ‘μ¨ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ€. ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό ν¨μμ λκΈ°λ λμ ν¨μλ₯Ό μ§μ λ€λ₯Έ ν¨μμ μ λ¬ν μ μλ€. μ΄λ κ² λλ€λ₯Ό μ¬μ©νλ©΄ μ½λκ° λμ± λ κ°κ²°ν΄μ§λ€.
λλ€μ λ¬Έλ²
μμμλ λ§νμ§λ§, λλ€λ κ°μ²λΌ μ¬κΈ°μ κΈ° μ λ¬ν μ μλ λμμ λͺ¨μμ΄λ€. λλ€λ₯Ό λ°λ‘ μ μΈν΄μ λ³μμ μ μ₯ν μ μλ€. νμ§λ§, ν¨μμ μΈμλ‘ λκΈ°λ©΄μ λ°λ‘ λλ€λ₯Ό μ μνλ κ²½μ°κ° λλΆλΆμ΄λ€.
λλ€μ μ μΈλ°©λ²
λλ€ μμ νμ μ€κ΄νΈ({ Lambda Expression }
)λ‘ λλ¬μΈμ¬ μλ€. μΈμ λͺ©λ‘ μ£Όλ³μ κ΄νΈκ° μλ€λ μ¬μ€μ κΈ°μ΅ν΄λΌ. νμ΄ν(Arrow) ν€μλκ° ν¨μμ μΈμμ λ³Έλ¬Έμ ꡬλΆν΄μ€λ€. κ·Έλ¦¬κ³ μλμ μμ μ²λΌ λλ€ μμ λ³Έλ¬Έμ΄ ν μ€μΌ κ²½μ°, κ·Έ μ€μ΄ λλ€μ κ²°κ³Ό κ°μ΄ λλ€. λ§μ½ μ¬λ¬ μ€μ΄ μλ€λ©΄ 맨 λ§μ§λ§μ μλ μμ΄ λλ€μ κ²°κ³Ό κ°μ΄ λλ€.
μΈμκ° μλ λλ€ ν¨μ : { x: Int, y: Int -> x + y }
λλ€λ₯Ό μ μ ν λλ μΈμμ μκ΄νΈλ₯Ό μ°μ§ μμ§λ§, μΈμλ‘ ν¨μλ₯Ό λ°λ ν¨μλ₯Ό μ μνλ κ²½μ°μλ μκ΄νΈλ₯Ό λΆμ¬μ μ μλ₯Ό ν΄μΌνλ€.
μλ μμ μ½λλ₯Ό 보면, λλ€ μμ μΈμλ‘ λ°μμ μμ ν λΉλ°μ μΈμμ κ°μ μ²λ¦¬νλ λ°©μμ΄λ€. μλ§λ μ΄λ° μμΌλ‘ μ½λλ₯Ό μμ±νλ€λ©΄ βκ³μ°κΈ°β μ½λκ° λ μ¬νν΄μ§ μ μμ§ μμκΉ μΆλ€.
fun calculated(a: Int, b: Int, block: (Int, Int) -> Int) {
block(a, b)
}
calculated(1, 2) { x, y -> x + y }
λλ€λ₯Ό μ μνκ³ λ°λ‘ νΈμΆν΄μΌνλ κ²½μ°, λλ€ λ³Έλ¬Έμ μ§μ μ€ννλ νΈμ΄ λ«κ³ , μ½λμ μΌλΆλΆμ λΈλ‘μΌλ‘ λλ¬μΈ μ€νν νμκ° μλ€λ©΄ run
ν¨μλ₯Ό μ¬μ©νμ.
run
λ μΈμλ‘ λ°μ λλ€λ₯Ό μ€νν΄ ν΄μ£Όλ kotlinμ λΌμ΄λΈλ¬λ¦¬ ν¨μ μ΄λ€.
run({ prinlnt(42) }
/* Or */
run { println(42) }
λλ€μ κΈ°λ³Έμ μΈ λ¬Έλ²μ λν΄μ μμλ΄€λ€. μ΄μ λλ€ μμ λ μ¬ννκ² μ¬μ©ν μ μλ λ¬Έλ² κ΄μ΅μ μμ보μ.
μ΅μ’ λλ€μμ μ΄μ©ν μμ
λͺ¨λ 컬λ μ μ λν΄ maxByOrNull ν¨μλ₯Ό νΈμΆν μ μλ€. ν΄λΉ ν¨μλ κ°μ₯ ν° μμλ₯Ό μ°ΎκΈ° μν΄ λΉκ΅μ μ¬μ©ν κ°μ λλ €μ£Όλ ν¨μλ₯Ό μΈμλ‘ λ°λλ€.
μ€κ΄νΈλ‘ λλ¬μΈμΈ μ½λ { it.age }
λ λ°λ‘ λΉκ΅μ μ¬μ©ν κ°μ 리ν΄ν΄μ£Όλ ν¨μμ΄λ€. μ΄ μ½λλ 컬λ μ
μ μμλ₯Ό μΈμλ‘ λ°μμ λΉκ΅μ μ¬μ©ν κ°μ 리ν΄νλ€.
data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
val people = listOf(Person("Jin ho Yoo", 33), Person("Yeji Lim", 29))
val maxAge = people.maxByOrNull { it.age }
/*
* people.maxByOrNull({p: Person -> p.age})
* */
println("Max Age is $maxAge")
}
ν΄λ‘μ (Closuer)
λλ€λ₯Ό μ€ν μμ μ νννλ λ°μ΄ν° ꡬ쑰λ λλ€μμ μμνλ λͺ¨λ μ°Έμ‘°κ° ν¬ν¨λ λ«ν(Closed) κ°μ²΄ κ·Έλνλ₯Ό λλ€ μ½λμ ν¨κ» μ μ₯ν΄μΌ νλ€. κ·Έλ°λ° λ°μ΄ν° ꡬ쑰λ₯Ό ν΄λ‘μ (Closure)λΌκ³ λΆλ₯Έλ€. ν¨μλ₯Ό μΈλͺ¨ μλ 1κΈ μλ―ΌμΌλ‘ λ§λ€λ €λ©΄ ν¬νν λ³μλ₯Ό μ λλ‘ μ²λ¦¬ν΄μΌν κ³ , ν¬νν λ³μλ₯Ό μ λλ‘ μ²λ¦¬νλ €λ©΄ ν΄λ‘μ κ° κΌ νμνλ€.
νμ₯ ν¨μ
λ§ κ·Έλλ‘ νμ₯(extend)νλ ν¨μ.
ν΄λμ€ μ μ λ°μμ μ μΈλ ν΄λμ€μ ν¨μ(Member Method)λ₯Ό μλ‘κ² μΆκ°ν ν¨μλ₯Ό λ§νλ€. μ΄ κ°λ ? κ·μΉ?μ ν΅ν΄μ κΈ°μ‘΄ μλ°μ APIλ₯Ό μ¬μμ±νμ§ μκ³ λ μ½νλ¦°μ΄ μ 곡νλ μ¬λ¬ νΈλ¦¬ν κΈ°λ₯μ μμ λ‘κ² μ¬μ©ν μ μλ€.
μ½νλ¦° λ¬Έλ²μ κ°μ₯ ν΅μ¬μ μΈ μμ μ€ νλμ΄λ©°, μλ° λ³΄λ€ λ μλ¦λ΅κ² μ½λλ₯Ό μμ±ν μ μλ μμ μ€ νλλΌκ³ μκ°λλ€.
ν΄λμ€ μ΄λ¦μ μμ κ°μ²΄ νμ μ΄λΌ λΆλ₯΄λ©°, νμ₯ν¨μκ° νΈμΆλλ λμμ΄ λλ κ°(κ°μ²΄, Object)μ μμ κ°μ²΄(Receiver Object)λΌκ³ λΆλ₯Έλ€.
νμ₯ν¨μλ₯Ό μ μΈνλ©΄ ν΄λΉ ν΄λμ€μ λ©€λ² λ©μλλ‘ μ μλλ©΄ νμ₯ν¨μ λ΄λΆμμ λ€λ₯Έ λ©€λ² λ©μλλ₯Ό νΈμΆν μ μλ€. λ¨, ν΄λμ€μ νλ‘νΌν° μΊ‘μνλ κΉ° μ μλ€. ν΄λμ€ λ΄λΆμμλ§ μ κ·Όμ΄ νμ©λλ privateμ΄λ protected memberμλ μ κ·Όμ΄ λΆκ°λ₯νλ€.
컬λ μ μ²λ¦¬: κ°λ³ κΈΈμ΄ μΈμ, μ€μ ν¨μ νΈμΆ, λΌμ΄λΈλ¬λ¦¬ μ§μ
κ°λ³ κΈΈμ΄ μΈμ
컬λ μ
μ€ List κ°μ²΄λ₯Ό μμ±νλ listOf() ν¨μλ‘ μμ μ½λλ₯Ό μμ±ν΄λ³΄μ. λΌμ΄λΈλ¬λ¦¬μμ μ΄ ν¨μμ μ μλ₯Ό λ€μ κ³Ό κ°λ€. fun listOf<T> (vararg values: T): List<T> { ... }
μλ°μ λ¬Έλ²κ³Ό λ€λ₯Έ μ μ νλΌλ―Έν° μμ vararga λ³κ²½μλ₯Ό λΆμ΄λκ² λ€λ₯Έ μ μ΄λ€.
val strings: List<String> = listOf("first", "second", "third")
λ§μ½ κ°λ³ μΈμλ‘ λ°°μ΄(Array)λ₯Ό μ λ¬νλ κ²½μ° μ€νλ λ μ°μ°μλ₯Ό μ΄μ©ν΄μ λͺ μμ μΌλ‘ νμ΄μ λ°°μ΄μ κ° μμκ° μΈμλ‘ μ λ¬λκ² ν΄μΌνλ€. λ¬Έλ²μ μ€μ λ‘ μ λ¬νλ €λ λ°°μ΄ μμ *λ₯Ό λΆμ΄κΈ°λ§ νλ©΄ λλ€.
fun main(args: Array<tring>) {
val args_list: List<String> = listOf("args :", *args)
println(args_list)
}
μ€μ ν¨μ
μ€μ ν¨μ νΈμΆ ꡬ문μ μ¬μ©νλ©΄ μΈμκ° νλλΏμΈ λ©μλλ₯Ό κ°νΈνκ³ μλ¦λ΅κ² νΈμΆν μ μλ€.
val map_full = mapOf(1.to("one") ...);
// μ€μν¨μ νν
val map = mapOf(1 to "one", 2 to "two", 3 to "three");
ꡬ쑰 λΆν΄ μ μΈ(destructuring declaration)
μ λ€λ¦(Generic)
리νλ μ (Reflection)
μ½λ£¨ν΄(Coroutine)
κ²½λ μ€λ λ
Callerκ° ν¨μλ₯Ό callνκ³ ν¨μκ° callerμκ² κ°μ returnνλ©΄μ μ’ λ£νλ κ²μ λν΄ returnνλ λμ suspend(or yield)νλ©΄ Callerκ° λμ€μ resume(μ΄μ΄μ μ€ννλ€)νμ¬ μ€λ¨λ μ§μ λΆν° μ€νμ μ΄μ΄κ° μ μλ€.
μ½λ£¨ν΄λ routine(루ν΄)μ΄κΈ° λλ¬Έμ ν¨μλ‘ μκ°νμ. μΌλ° ν¨μμ λ€λ₯΄κ², μ½λ£¨ν΄μ ν¨μμ μ§μ ν μ μλ μ§μ μ νκ°κ° μλλΌ μ¬λ¬κ°λ‘κ³ , ν¨μλ₯Ό λΉ μ Έλμ¬ μ μλ νμΆμ λ μ¬λ¬κ°λ€.
μ½λ£¨ν΄ ν¨μλ κΌ! returnλ¬Έμ΄λ λ§μ§λ§ λ«λ κ΄νΈλ₯Ό λ§λμ§ μλλΌλ μΈμ λ μ§ μ€κ°μ ν¨μλ₯Ό νμΆν μ μκ³ μΈμ λ μ§ κ°μ§ κ·Έ μ§μ μΌλ‘ μ§μ ν μ μλ€.