코틀린에는 switch 문이 없고 대신에 when이 있다. when은 표현식으로 사용할 때와 명령문으로 사용할 때 각각 다른 맛을 보여준다.
표현식으로서의 when
코틀린 컴파일러는 else 부분이 존재하는지, 표현식이 가능한 모든 입력에 대해 값을 생성하는지를 검증함 ⇒ 이 컴파일 시간 체크로 인해 코드의 정확성과 실수로 인한 오류를 줄일 수 있음
코틀린이 → 뒤에 블록을 허용해주긴 하지만 가독성 측면으로 봤을때, 블록을 사용할거면 메서드로 따로 추출하고 그 메서드를 호출하도록 간단화해라
명령문으로써의 when
하나 이상의 값에 기반해서 다른 동작을 원한다면 when 을 표현식이 아니라 명령문으로 사용하면 됨
when과 변수의 스코프
val을 when 의 인자로 넣어버림으로써
when의 결과를 바로 리턴하여 { } 블럭과 return 키워드를 제거할 수 있음
numberOfCores는 when 의 결과를 얻을 때만 사용가능. 이후 연산에서 사용 불가(변수 스코프 제한)
val oneToFive : IntRange = 1..5
val aToE: CharRange = 'a'..'e'
val seekHelp: ClosedRange<String> = "hell".."help"
for (i in 1..5) { println("$i, ") } // 1, 2, 3, 4, 5
for (i in 5.downTo(1)) { print("$i, ") } // 5, 4, 3, 2, 1
// .과 괄호를 선택사항으로 만드는 방법
for (i in 5 downTo 1) { print("$i, ") }
for (i in 1 until 5) { print("$i, ") } // 1, 2, 3, 4
for (i in 1 until 10 step 3) { print("$i, ") } // 1, 4, 7
for (i in 10 downTo 0 step 3) { print("$i, ") } // 10, 7, 4, 1
for (i in (1..9).filter { it % 3 == 0 || it % 5 == 0 }) {
print("$i, ") // 3, 5, 6, 9
}
val array = arrayOf(1,2,3) // kotlin.arrayOf 함수.
// 정수 객체가 아니고 원시 자료형인 Int 배열을 생성하기 위해서는 intArrayOf() 함수를 사용
// 비슷하게, List<T> 의 인스턴스를 listOf() 함수를 이용해서 만들고, for 문을 이용해서 반복가능
for (num in array) {
println(num)
}
val names = listOf("Tom", "Jerry", "Spike")
for (index in names.indices) {
println("Position of ${names.get(index)} is $index")
}
for ((index, name) in names.withIndex()) {
println("Position of $name is $index")
}
fun isAlive(alive: Boolean, numberOfLiveNeighbors: Int): Boolean {
if (numberOfLiveNeighbors < 2) { return false }
if (numberOfLiveNeighbors > 3) { return false }
if (numberOfLiveNeighbors == 3) { return true }
return alive && numberOfLiveNeighbors == 2
}
// when을 사용하면
fun isAlive(alive: Boolean, numberOfLiveNeighbors: Int) = when {
numberOfLiveNeighbors < 2 -> false
numberOfLiveNeighbors > 3 -> false
numberOfLiveNeighbors == 3 -> true
else -> alive && numberOfLiveNeighbors == 2
}
// when 에 값이나 표현식을 전달
fun whatToDo(dayOfWeek: Any) = when (dayOfWeek) {
"Saturday", "Sunday" -> "Relax"
in listOf("Monday", "Tuesday", "Wednesday", "Thursday") -> "Work Hard"
in 2..4 -> "Work hard"
"Friday" -> "Party"
is String -> "What?"
else -> "No Clue"
}
fun systemInfo(): String {
val numberOfCores = Runtime.getRuntime().availableProcessors()
return when (numberOfCores) {
1 -> "1 core, packing this one to the museum"
in 2..16 -> "You have $numberOfCores cores"
else -> "$numberOfCores cores!, I want your machine"
}
}
약간 지저분한 코드
fun systemInfo(): String =
when (val numberOfCores = Runtime.getRuntime().availableProcessors()) {
1 -> "1 core, packing this one to the museum"
in 2..16 -> "You have $numberOfCores cores"
else -> "$numberOfCores cores!, I want your machine"
}
}