09/05 (Mon)

μ½”ν‹€λ¦° μ™„λ²½ κ°€μ΄λ“œ - ν•¨μˆ˜

μžλ°”μ™€ 달리 μ½”ν‹€λ¦°μ—μ„œμ˜ ν•¨μˆ˜ νŒŒλΌλ―Έν„°λŠ” λΆˆλ³€μ΄λ‹€.

μžλ°”μ—μ„œλŠ” λ©”μ„œλ“œ νŒŒλΌλ―Έν„°μ— 값이 κ°€λ³€μ΄λ―€λ‘œ, λ³€κ²½ν•˜μ§€ λͺ»ν•˜κ²Œ ν• λ €λ©΄ final 지정을 ν•΄μ•Ό λΆˆλ³€κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, 코틀린은 νŒŒλΌλ―Έν„°λ₯Ό λΆˆλ³€ κ°’μœΌλ‘œ κ°•μ œν•œλ‹€ (val, var λ˜ν•œ νŒŒλΌλ―Έν„° μ•žμ— ν‘œμ‹œν•  수 μ—†λ‹€)

fun increment(n : Int) : Int {
    return n++ // Error: can't change immutable variable
}

코틀린은 값에 μ˜ν•œ 호좜 μ˜λ―Έλ‘ μ„ μ‚¬μš©ν•œλ‹€. (call by-value)

ν•¨μˆ˜ νŒŒλΌλ―Έν„° 값에 ν˜ΈμΆœν•˜λŠ” μͺ½μ˜ 인자λ₯Ό 볡사함을 μ˜λ―Έν•œλ‹€. 호좜 인자둜 μ „λ‹¬ν•œ λ³€μˆ˜λ₯Ό 변경해도 호좜된 ν•¨μˆ˜ λ‚΄λΆ€μ˜ νŒŒλΌλ―Έν„° κ°’μ—λŠ” 영ν–₯이 μ—†λ‹€λŠ” λœ»μ΄λ‹€. ν•˜μ§€λ§Œ νŒŒλΌλ―Έν„°κ°€ μ°Έμ‘°(λ°°μ—΄ νƒ€μž… λ“±)인 경우, ν˜ΈμΆœν•œ μͺ½μ˜ λ°μ΄ν„°λŠ” κ·ΈλŒ€λ‘œ λ‚¨μ•„μžˆκ³ , 이 데이터에 λŒ€ν•œ 참쑰만 λ³΅μ‚¬λœλ‹€.

fun increment(a: IntArray): Int {
    return ++a[0]
}

fun main() {
    val a = intArrayOf(1, 2, 3)
    println(increment(a)) // 2
    println(a.cotentToString()) // [2, 2, 3]
}

ν•¨μˆ˜μ— λ°˜ν™˜ νƒ€μž…μ€ νƒ€μž…μΆ”λ‘ μ΄ κ°€λŠ₯ν•˜λ‹€.

νƒ€μž…μΆ”λ‘ μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ Unit νƒ€μž…μ„ μ œμ™Έν•˜κ³  λ¦¬ν„΄νƒ€μž…μ„ λͺ…μ‹œν•΄μ€˜μ•Ό ν•œλ‹€. ν•¨μˆ˜ 본문에 μ—¬λŸ¬κ°œμ˜ return이 μ‘΄μž¬ν•  μˆ˜μžˆλŠ”λ°, λͺ¨λ“  λ°˜ν™˜ 지점에 λ°˜ν™˜ νƒ€μž…μ„ μ•Œμ•„λ‚΄κΈ° μ–΄λ €μšΈ 수 있기 λ•Œλ¬Έμ΄λ‹€. Unit 을 μ œμ™Έν•˜κ³  λ¦¬ν„΄νƒ€μž…μ„ μ œμ™Έ ν•  수 μžˆλŠ” 방법은 식이 λ³Έλ¬Έ(expression-body) 인 ν•¨μˆ˜λ‹€. 단일 μ‹μœΌλ‘œλ§Œ ν•¨μˆ˜κ°€ κ΅¬ν˜„λ  수 있으면 return κ³Ό μ€‘κ΄„ν˜Έλ₯Ό μ œμ™Έν•˜κ³  ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

fun circleArea(redius: Double) = PI * radius * redius  // return Double

// μ€‘κ΄„ν˜Έ({}) 와 식이 본문인 ν•¨μˆ˜λ₯Ό λ™μ‹œμ— μ“°κ²Œ 되면 리턴 νƒ€μž…μ„ λžŒλ‹€λ‘œ ν•΄μ„ν•˜κΈ° λ•Œλ¬Έμ— μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 얻지λͺ»ν•œλ‹€.
fun circleArea(radius: Double) = { PI * radius * radius } // return () -> Double

// 2λ²ˆμ˜ˆμ‹œμ—μ„œ return 문을 μž‘μ„±ν•˜λ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
fun circleArea(radius: Dobule) = {
    // νƒ€μž…μΆ”λ‘ ν•œ λ¦¬ν„΄νƒ€μž…μ€ ()->Double, ν•¨μˆ˜λ³Έλ¬Έμ—μ„œ return으둜 λ³΄λ‚΄λŠ” 값은 Double νƒ€μž…μ΄λ―€λ‘œ μ—λŸ¬λ°œμƒ
    return PI * radius * radius
}

λ¬Έ(statement) κ³Ό 식(expression) 의 μ°¨μ΄λŠ” 무엇인가?

식은 값을 λ§Œλ“€μ–΄λ‚΄λ©° λ‹€λ₯Έμ‹μ˜ ν•˜μœ„ μš”μ†Œλ‘œ 계산에 μ°Έμ—¬ ν•  수 μžˆλ‹€. 문은 μžμ‹ μ„ λ‘˜λŸ¬μ‹Έκ³  μžˆλŠ” κ°€μž₯ μ•ˆμͺ½ λΈ”λ‘μ˜ μ΅œμƒμœ„ μš”μ†Œλ‘œ μ‘΄μž¬ν•˜λ©°, μ•„λ¬΄λŸ° 값도 λ§Œλ“€μ–΄ 내지 μ•ŠλŠ”λ‹€

ex) μžλ°”μ—μ„œλŠ” if-else λŠ” statement 이닀. μ½”ν‹€λ¦°μ—μ„œλŠ” expression (값을 λ§Œλ“€μ–΄ λ‚Ό 수 μžˆλ‹€) 으둜 μ‚¬μš©λœλ‹€.

fun....  {
    // Java
    int max;
    if(p0 > p1) {
        max = p0
    } else {
        max = p1
    }

    // Kotlin
    val max = if(p0 > p1) p0 else p1
}

μœ„μΉ˜ 기반 μΈμžμ™€ 이름 뢙은 인자

μžλ°”λ‚˜ λ‹€λ₯Έ μ–Έμ–΄μ—μ„œλŠ” μœ„μΉ˜ 기반 인자λ₯Ό 널리 μ“°κ³ μžˆλ‹€. ν•¨μˆ˜μ— μœ„μΉ˜ 기반 μΈμžλž€ ν•¨μˆ˜μ— μ •μ˜ν•œ νŒŒλΌλ―Έν„°λ“€μ— μˆœμ„œλŒ€λ‘œ μ „λ‹¬λ˜λŠ” 식이닀. μ½”ν‹€λ¦°μ—μ„œλŠ” μœ„μΉ˜ 기반 μΈμžλ„ μ‚¬μš©κ°€λŠ₯ν•˜λ©°, 이름 뢙은 인자라고 λΆˆλ¦¬λŠ” 방식도 μ œκ³΅ν•œλ‹€. νŒŒλΌλ―Έν„° μΈμžλ“€μ—κ²Œ 이름을 λΆ€μ—¬ν•˜λ©° μˆœμ„œμ™€ 상관없이 인자λ₯Ό 전달할 수 μžˆλ‹€.

fun rectangleArea(width: Dobule, height: Double) {
    ...
}

fun main() {
    // μœ„μΉ˜κΈ°λ°˜μΈμž
    rectangleArea(100, 50) // 100: width, 50: height μˆœμ„œλŒ€λ‘œ μΈμžκ°€ μ „λ‹¬λœλ‹€.
    // μ΄λ¦„λΆ™μ€μΈμž
    rectangleArea(height = 50, width = 100) // ν•¨μˆ˜μ— μ •μ˜ν•œ νŒŒλΌλ―Έν„°λͺ…κ³Ό λ™μΌν•œ μœ„μΉ˜μ— μ „λ‹¬λœλ‹€
}

μœ„μΉ˜ 기반 μΈμžμ™€ 이름 뢙은 인자λ₯Ό ν˜Όμš©ν•΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. μ½”ν‹€λ¦° 1.4 버전 μ΄μ „μ—λŠ” 이름뢙은 인자λ₯Ό ν•˜λ‚˜λΌλ„ μ‚¬μš©ν•˜κ²Œλ˜λ©΄ λͺ¨λ“  μΈμžλ“€μ—λ„ 이름을 λΆ™μ—¬μ•Ό ν–ˆλ‹€. ν•˜μ§€λ§Œ μ½”ν‹€λ¦° 1.4버전 μ΄ν›„μ—λŠ” μΈμžλ“€μ— μœ„μΉ˜λ§Œ κ°™λ‹€λ©΄, 쀑간쀑간 이름뢙은 인자λ₯Ό μ‚¬μš©ν•  수 있게 됐닀. β€» μ›λž˜ μΈμžκ°€ λ“€μ–΄κ°€μ•Ό ν•˜λŠ” μœ„μΉ˜μ— 이룸 뢙은 인자λ₯Ό 지정해야 μ •μƒμ²˜λ¦¬λ˜λ©°, κ·ΈλŸ¬μ§€ μ•Šμ„ 경우 μœ„μΉ˜κΈ°λ°˜μΈμž 방에 μ–΄κΈ‹λ‚˜κ±°λ‚˜ 이미 ν• λ‹Ήλœ 인자λ₯Ό ν• λ‹Ήν•˜κΈ° λ•Œλ¬Έμ— 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

fun swap(a: Int, b: Int, c: Int) {
    ...
}

fun main() {
    swap(a = 1, 0, 3)        // 1.4λ²„μ „μ΄μ „μ—λŠ” 였λ₯˜, μ΄ν›„λ²„μ „μ—μ„œλŠ” 정상
    swap(a = 1, 0 , c = 3)   // 1.4λ²„μ „μ΄μ „μ—λŠ” 였λ₯˜, μ΄ν›„λ²„μ „μ—μ„œλŠ” 정상
    swap(a = 1, c = 3, 0)    // 컴파일 μ—λŸ¬ - μœ„μΉ˜ 기반 인자 방식에 μœ„λ°°λœλ‹€.
}

μžλ°” λ©”μ„œλ“œμ™€ λ™μΌν•˜κ²Œ μ½”ν‹€λ¦° ν•¨μˆ˜λ„ μ˜€λ²„λ‘œλ”©(Overloading) 이 κ°€λŠ₯ν•˜λ‹€.

μ˜€λ²„λ‘œλ”©μ΄λž€ 같은 μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬κ°œ μž‘μ„±ν•  수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. λ‹€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ μ–΄λ–€ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€λ₯Ό ꡬ뢄할 수 μžˆλ„λ‘ 각 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° νƒ€μž…μ΄ 달라야 ν•œλ‹€.

컴파일러 μžλ°” μ˜€λ²„λ‘œλ”© ν•΄μ†Œ κ·œμΉ™

  1. νŒŒλΌλ―Έν„°μ˜ κ°œμˆ˜μ™€ νƒ€μž…μ„ κΈ°μ€€μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” λͺ¨λ“  ν•¨μˆ˜λ₯Ό μ°ΎλŠ”λ‹€.

  2. 덜 ꡬ체적인 ν•¨μˆ˜λ₯Ό μ œμ™Έν•œλ‹€ - κ·œμΉ™ 1μ—μ„œ μ„ νƒν•œ 후보 λͺ©λ‘μ—μ„œ μ–΄λ–€ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° νƒ€μž…μ΄ λ‹€λ₯Έ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° νƒ€μž…μ˜ μƒμœ„ νƒ€μž…μΈ 경우 이 ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ³΄λ‹€ 덜 ꡬ체적인 ν•¨μˆ˜λ‹€. 덜 ꡬ체적인 ν•¨μˆ˜κ°€ λͺ¨λ‘ μ œμ™Έλ  λ•ŒκΉŒμ§€ 이 단계λ₯Ό λ°˜λ³΅ν•œλ‹€.

  3. 후보가 ν•˜λ‚˜λ‘œ μ••μΆ•λ˜λ©΄ 이 ν•¨μˆ˜κ°€ ν˜ΈμΆœν•  ν•¨μˆ˜λ‹€. 후보가 λ‘˜ 이상이면 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

Last updated