TIL

Lec 19. 코틀린의 이모저모

1. Type Alias와 as import

Type Alias

fun filterFruits(fruits: List<Fruit>, filter: (Fruit) -> Boolean) {
}

// 아래처럼 타입에 별칭을 부여할 수 있다.

typealias FruitFilter = (Fruit) -> Boolean

fun filterFruits(fruits: List<Fruit>, filter: FruitFilter) {
}

// 람다 뿐만 아니라 너무 길어 줄이고 싶은 어느 타입에도 사용할 수 있다.

data class UltraSuperGuardianTribe(val name: String)

typealias USGTMap = Map<String, UltraSuperGuardianTribe>

as import

import com.lannstark.lec19.a.printHelloWorld as printHelloworldA
import com.lannstark.lec19.b.printHelloWorld as printHelloworldB

fun main() {
  printHelloWorldA()
  printHelloWorldB()
}

2. 구조 분해와 componentN 함수

data class Person(
  val name: String,
  val age: Int
)

val person = Person("이동규", 100)
val (name, age) = person
val person = Person("이동규", 100)

val name = person.component1() // 1번째 프로퍼티
val age = person.component2() // 2번째 프로퍼티
class Person(
  val name: String,
  val age: Int
) {
  operator fun component1(): String {
    return this.name
  }
  
  operator fun component2(): String {
    return this.age
  }
}

3. Jump와 Label

Jump

val numbers = listOf(1, 2, 3, 4, 5)
numbers.forEach { number -> 
    if (number == 3) continue // 에러
}
val numbers = listOf(1, 2, 3, 4, 5)
run { // run으로 감싸야 함
  numbers.forEach { number ->
    if (number == 3)
      return@run // break
    }
  }
  println(number)
}

numbers.forEach {
  println(it)
  if (it == 3) {
    return@forEach // continue
  }
}

Label

loop@ for (i in 1..100) {
  for (j in 1..100) {
    if (j == 2) {
      break@loop // loop 라벨이 표시된 제일 첫 반복문을 멈춘다.
    }
  }
}

val numbers = listOf(1, 2, 3, 4, 5)
run { 
  numbers.forEach { number ->
    if (number == 3)
      return@run // run 구문을 리턴시킴으로써 break 같은 효과를 냄
    }
  }
  println(number)
}

4. TakeIf와 TakeUnless

fun getNumberOrNull(): Int? {
  return if (number <= 0) {
    null
  } else {
    number
  }
}

// 위 함수를 takeIf를 사용하면 아래처럼 바꿀 수 있다.

fun getNumberOrNull(): Int? {
  return number.takeIf { it > 0 }
}
fun getNumberOrNull(): Int? {
  return number. takeUnless{ it <= 0 }
}