while 문의 경우 자바와 동일하지만 for문은 for-each 형식의 반복문만 제공한다. 반복문을 사용하는 방법을 알아보자.
코틀린은 특정 법위의 값을 반복하기 위해서 특화된 클래스들로 추상수준을 올렸다. Range 클래스로 범위를 만들기 위해서는 ..를 사용한다.
// 늘 그렇듯이 타입은 생략할 수 있다.
val oneToFive: IntRange = 1..5
val aToE: CharRange = 'a'..'e'
val seekHelp: ClosedRange = "hell".."help"
// contains() 메소드를 이용해 범위 내에 포함되는지 쉽게 알 수 있다.
oneToFive.contains(1) // true
seekHelp.contains("Hell") // false
범위를 통해 for문으로 반복을 수행할 수 있다. 유의할 점은 양 끝의 값을 포함하는 닫힌 구간이라는 것이다.
for(i in 1..5) { print("$i, ") }
ClosedRange<T> 클래스의 범위 객체는 for 반복을 수행할 수 없다. 클래스 내부에 이터레이터가 정의되어 있지 않기 떄문이다. 추후 이 클래스들을 순회하는 방법을 알아보자.
downTo() 메소드를 사용해 후행 반복을 수행할 수 있다. downTo() 메소드를 사용하면 Progression 인스턴스가 생성되어 반복을 수행한다. 중위 표기법을 이용하여 깔끔하게 표기할 수도 있다.
for(i in 'c'.downTo('a')) // 메소드 사용
or
for(i in 'c' downTo 'a') // 중위 표기법
일반적으로 순회할때 마지막 인덱스 전까지 반복한다. 이런 경우에는 until을 사용하면 된다.
for(i in 0 until 5) // 0부터 4까지 반복. 마지막 포함 X
i = i + 3 같이 중간 중간 건너 뛰어 순회하고 싶은 경우가 있을 것이다. 이런 경우에는 step을 사용한다. step이 없는 경우에는 기본적으로 1로 설정되어 있는것이다.
for(i in 1..10 step 3) // 1, 4, 7, 10 출력
3의 배수 또는 5의 배수의 수만 배열하고 싶은 경우가 있을 수 있다. 이런 경우에는 Progression 객체의 filter() 메소드를 사용한다. filter 메소드는 매개변수로 람다식을 사용한다.
for(i in (1..10).filter { it % 3 == 0 || it % 5 == 0}
일반적으로 순회가 가장 많이 사용되는 것은 배열 또는 리스트같은 자료구조다. 코틀린은 JDK의 배열과 컬렉션을 그대로 사용하므로 사용법은 동일하다. 단 코틀린만의 확장 함수로 더 쉽게 간편하게 배열과 컬렉션을 사용할 수 있다.
자바에서는 new 연산자를 통해 배열과 리스트를 생성했지만 코틀린에서는 kotlin 패키지에 포함된 [type]Of() 메소드를 이용한다.
val arr = arrayOf(1,2,3) // 정수 객체 배열 생성
val intArr = intArrayOf(1,2,4) // 원시 타입 배열 생성
각 타입에 맞는 메소드를 호출해 배열과 리스트를 생성할 수 있다.
타 언어와 자바의 for-each 구문과 같이 반복할 수 있다.
for(e in array) { print("$e, ") }
indices 프로퍼티를 이용해 인덱스로 반복할 수 있다.
val nameList = listOf("ABC", "AAA", "CCC")
for(index in nameList.indices) { print(nameList[index] or nameList.get(index)) }
withIndex() 함수를 이용해 인덱스와 위치를 구조분해 할당하여 사용할 수 있다.
val nameList = listOf("ABC", "AAA", "CCC")
for((index, name) in nameList.withIndex()) { print("index : $index, name : $name") }
when은 코틀린에서 switch 문을 대체하는 요소로 표현식이 될 수도, 명령문이 될 수 도 있다. switch문과 다르게 break로 구분하지 않고 : 대신 -> 로 본문을 작성한다.
fun whatToDo(dayOfWeek: Any) = when(dayOfWeek){
"Saterday", "Sunday" -> "Relax"
in listOf("Monday", "Tuesday", "Wednesday", "Thursday") -> "Work hard"
in 2..4 -> "Work hard"
"Friday" -> "Party"
is String -> "What?"
else -> "No Clue"
}
본문의 내용이 표현식이고 else 구문이 존재하면 when을 표현식으로 사용할 수 있다. 블록을 본문으로 사용할 경우 블록의 마지막 줄이 표현식이 된다.
본문의 내용이 표현식이 아닐 경우에는 else가 강제되지 않는다.
when의 파라미터는 외부에서 전달된 값만 사용하는 것은 아니다 직접 값을 정의할 수 있다.
fun systemInfo(): String = when(val numberOfCores = Runtime.getRuntime().availableProcessors()){
1 -> "1 core"
in 2..16 -> "$numberOfCores core"
else -> "Good!"
}