본문 바로가기
프로그래밍/kotlin

[kotlin] 코틀린 차곡차곡 - 2. 조건문과 루프문

by 사바라다 2021. 6. 3.

안녕하세요. 오늘은 여러분들과 함께 코틀린(kotlin)에서 조건문과 루프문, label, exception 등을 통해 흐름 제어(control flow)를 하는 방법에 대해서 알아보는 시간을 가져보고자 합니다.

조건문 ( if )

코틀린에서 if 는 식표현(expression)입니다. 그렇기 때문에 반환 값을 가질 수 있습니다. 물론 일반적으로 구문 (statement) 처럼 사용할 수도 있습니다. 또한 if가 식표현이기 때문에 코틀린에서는 3항연산자를 지원하지 않습니다. if를 이용해서 3항연상자를 대신할 수 있기때문입니다. 아래의 3가지처럼 모두 사용할 수 있습니다.

var max = a
if (a < b) max = b

var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// 식표현으로 3항 연산자 처럼 사용
val max = if (a > b) a else b  

각 조건에 대해서 분기문에 {}로 블럭을 넣을 수 있습니다. 아래처럼 if / else 를 이용해 값을 max에 대입하는 식으로 할 수 있습니다. 이럴 경우 블럭의 마지막 코드는 value가 들어와야합니다. 해당 value가 대입되는 것입니다. 이것은 return 하는 것과는 다릅니다. 또한 이렇게 사용할 때 else 구문은 필수입니다.

val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

 val max = if (a > b) { // 컴파일 오류 발생, return 하는것과 다름, 반환하는 것
    print("Choose a")
    return a 
} else {
    print("Choose b")
    return b
}

다중 선택문 ( when )

코틀린에서 다중 선택문(multiple branches)은 when 키워드를 이용합니다. 사용법은 아래와 같습니다. when은 제일 위의 조건식부터 아래로 차례로 판단하며 내려갑니다. 매칭에 따른 결과는 표현식과 구문 어느것이든 가능합니다. 일치하는 조건식을 찾으면 해당 표현식 또는 구문이 실행되고 when 구문은 마무리 됩니다. 만약 찾기 못하면 else 구문이 실행됩니다. 따라서 else 구문은 when에서 필수 입니다.

var x: Int = 2

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}

조건에는 단일 값 뿐만아니라 함수, 범위, 조건식 등 다양한 요소들이 올 수 있습니다.

when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

when (x) {
    parseInt(s) -> print("s encodes x")
    else -> print("s does not encode x")
}

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")
}

파라미터 없이 if, else if, else의 느낌으로 사용할수도 있습니다.

when {
    x.isOdd() -> print("x is odd")
    y.isEven() -> print("y is even")
    else -> print("x+y is odd")
}

코틀린 공식 문서에는 아래와 같이 재미있는 방법도 예제로 보여주고 있습니다. when 파라미터에 함수의 결과값을 받아와서 성공 또는 실패의 객체를 판단해서 그 결과를 반환하는 Request.getBody()의 호출 결과값으로 반환하는 것입니다.

fun Request.getBody() =
    when (val response = executeRequest()) {
        is Success -> response.body
        is HttpError -> throw HttpException(response.status)
    }

반복문 ( for, while )

반복구문은 for과 while을 사용할 수 있습니다.

for

for은 for ({item} in {collection}) {식 또는 구문}의 형태로 사용합니다. 집합 collection에 대해서 각각 요소를 item으로 정의하고 식을 실행시키는 구조입니다. 아래처럼 사용할 수 있습니다.

val array = arrayOf(1, 2, 3, 4, 5)
for (item in array) {
    print(item) // 결과 : 12345
}

아래와 같은 표현식으로 범위를 지정하고 한 스텝당 변할 크기를 지정하면서 사용할 수도 있습니다.

for (i in 1..3) {
    println(i) // 결과 : 123
}

for (i in 6 downTo 0 step 2) {
    println(i) // 결과 : 6420

경우에 따라서 요소의 위치인 index를 원할 때가 있습니다. 그럴때는 아래와 같이 사용해줄 수 있습니다.

val array = arrayOf(1, 2, 3, 4, 5)
for (index in array.indices) {
    print(array[index]) // 결과 : 12345
}

for ((index, value) in array.withIndex()) {
    println("$index 번째는 $value 값을 가집니다.") 
    // 결과 : 0 번째는 1 값을 가집니다.
    //        1 번째는 2 값을 가집니다.
    //        2 번째는 3 값을 가집니다.
    //        3 번째는 4 값을 가집니다.
    //        4 번째는 5 값을 가집니다.
}

while

두번째 반복문은 while 구문 입니다. while은 조건식을 만족하는 한 계속 반복합니다. 사용하는 방법은 아래와 같습니다. while과 do-while의 차이점은 조건을 먼저확인하냐 아니면 뒤에 확인하냐의 차이입니다.

var x: Int = 5
while (x > 0) {
    x--
}

var y: Int = 5
do {
    val y = retrieveData()
} while (y != null)

마무리

오늘은 이렇게 코틀린에서의 조건문과 반복문에 대해서 알아보는 시간을 가져보았습니다.

코틀린에서는 이 외에도 반복문에서 break, continue 문을 지원하기도 하고 label을 이용해 이동하기도 합니다.

이러한 부분에 대해서는 다음에 또 기회가 되면 이부분에 대해서 이어서 진행해보도록 하겠습니다.

참조

코틀린 인 액션 (Kotlin In Action)

코틀린을 다루는 기술 (The Joy Of Kotlin)

kotlinlang_control-flow

댓글