brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Dec 17. 2017

코틀린(Kotlin) Control Flow #1

빠르게 살펴보기

Control Flow (if, when, for, while) #1


 1) if


 코틀린에도 if문이 있습니다.                    


 fun main(args: Array<String>) {

    println(getBiggerNumber(1, 10))

}


fun getBiggerNumber(a: Int, b: Int) : Int {

    var bigger = a

    if (a < b) bigger = b

    return bigger

}


 10 



 if문이 값을 리턴하기 때문에 일반적인 if문이 삼항연산자(ternary operator)의 역할을 하기 때문에 삼항연산자가 없습니다.                   


 fun main(args: Array<String>) {

    println(getBiggerNumber(1, 10))

}


fun getBiggerNumber(a: Int, b: Int) : Int {

    val bigger = if (a > b) a else b

    return bigger

}


 10 



 당연히 if else문도 가능합니다.                    


 fun main(args: Array<String>) {

    println(getBiggerNumber(1, 10))

}


fun getBiggerNumber(a: Int, b: Int) : Int {

    var bigger = a

    if (a > b) {

        bigger = a

    } else {

        bigger = b

    }

    return bigger

}


 10



 if 분기문은 블록을 가질 수 있는데 블록의 마지막 표현식(expression)이 블록의 값입니다. if 분기문을 명령문(statement)이 아닌 표현식으로 사용하면 (값을 리턴하거나 변수에 할당하는 경우인) 표현식은 else가 필수입니다.                    


fun main(args: Array<String>) {

    println(getBiggerNumber(1, 10))

}


fun getBiggerNumber(a: Int, b: Int) : Int {

    println("a = $a, b = $b")

    val bigger = if (a > b) {

        b

        a // 마지막 표현식

    } else {

        a

        b // 마지막 표현식

    }

    return bigger

}


 10



2) when


 when은 생소한 키워드입니다. 대신 switch는 익숙하실겁니다. when은 바로 switch를 대체하는 존재입니다. 사용하는데 있어서 완전히 같지는 않지만 매우 유사합니다.


 예를 들어 다음의 Java코드는 코틀린으로 조금 다른 형태로 표현됩니다. 기본 동작은 switch와 같이 분기문의 조건이 만족될 때까지 순차적으로 모든 분기문에 대해 인자를 매칭시킵니다. 만족하는 경우가 없으면 else로 갑니다.


 컴파일러가 모든 케이스가 분기 조건으로 커버되는지 증명할 수 없다면 else 분기는 필수(mandatory)입니다.


Java


 int  a = 1;

 switch (a) {

   case 1:

     System.out.println("a = 1");

     break;

   case 2:

     System.out.println("a = 2");

     break;

   default:

     System.out.println("a is neither 1 nor 2");

}


코틀린


 val a = 1

 when (a) {

   1 -> println("a = 1")

   2 -> println("a = 2")

   else -> println("a is neither 1 nor 2")

 }



 만약 많은 케이스가 같은 방식으로 처리되야 한다면 분기 조건은 ,(comma)로 결합될 수 있습니다. 만약 Java 라면 break가 줄어든 모습이겠죠.


Java


    int  a = 1;       

    switch(a) {

      case 1:

      case 2:

         System.out.println("a = 1 or a = 2");

         break;

      default:

         System.out.println("a is neither 1 nor 2");

      }


코틀린


  val a = 1

 when (a) {

   1, 2 -> println("a = 1 or a = 2")

   else -> println("a is neither 1 nor 2")

 }



 when 역시 명령문(statement)이나 표현식(expression)으로 사용가능합니다. 명령문으로 사용하면 각 분기문의 값은 무시됩니다. 

 다음과 같이 명령문(statement)이 아닌 표현식(expression)일 경우에는 if문과 마찬가지로 블록의 마지막 표현식이 값이 됩니다. 


fun main(args: Array<String>) {

    getNumber(1)

}


fun getNumber(a: Int) {

    var result = when (a) {

        1 -> {

            println("a = 1") ; 1 // 같은 라인에서 표현식을 분리하려면 ;(세미콜론)을 사용해야 합니다.

        }

        2 -> {

            println("a = 2")

            2

        }

        else -> {

            println("x is neither 1 nor 2")

        }

    }

    println("result = $result")

}


 a = 1

 result = 1



 분기 조건으로 임의의 표현식을 사용할 수도 있습니다.


import java.lang.Integer.parseInt


fun main(args: Array<String>) {

    getNumber(100)

}


fun getNumber(a: Int) {

    when (a) {

        parseInt("100") -> println("a = 100")

        else -> println("a is neither 1 nor 2")

    }


 a = 100



 또한 range나 collection에 값이 존재하는지 확인할 수도 있습니다. 이때는 in(포함하는 경우) 또는 !in(포함하지 않는 경우)을 사용합니다.


fun main(args: Array<String>) {

    getNumber(5)

}


fun getNumber(a: Int) {

    when (a) {

        in 1..10 -> print("a is in the range")

        !in 10..20 -> print("a is outside the range")

    }

}


 a is in the range


 

 특정 타입의 is 또는 !is 값을 확인할 수도 있습니다. is는 객체가 주어진 타입을 따르는지 아닌지 확인합니다. Java의 instanceof를 생각하시면 될 것 같습니다.                    


fun main(args: Array<String>) {

    getType("ABC")

}


fun getType(a: Any) = when (a) {

    1 -> print("a = $a")

    is String -> print("a is String $a")

    else -> print("etc")

}


 a is String ABC


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari