굥뷰를 햡시댜

[Kotlin] Control Flow 본문

언어/Kotlin

[Kotlin] Control Flow

GodZ 2019. 4. 24. 02:36

1. if else 문

  • Java와 거의 유사함
  • ex) 아래와 같이 사용하면 됩니다.
var max: Int
if(a>b) {
    max = a
}
else {
    max = b
}

 

2. if else 문

  • if문이 식으로 사용되는 경우 값을 반환
  • if식의 경우 반드시 else를 동반해야 함
  • ex) 아래 코드처럼 if문이 식으로 사용되는 경우 else를 반드시 동반해야 함(+ a, b는 반환되는 값)
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문이 삼항연산자 역할을 잘 해내기 때문에
  • ex)
//Java
int max = (a>b) ? a : b;
//Kotlin
val max = if(a>b) a else b

 

3. when

  • when문은 C계열 언어의 switch문을 대체합니다.
  • when문은 각각의 branches의 조건문이 만족할 때 까지 위에서부터 순차적으로 인자를 비교합니다.
  • ex) 
when(x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}
  • when문이 식으로 사용된 경우에는 조건을 만족하는 branch의 값이 전체 식의 결과 값이 됩니다.
  • when이 식으로 사용된 경우 if문과 마찬가지로 else문이 필수로 사용됩니다.
  • 하지만, when이 식으로 사용된 경우 컴파일러가 else문이 없어도 된다는 것을 입증할 수 있는 경우에는 else를 생략할 수 있습니다. -> (when의 조건에 boolean 값이 들어올 경우)
//when문을 식으로 사용 -> else 필수
var res = when(x) {
    100 -> "A"
    90 -> "B"
    80 -> "C"
    else -> "F"
}
//when문이 식으로 사용 -> else 생략
var res = when(x) {
    true -> "맞다"
    false -> "틀리다"
}
  • 여러 조건들이 같은 방식으로 처리될 수 있는 경우, branch의 조건문에 콤마(,)를 사용하여 표기 가능
when(x) {
    0, 1 -> print("x == 0 or x == 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) {		//x에 어떤 객체가 들어오고
    is String -> x.startsWith("prefix")	//x가 String이 맞는지 확인하는 동시에 x를 String으로 만들어줌 -> 맞으면 startsWith 실행
    else -> false
}
  • when은 if-else를 완벽히 대체할 수 있음
  • when에 인자를 입력하지 않으면, 논리연산으로 처리됨
when {
    x.isOdd() -> print("x is odd")
    x.isEven() -> print("x is even")
    else -> print("x is funny")
}

 

4. For Loops

  • for문은 iterator를 제공하는 모든 것을 반복할 수 있음
for(item in collection)	//item에 collection의 항목들이 각각 들어가면서 반복
    print(item)
  • for문의 Body에 블록이 올 수도 있음
for(item in collection) {
    print(item.id)
    print(item.name)
}
  • for문을 지원하는 iterator의 조건
  • 멤버함수나 확장함수 중에 iterator()를 반환 하는 것이 있는 경우 next()를 가지는 경우, hasNext():Boolean을 가지는 경우라면 for문을 사용할 수 있습니다!
  • 단, 위의 세 함수는 operator로 표기 되어야 합니다.
  • ex)
fun main(args: Array<String>) {
    val myData = MyData()
    for(item in myData) {				//for문 실행
        println(item)
    }
}

//MyIterator는 next()와 hasNext()라는 operator를 가지고 있는 클래스임
class MyIterator {
    val data = listOf(1, 2, 3, 4, 5)
    var idx = 0
    operator fun hasNext(): Boolean {			//hasNext():Boolean
        return data.size > idx
    }
    
    operator fun next(): Int {				//next()
        return data[idx++]
    }
}

//MyData라는 클래스는 iterator를 반환하는 클래스임
class MyData {
    operator fun iterator(): MyIterator {		//iterator를 반환하는 경우
        return MyIterator()
    }
}
  • 배열이나 리스트를 반복할 때, index를 이용하고 싶다면 indices를 이용하면 됨
val array = arrayOf("가", "나", "다")
for(i in array.indices) {
    println("$i: ${array[i]}")
}
  • indices를 제외하고 또 다른 방법으로는, withIndex()를 이용하는 방법도 있음 -> index와 value 두 개를 동시 반환함
val array = arrayOf("가", "나", "다")
for((index, value) in array.withIndex()) {
    println("$index: ${value}")
}

 

5. while Loops

  • while, do-while문은 java와 거의 같음
  • do-while문에서 body의 지역변수를 do-while문의 조건문에서 참조할 수 있음 -> Kotlin에서만 가능!
do {
    val y = retrieveData()
}while(y != null)

'언어 > Kotlin' 카테고리의 다른 글

[Kotlin] Inheritance  (0) 2019.04.24
[Kotlin] Class  (0) 2019.04.24
[Kotlin] Packages, Return and Jumps  (0) 2019.04.24
[Kotlin] Basic Types  (0) 2019.04.23
[Kotlin] Basic Syntax  (0) 2019.04.23
Comments