조건절 if, when, for, while

2018, Jun 12    

If Expression


코틀린에서는 if 조건절에서 value를 리턴할수 있다.
따라서 다음과 같은 삼항 조건 연산자가 존재하지 않는다. 예) (x=1)? “true” : “false”


  //전통적인 방식
  var max: Int
  if (a<b) {
    max = a
  }else {
    max = b
  }

  //코틀린에선 다음과 같이 바로 if에서
  //return value 값을 변수에 할당해 줄수 있다.
  val max = if(a > b) a else b

  //if 블럭안에 다른 코드가 있는 경우 마지막 구문이 반환 값이 된다.
  val max = if(a > b) {
    print("Choose a")
    a
  } else {
    print("Choose b")
    b
  }
  • 위와 같이 if결과값을 변수에 할당해야 하는 경우(if절로 부터 리턴받아야 할 값이 있는 경우)라면 반드시 else절이 존재 해야 한다.

 //오류 발생 없음
  if(a > b) {
    println("It's Ok")
    a
  }

 //else가 없어서 syntax 오류 발생
 val max = if(a > b) {
   println("It's Ok")
   a
 }
 

When Expression

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

when(x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}
  • if절과 마찬가지로 반환값을 넘길 수 있다.

 fun whenTest5(x : Int) {
    val result:String = when(x) {
         3 -> "3"
         4 -> "4"
        else -> "else"
    }
}
 
  • is or ! 연산자를 이용하여 객체 타입 체크

fun hasPrefix(x: Any) = when(x) {
  is String -> x.startsWith("prefix")
  else -> false
}
  • 인자 없이 branch에 조건절을 지정하여 true인 branch 실행

 when {
     x.startsWith("0") -> print("start 0")
     x.startsWith("1") -> print("start 1")
     else -> print("x is funny")
 }
  • 그 밖의 다양한 사용법

  when(x) {
    //x가 0,1 중 하나인지 체크 가능
      0, 1 -> print("x == 0 or x == 1")
      else -> print("otherwise")
  }

  when(x) {
    //임의의 특정값을 branch 조건식에 넣을 수 있다.
    parseInt(s) -> print("s encodes x")
    else -> print("s does not encode x")
  }

 //범위 체크
  val validNumbers = 50..100
  when(x) {
    in 1..10 -> print("x is in the rage")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
  }

For Loops

  • for문은 iterator를 제공하는 모든 것을 반복 할수 있다.
    ( - has a member- or extension-function iterator(), whose return type
    - has a member- or extension-function next(), and
    - has a member- or extension-function hasNext() that returns Boolean.)

  for(item in collection) print(item)

  for(item: Int in ints) {
    //...
  }
  • 범위 표현식을 이용하여 loop의 범위를 설정 할 수 있다.

  for(i in 1..3) {
    println(i)
  }
  >>>
  1
  2
  3  

  for(i in 6 downTo 0 step 2) {
    println(i)
  }
  >>>
  6
  4
  2
  0
  • index를 사용하고 싶다면 indices를 이용하면 된다.xz

  val array = arrayOf(1,2,3,4)
  for (i in array.indices) {
      println(array[i])
  }
  >>>
  1
  2
  3
  4

* While Loops*

while문은 do..while과 유사하게 작동한다.


while (x > 0) {
  x--
}

do {
  val y = retrieveData()
} while (y != null) // y is visible here!