코틀린 기본 – 흐름 제어

IF 표현식

코틀린에서 if문은 표현식이다. 따라서 값을 리턴한다. 일반적인 if 구문으로도 가능하기 때문에 3항 연산자(ternary operator : ?)가 없다

// 일반적 용법
var max = a
if (a < b) max = b

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

// 표현식
val max = if (a > b) a else b

if 구문이 블럭으로 구성되어 있다면 블럭의 가장 마지막 식이 리턴된다.

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

if문을 선언문(statement)가 아닌 표현식(expression)으로 사용하고자 한다면 반드시 else 블럭이 있어야 한다

WHEN 표현식

when 구문은 C 스타일 언어에서의 switch 구문을 대체한다. 가장 간단한 형태의 용법은 다음과 같다

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

when 구문은 인자에 대해 모든 비교 구문이 만족될 때까지 순차적으로 비교를 진행한다. when 구문은 선언문(statement)와 표현식(expression)형태 모두 사용할 수 있다. 표현식으로 사용될 때는 반족한 비교 구문의 값이 전체 표현식의 값이 되고 선언문 형태로 사용할 때에는 각 비교 구문식의 값은 무시된다

else 구문은 모든 비교 구문을 만족하지 못할 때 실행된다. when 구문이 표현식으로 사용될 때에는 컴파일러가 정의된 구문들이 모든 값을 커버할 수 있다고 판단되지 않으면 else 구문을 반드시 지정해야 한다.

만약 여러 값들이 동일한 방식으로 처리되어야 한다면 비교식에 값을 콤마(,)로 구분하여 나열할 수 있다

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

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

또 다른 사용법은 값이 특정한 타입이거나 아닐 경우이다. 코틀린의 스마트 캐스팅 기능 때문에 비교 후 별도의 캐스팅 작업없이 타입의 메서드나 프로퍼티를 사용할 수 있다.

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

when 구문은 if-else if 체인을 대체할 수 있다. 인자가 제공되지 않고 비교식이 boolean 표현식이라면 비교 구문이 true일 때 블럭이 실행된다

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

when구문 문법을 참조

FOR Loop

for 구문은 iterator를 제공하는 어떤 타입의 내용을 순차적으로 탐방한다. 문법은 다음과 같다

for(item in collection) print(item)

바디 부분은 블럭으로 사용할 수 있다

for(item: Int in ints) {
    // ...
}

위에서 언급한대로 for구문은 iterator를 제공하는 어떤 타입에 대해서 사용할 수 있는데

  • iterator() 함수를 멤버 혹은 확장함수로 가지는 타입에 대해 리턴 타입은
    • next() 함수를 멤버 혹은 확장 함수로 가지고
    • Boolean을 리턴하는 hasNext()를 가져야 한다

위 3개의 함수는 operator로 선언되어 있어야 한다

for 루프는 iterator 객체를 지원하지 않는 배열에 대해 index 기반의 루프를 수행한다

만약 배열이나 List 타입에 대해 index값과 함께 탐색하고 싶다면 아래와 같은 방식으로 할 수 있다

for(in in array.indices) {
    print(array[i])
}

혹은 아래와 같은 방식도 가능하다

for((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

for 구문 문법 참조

While Loop

while 구문과 do..while 구문은 일반적인 형태로 사용할 수 있다

while(x > 0) {
    x--
}

do {
    val y = retrieveData()    
} while(y != null)

while 구문 문법 참조

Break and continue in loops

코틀린은 전통적인 루프 내에서 breakcontinue 키워드를 제공한다

Return and Jump 참조

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중