Kotlin - Control Flow

spring

코틀린의 흐름제어

코틀린에서의 if, switch case문 등등 자바와 좀 다른게 있음

If Else 문

- Java와 거의 유사함

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

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

- If 문이 식으로 사용되는 경우 값을 반환함
- If식의 경우 반드시 else를 동반해야함

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

- If식의 branches들이 블록을 가질 수 있음 {...}
- 블록의 마지막 구문이 반환 값이 됨

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

- 삼항 연산자가 없음
    -If문이 삼항연산자 역할을 잘 해내기 때문

    //Java
    int max = (a>b) ? a : b;

    //Kotlin
    val max = if(a>b) a else b

When 문( 반드시 알아야 할 듯)

- when 문은 C계열 언어의 switch문을 대체함
- when 문은 각각의 branches의 조건문이 만족할 때 까지 위에서부터 순차적으로 인자를 비교함

when(x) {
    1 -> print("x == 1")
    2 -> print("x == 2")

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

- when문이 식으로 사용된 경우에는 조건을 만족하는 branch 의 값이 전체 식의 결과 값이 됨
- else의 경우 다른 branch들의 조건이 만족되지 않을때 수행됨
- when 이 식으로 사용된 경우 else문이 필수
- when이 식으로 사용된 경우 컴파일러가 else문이 없어도 된다는 것을 입증할 수 있는 경우에는 else 생략 가능

var res = when(x) {
    100 -> "A"
    90 -> "B"
    80 -> "C"
    else -> "F"
}


var res = when(x) {
    true -> "맞다"
    false -> "틀리다"
}

- 여러 조건들이 같은 방식으로 처리될 수 있는 경우, branch의 조건문에 콤마를 사용하여 표기 하면 됨

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

- Branch의 조건문에 함수나 식을 사용할 수 있음

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

- range나 collection에 in이나 !in으로 범위 등을 검사할 수 있음

val validNumbers = listOf(3,6,9)

when (x) {
    in validNumbers -> print("x is valid")
    in 1..10 -> print("x is in the range")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}

-is나 !is를 이용하여 타입도 검사 할 수 있음(이때 스마트 캐스트가 적용됨)

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

- when은 if- else if를 대체 할 수 있음
- when에 인자를 입력하지 않으면, 논리 연산으로 처리됨

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

For Loops

- for문은 iterator을 제공하는 모든 것을 반복할 수 있음
    for(item in collection)
    print(item)

- 블럭 사용가능
    for(item in collection) {
            print(item.id)
            print(item.name)
        }

- for문 조건
    - iterator를 가지고잇어야함
        -hasNext(),next()가 있어야함
    위 세개는 operator로 선언되어야함



    fun main(args: Array<String>) {
        val myData = MyData()
        for(item in myData) {
            print(item)
        }
    }

    class MyIterator {
        val data = listOf(1,2,3,4,5)
        var idx = 0
        operator fun hasNext() : Boolean {
            return data.size > idx
        }

        operator fun next(): Int {
            return data[idx++]
        }
    }

    class MyData {
        operator fun iterator() : MyIterator {
            return MyIterator();
        }
    }

- 배열이나 리스트를 반복할 때, index를 이용하고 싶다면 indices를 이용하면 됨

    val array = arrayOf("가","나","다")

    for(i in array.indices) {
        println("$i:${array[i]}")
    }

- Index를 이용하고 싶을때, withIndex()를 이용할 수도 있음 ( 이게 더 좋다고함)
    for((index,value) in array.withIndex()) {
        println("$index:${value}")
    }
효준's profile image

효준

2018-09-01 11:30

다른글 보러가기

Kotlin - Basic Types

이전 포스트

안드로이드에서 네트워크 접속 방법 & 권한주기

다음 포스트