09/06 (Tue)

fun

vararg

인자의 κ°œμˆ˜κ°€ 정해지지 μ•Šμ€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” νŒŒλΌλ―Έν„° μ •μ˜ μ•žμ— vararg λ³€κ²½λ₯Ό 뢙이면 λœλ‹€. ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” μ μ ˆν•œ λ°°μ—΄ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. λ˜ν•œ, μŠ€ν”„λ ˆλ“œ (*) μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 배열을 κ°€λ³€ 인자 λŒ€μ‹  λ„˜κΈΈ 수 μžˆλ‹€.

fun printNums(vararg num: String) {
    print(num.contentToString()) // [ 1, 2, 4]
}

fun main() {
    val number = arrayOf(1,2,4)
    printNums(*number) // μŠ€ν”„λ ˆλ“œ μ—°μ‚°μž μ‚¬μš©
}

μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ 배열을 λ³΅μ‚¬ν•œλ‹€ λ”°λΌμ„œ ν•¨μˆ˜λ‚΄μ—μ„œ 배열에 λŒ€ν•œ 값을 λ³€κ²½ν•˜μ—¬λ„, main ν•¨μˆ˜λ‚΄μ— number 에 값은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

ν•˜μ§€λ§Œ μ΄λ•Œ 얕은 볡사가 이뀄진닀. λ°°μ—΄ 내뢀에 (μœ„ μ˜ˆλŠ” int) μ°Έμ‘°κ°€ λ“€μ–΄μžˆλŠ” κ²½μš°μ—λŠ” μ°Έμ‘°κ°€ λ³΅μ‚¬λ˜κΈ° λ•Œλ¬Έμ— μ°Έμ‘°κ°€ κ°€λ¦¬ν‚€λŠ” 데이터가 ν˜ΈμΆœν•˜λŠ” μͺ½κ³Ό ν•¨μˆ˜ λ‚΄λΆ€ λ°°μ—΄μ—μ„œ κ³΅μœ λœλ‹€.

fun change(vararg item: IntArray) { // IntArray = μ°Έμ‘°νƒ€μž…
    items[0][0] = 100
}

fun main() {
    val a = intArrayOf(1, 2, 3)
    val b = intArrayOf(2, 3, 4)
    change(a, b)
    print(a.contentToString()) // [100, 2, 3] ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œλ„ 값이 λ³€
}

κΉŠμ€ 볡사(Deep Copy) - 얕은 볡사(Shallow Copy)

κΉŠμ€λ³΅μ‚¬λž€ 객체의 λͺ¨λ“  값을 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— λ³΅μ‚¬ν•œλ‹€.

  1. data class 인 경우, copy() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ κΉŠμ€λ³΅μ‚¬κ°€ 이루어진닀.

  2. 기본클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” 직접 κ΅¬ν˜„μ„ 톡해 μ‚¬μš©ν•  수 μžˆλ‹€.

μ–•μ€λ³΅μ‚¬λŠ” 객체의 μ°Έμ‘°μ£Όμ†Œκ°’μ„ λ³΅μ‚¬ν•œλ‹€.

  1. λ³΅μ‚¬λœ 객체의 값을 λ³€κ²½ν•˜λ©΄ 같은 μ£Όμ†Œκ°’μ„ λ°”λΌλ³΄λŠ” 원본객체에도 영ν–₯을 λΌμΉœλ‹€.

  2. μ½”ν‹€λ¦°(μžλ°”)μ—μ„œ '=' 을 톡해 λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ— λŒ€μž…μ„ ν•˜λ©΄ 얕은볡사가 λœλ‹€.

Any, Nothing, Unit

Any

μ½”ν‹€λ¦°μ—μ„œμ˜ μ΅œμƒμœ„ ν΄λž˜μŠ€κ°€ Any 이닀. μžλ°”μ— Object 와 λΉ„μŠ·ν•˜λ‹€. μ½”ν‹€λ¦°μ—μ„œλ„ Object λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. κ·Έλ ‡λ‹€λ©΄ Any 와 Object의 차이점은 무엇인가?

  1. μžλ°”μ—μ„œλŠ” primitive 타은 계측 κ΅¬μ‘°μœ ν˜•μ΄ μ•„λ‹ˆλ©°, μ•”μ‹œμ μœΌλ‘œ boxing ν•΄μ•Ό ν•˜μ§€λ§Œ (ex) int > Integer 코틀린에 Any μ—μ„œλŠ” λͺ¨λ“  μœ ν˜•μ˜ μƒμœ„ μœ ν˜•μ΄λ‹€.

  2. Any λŠ” null 값을 κ°€μ§ˆ 수 μ—†λ‹€. λ‹€λ₯Έ νƒ€μž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ Any? λ₯Ό μ‚¬μš©ν•΄ Nullable 처리λ₯Ό ν•  μˆ˜μžˆλ‹€.

Unit

μžλ°”μ—μ„œμ˜ Void 와 λ™μΌν•˜λ‹€. μ£Όμš” νŠΉμ§•μœΌλ‘œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. Unit 은 인자둜 μ‚¬μš©ν•  수 μžˆλ‹€.

  2. Unit νƒ€μ˜ 값은 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•œλ‹€

  3. μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜λœλ‹€. return λ¬Έ μž‘μ„± μ‹œ 뒀에 리턴값을 μž‘μ„±ν•˜μ§€μ•ŠμœΌλ©΄, Unit을 λ°˜ν™˜ν•œ

Nothing

μžλ°”μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νƒ€μž…μ΄λ‹€. ν•¨μˆ˜κ°€ μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•Šμ„ λ•Œ λ°˜ν™˜ 값이 μ˜λ―Έκ°€ 없을 λ•Œ μ‚¬μš©ν•œλ‹€.

for λ¬Έ

for λ£¨ν”„λŠ” μ»¨ν…Œμ΄λ„ˆκ°€ iteractor() ν•¨μˆ˜λ₯Ό μ§€μ›ν•˜κΈ°λ§Œ ν•˜λ©΄ μ–΄λ– ν•œ νƒ€μž…λ„ 반볡문으둜 μ‚¬μš©ν•  수 μžˆλ‹€. β€» 문자,λ°°μ—΄ λ“±μ—μ„œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, ν™•μž₯ λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μ–΄λ– ν•œ νƒ€μž…μ΄λ“  ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό 덧뢙일 수 μžˆλ‹€. Iteractor λŠ” μ»¬λ ‰μ…˜μ˜ κΈ°λ³Έ ꡬ쑰λ₯Ό λ…ΈμΆœν•˜μ§€ μ•Šκ³  순차적으둜 μš”μ†Œμ— λŒ€ν•œ μ•‘μ„ΈμŠ€λ₯Ό μ œκ³΅ν•œλ‹€.

// Iteractor interface
public interface Iterator<out T> {
    // Returns the next element in the iteration.
    public operator fun next(): T

    // Returns `true` if the iteration has more elements.
    public operator fun hasNext(): Boolean
}

꼬리 μž¬κ·€ ν•¨μˆ˜(tail recursive)

코틀린은 꼬리 μž¬κ·€ ν•¨μˆ˜μ— λŒ€ν•œ μ΅œμ ν•œ μ»΄νŒŒμΌμ„ μ§€μ›ν•œλ‹€. μž¬κ·€ ν•¨μˆ˜λž€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. μ½”λ“œμ˜ 가독성이 μ¦κ°€ν•œλ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ μ„±λŠ₯μ°¨μ›μ—μ„œ μ•½κ°„μ˜ λΆ€κ°€ λΉ„μš©μ΄ λ°œμƒν•˜κ³ , μŠ€νƒμ˜€λ²„ν”Œλ‘œμš° κ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλ‹€.

μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°λž€ 말 κ·ΈλŒ€λ‘œ Stack 의 μ‚¬μ΄μ¦ˆλ₯Ό μ΄ˆκ³Όν•˜μ˜€μ„ λ•Œ λ°œμƒν•œλ‹€. ν•¨μˆ˜μ—μ„œ μ§€μ—­λ³€μˆ˜, νŒŒλΌλ―Έν„° λ“± μ—¬λŸ¬κ°€μ§€λ₯Ό Stack 에 ν• λ‹Ήλ˜κ³  ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ λ‚˜μ„œ 끝날 λ•Œ ν•΄λ‹Ή Stack 을 μ œκ±°ν•œλ‹€. κ·ΈλŸ¬λ‚˜ μž¬κ·€ν•¨μˆ˜λ₯Ό 톡해 λ¬΄ν•œμœΌλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μŠ€νƒμ— μ΅œλŒ€ 크기 μ΄μƒμ˜ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜μ–΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

μ½”ν‹€λ¦°μ—μ„œλŠ” tailrec ν‚€μ›Œλ“œλ₯Ό ν•¨μˆ˜ μ•žμ— 뢙이면 μ»΄νŒŒμΌλŸ¬κ°€ μž¬κ·€ ν•¨μˆ˜λ₯Ό λΉ„μž¬κ·€μ μΈ μ½”λ“œλ‘œ μžλ™μœΌλ‘œ λ³€ν™˜ν•΄μ€€λ‹€. ν•΄λ‹Ή ν‚€μ›Œλ“œ ν•˜λ‚˜λ§ŒμœΌλ‘œ μž¬κ·€ ν•¨μˆ˜μ˜ 간결함과 λΉ„μž¬κ·€ ν•¨μˆ˜μ˜ μ„±λŠ₯을 λͺ¨λ‘ μ·¨ν•  수 μžˆλ‹€.

Last updated