Control Flow (if, when, for, while) #1
1) 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
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
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 |
'프로그래밍 > Kotlin' 카테고리의 다른 글
코틀린 Higher-Order Functions #2 (0) | 2017.12.21 |
---|---|
코틀린 Higher-Order Functions #1 (0) | 2017.12.20 |
코틀린(Kotlin) Control Flow #2 (0) | 2017.12.19 |
코틀린(Kotlin) 확장(Extension) #2 (0) | 2017.12.16 |
코틀린(Kotlin) 확장(Extension) #1 (0) | 2017.12.14 |
코틀린(Kotlin) 개발환경 구축 (0) | 2017.12.13 |
코틀린(Kotlin) 함수(function) #1 (0) | 2017.12.13 |