Search

Conditions and loops

if

Kotlin에서 if는 값을 반환하기 때문에 표현식으로 사용된다.
if문으로 동일한 동작을 기대할 수 있기 때문에 전통적인 삼항 연산자는 필요하지 않다.
//단순 if문을 사용하여 변수에 값을 할당하는 방법 var max = a if (a < b) max = b //else를 포함한 if문 if (a > b) { max = a } else { max = b }
Kotlin
복사
if문을 표현식으로써 사용하려면 else 분기는 필수로 사용해야 하고 없으면 컴파일 오류가 발생한다.
//if를 표현식으로 사용하기 max = if (a > b) a else b //else if를 사용한 표현식 val maxLimit = 1 val maxOrLimit = if (maxLimit > a) maxLimit else if (a > b) a else b //블록을 사용하는 if 표현식 val max = if (a > b) { print("Choose a") a } else { print("Choose b") b }
Kotlin
복사

when

여러 분기가 있는 조건식을 정의한다.
표현식 또는 명령문으로 사용할 수 있다.
전체 혹은 각 분기는 블록이 될 수 있다.
어떤 분기 조건이 충족될 떄까지 모든 분기에 대해 인수를 순차적으로 일치시킨다.
//when을 표현식으로 사용 val result = when (x) { 1 -> "one" 2 -> "two" else -> "other" } //when을 명령문으로 사용 when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { print("x는 1도 2도 아님") } } //블록을 사용한 분기 val max = when { a > b -> { print("Choose a") a } else -> { print("Choose b") b } }
Kotlin
복사
when에서 else가 필수인 경우
주체가 Boolean, Enum, sealed 타입일 때 또는 그들의 nullable 타입일 때
모든 경우를 분기로 다루지 않는 경우
enum class Color { RED, GREEN, BLUE } when (getColor()) { Color.RED -> println("red") Color.GREEN -> println("green") Color.BLUE -> println("blue") // 'else'가 필요 없음: 모든 경우가 처리됨 } when (getColor()) { Color.RED -> println("red") // GREEN과 BLUE에 대한 분기가 없음 else -> println("not red") // 'else'가 필요 }
Kotlin
복사
여러 조건을 결합하려면 단일 줄에 , 를 이용해서 결합한다.
when (x) { 0, 1 -> print("x는 0 또는 1") else -> print("그 외") }
Kotlin
복사
분기 조건으로 상수뿐만 아니라 임의의 표현식을 사용할 수 있다.
when (x) { s.toInt() -> print("s encodes x") else -> print("s does not encode x") }
Kotlin
복사
in 또는 !in 을 통해 값이 범위 또는 컬렉션인지 확인할 수 있다.
when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above") }
Kotlin
복사
is 또는 !is 를 통해 값이 특정 타입인지 확인할 수 있다. (스마트 캐스트 가능)
fun hasPrefix(x: Any) = when(x) { is String -> x.startsWith("prefix") else -> false }
Kotlin
복사
주체가 없으면 각 분기의 조건은 boolean 표현식이기 때문에 if-else if 체인을 대체할 수 있다.
when { x.isOdd() -> print("x는 홀수") y.isEven() -> print("y는 짝수") else -> print("x+y는 홀수") }
Kotlin
복사
주체로 변수를 캡처하면 블록 범위 내에서 사용할 수 있다.
fun Request.getBody() = when (val response = executeRequest()) { is Success -> response.body is HttpError -> throw HttpException(response.status) }
Kotlin
복사

for

반복을 통해 컬렉션이나 시퀀스 같은 이터러블 객체의 각 항목을 순회하는데 사용된다.
이터러블 객체의 요구사항
iterator() : Iterator<>를 반환하는 메서드 또는 확장 함수
next() : 다음 요소를 반환하는 메서드
hasNext() : 다음 요소가 존재하는지 여부를 반환하는 메서드 (boolean 타입)
//블록을 사용하지 않는 경우 for (item in collection) print(item) //블록을 사용하는 경우 for (item in collection) { print(item) }
Kotlin
복사
범위 표현식(..) 을 이용하여 범위를 지정하여 반복할 수 있다.
for (i in 1..3) { println(i) // 1, 2, 3을 출력 }
Kotlin
복사
범위 표현식에 downTo(), step(), until() 함수를 사용하여 반복할 수 있다.
for (i in 6 downTo 0 step 2) { println(i) // 6, 4, 2, 0을 출력 } for (i in 1 until 5) { println(i) // 1, 2, 3, 4, 5을 출력 }
Kotlin
복사
indicies() 함수 또는 withIndex 라이브러리 함수를 통해 배열이나 리스트의 인덱스를 순회할 수 있다.
for (i in array.indices) { println(array[i]) // 배열의 각 요소를 인덱스를 통해 출력 } for ((index, value) in array.withIndex()) { println("the element at $index is $value") // 각 요소의 인덱스와 값을 출력 }
Kotlin
복사

while

조건이 만족되는 동안 계속해서 반복하는 루프이다.
루프를 시작하기 전에 조건을 검사한다.
while (x > 0) { x-- // x가 0보다 큰 동안 x를 감소시킵니다. }
Kotlin
복사

do-while

조건이 만족되는 동안 계속해서 반복하는 루프이다.
루프의 본문을 먼저 실행한 후 조건을 검사한다.
do { val y = retrieveData() // 데이터를 가져오는 작업을 수행합니다. } while (y != null) // y가 null이 아니면 루프를 계속합니다.
Kotlin
복사