1. μ½”ν‹€λ¦°μ΄λž€?

    JetBrainμ—μ„œ 낳은 μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž˜λ° 언어이닀. νŠΉμ§•μœΌλ‘œλŠ” Java ν”Œλž«νΌμ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ©° Javaλ₯Ό λŒ€μ²΄ν•  수 μžˆλŠ” 언어이닀.

    1. μž₯점
      • κ°„κ²°ν•˜κ³  μ‹€μš©μ μ΄λ‹€.
      • Java와 μƒν˜Έμš΄μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
      • λ‹€μ–‘ν•œ ν”Œλž«νΌκ³Ό ν˜Έν™˜μ΄ κ°€λŠ₯ν•˜λ©°, JVM이 μžˆλŠ” 곳이라면 μ–΄λ””μ„œλ“  싀행이 κ°€λŠ₯ν•˜λ‹€.
      • μ•ˆμ •μ„±μ΄ λ†’λ‹€(치λͺ…적인 NullPointerException Errorλ₯Ό ν”Όν•  수 μžˆλ‹€.)
    2. 단점?
  2. μ½”ν‹€λ¦°μ˜ μ² ν•™

  3. Hello Kotlin

    1. 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;
      	}
      }
      

    λ³€μˆ˜

    1. λ³€μˆ˜μ„ μ–Έ

      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"
      
    2. νƒ€μž… μΆ”λ‘ 

      μœ„μ— 예제 μ½”λ“œ 쀑 stringTextλ³€μˆ˜ 처럼 λ³€μˆ˜ μ •μ˜ μ‹œ, 데이터 νƒ€μž…μ„ μƒλž΅ν•œλ‹€λ©΄ 컴파일 μ‹œ ν• λ‹Ήλœ κ°’μ˜ μœ ν˜•μ„ 기반으둜 νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.(Python의 데이터 νƒ€μž… μΆ”λ‘ κ³Ό λΉ„μŠ·ν•œ κ²ƒμœΌλ‘œ λ³΄μ—¬μ§‘λ‹ˆλ‹€.)

      var k = "Hello Kotlin"
      println(k.toUpperCase()) // output: HELLO KOTLIN
      println(k is String)     // output: true
      
    3. Null μ•ˆμ „

      일뢀 λ‹€λ₯Έ μ–Έμ–΄μ—μ„œλŠ” λ³€μˆ˜ μ„ μ–Έ μ‹œ, 초기 값을 λͺ…μ‹œμ μœΌλ‘œ μ œκ³΅ν•˜μ§€ μ•Šκ³  μ°Έμ‘°ν˜•μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€. κ·Έλ ‡κ²Œ 되면 기본적으둜 null 값이 ν• λ‹Ήλ˜λŠ”λ° Kotlin λ³€μˆ˜λŠ” 기본적으둜 null κ°’ 할당이 λΆˆκ°€λŠ₯ν•˜λ‹€. κ·Έλ ‡κΈ°λ•Œλ¬Έμ— NullPointerException이 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

      κ·ΈλŸ¬λ‚˜, Null κ°’μœΌλ‘œ 할당을 ν•΄μ•Όν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. μ΄λ•Œ μš°λ¦¬λŠ” nullable type의 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. λ¬Έλ²•μ˜ ν˜•μ‹μ€ μ•„λž˜μ˜ 예제처럼 λ³€μˆ˜λͺ… 뒀에 ?(λ¬ΌμŒν‘œ, μ—˜λΉ„μŠ€)μ—°μ‚°μžλ₯Ό λΆ™μ—¬μ„œ μ„ μ–Έν•˜λ©΄ nullable type으둜 λ³€μˆ˜λ₯Ό μ„ μ–Έ ν•  수 μžˆλ‹€.

      var notNullAble = null // Fails to compile
      var nullAble? = null // Success to compile
      

ν•¨μˆ˜(Function)

μ½”ν‹€λ¦°λ‹΅κ²Œ ν•¨μˆ˜ μ •μ˜ν•˜κΈ°

이름 μžˆλŠ” μΈμžμ™€ λ””ν΄νŠΈ νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ μ˜€λ²„λ‘œλ”©(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) }

λžŒλ‹€μ˜ 기본적인 문법에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄€λ‹€. 이제 λžŒλ‹€ 식을 더 μ‹¬ν”Œν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” 문법 κ΄€μŠ΅μ„ μ•Œμ•„λ³΄μž.

  1. 인자의 νƒ€μž…μ„ λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. β†’ μ»΄νŒŒμΌλŸ¬κ°€ λžŒλ‹€ μ‹μ˜ νŒŒλΌλ―Έν„°λ„ μΆ”λ‘  ν•  수 μžˆλ‹€.
  2. λžŒλ‹€μ˜ νŒŒλΌλ―Έν„° 이름을 λ””ν΄νŠΈ 이름인 it으둜 μ‚¬μš©ν•  수 μžˆλ‹€. β†’ μΈμžκ°€ 단 ν•˜λ‚˜λΏμ΄κ³ , μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μΆ”λ‘  ν•  수 μžˆλ‹€λ©΄ λ””ν΄νŠΈλͺ…(it)을 μ‚¬μš©ν•  수 μžˆλ‹€.
  3. ν•¨μˆ˜ 호좜 μ‹œ 맨 뒀에 μžˆλŠ” μΈμžκ°€ λžŒλ‹€ 식이라면 κ·Έ λžŒλ‹€λ₯Ό κ΄„ν˜Έ λ°–μœΌλ‘œ λΉΌλ‚Ό 수 μžˆλŠ” 문법 κ΄€μŠ΅μ΄ μžˆλ‹€.

μ΅œμ’… λžŒλ‹€μ‹μ„ μ΄μš©ν•œ 예제

λͺ¨λ“  μ»¬λ ‰μ…˜μ— λŒ€ν•΄ 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μ—λŠ” 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

μ»¬λ ‰μ…˜ 처리: κ°€λ³€ 길이 인자, μ€‘μœ„ ν•¨μˆ˜ 호좜, 라이브러리 지원

κ°€λ³€ 길이 인자

μ€‘μœ„ ν•¨μˆ˜

ꡬ쑰 λΆ„ν•΄ μ„ μ–Έ(destructuring declaration)

μ œλ„€λ¦­(Generic)

λ¦¬ν”Œλ ‰μ…˜(Reflection)

코루틴(Coroutine)

κ²½λŸ‰ μŠ€λ ˆλ“œ

Callerκ°€ ν•¨μˆ˜λ₯Ό callν•˜κ³  ν•¨μˆ˜κ°€ callerμ—κ²Œ 값을 returnν•˜λ©΄μ„œ μ’…λ£Œν•˜λŠ” 것에 더해 returnν•˜λŠ” λŒ€μ‹  suspend(or yield)ν•˜λ©΄ Callerκ°€ λ‚˜μ€‘μ— resume(μ΄μ–΄μ„œ μ‹€ν–‰ν•œλ‹€)ν•˜μ—¬ μ€‘λ‹¨λœ 지점뢀터 싀행을 μ΄μ–΄κ°ˆ 수 μžˆλ‹€.

코루틴도 routine(루틴)이기 λ•Œλ¬Έμ— ν•¨μˆ˜λ‘œ μƒκ°ν•˜μž. 일반 ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ, 코루틴은 ν•¨μˆ˜μ— μ§„μž…ν•  수 μžˆλŠ” μ§„μž…μ  ν•œκ°œκ°€ μ•„λ‹ˆλΌ μ—¬λŸ¬κ°œλ‘œκ³ , ν•¨μˆ˜λ₯Ό λΉ μ Έλ‚˜μ˜¬ 수 μžˆλŠ” νƒˆμΆœμ λ„ μ—¬λŸ¬κ°œλ‹€.

코루틴 ν•¨μˆ˜λŠ” κΌ­! returnλ¬Έμ΄λ‚˜ λ§ˆμ§€λ§‰ λ‹«λŠ” κ΄„ν˜Έλ₯Ό λ§Œλ‚˜μ§€ μ•Šλ”λΌλ„ μ–Έμ œλ“ μ§€ 쀑간에 ν•¨μˆ˜λ₯Ό νƒˆμΆœν•  수 있고 μ–Έμ œλ“ μ§€ 가지 κ·Έ μ§€μ μœΌλ‘œ μ§„μž…ν•  수 μžˆλ‹€.