Kotlin - 조건문 및 반복문

Updated:

  • 조건문 및 반복문

    • 조건문

      • IF : 코틀린에서 if는 표현식으로 반환값을 가진다. 그렇기에 코틀린에는 삼항연산자가 존재하지 않음(보통 if가 삼항연산자의 역할을 잘 수행하기 때문, 또한 코틀린에서 ? 는 NULL 관련하여 사용됨)

        //전통적인 사용법
        var max = a
        if(a<b) max = b
              
        //else 와 함께
        var max: Int
        if(a>b){
          max = a
        }else{
          max = b
        }
              
        //표현식으로 사용
        var max = if(a>b) a else b
        

        또한 if 표현식의 branch들은 여러문장을 가지는 불록으로 구성가능, 이 경우 마지막 표현식이 반환

        (표현식으로 사용하는 경우<값 반환="" 혹은="" 변수="" 할당시=""> 반드시 else를 가져야함)

        val max = if(a>b){
          print("Choose a")
          a
        }else{
          print("Choose b")
          b
        }
        
      • When : switch/case 문과 같은 역할을 한다. 대응하는 조건에 맞는 조건을 찾을 때 까지 순차적으로 맞춰보며 그렇지 않으면 else 에 걸리게 된다. 또한 조건은 , 로 결합해서 사용이 가능하다.

        //basic expression
        when(x){
          1 -> print("x = 1")
          2 -> print("x = 2")
          else -> {
            print("x is neither 1 nor 2")
          }
        }
              
        // `,` usage
        when(x){
          0, 1 -> print("x = 0 or x =1")
          else -> print("otherwise")
        }
              
        //조건에 상수 뿐만 아니라 임의의 표현식도 사용 가능
        when(x){
          parseInt(s) -> print("s encodes s")
          else -> print("s does not encode x")
        }
              
        //범위와 어떤 collection에 포함 되는지 여부를 알 수 있다(in or !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")
        }
              
        //if - else if 대체 가능, 인수가 없으면 조건은 단순히 boolean 표현이며, 참일 경우에만 실행
        when {
            x.isOdd() -> print("x is odd")
            y.isEven() -> print("y is even")
            else -> print("x+y is even.")
        }
              
        //kotlin 1.3 이후로는 다음과 같이 when의 subject를 변수로 capture 가능
        //변수는 when 의 body에서만 사용이 가능하다.
        fun Request.getBody() =
                when (val response = executeRequest()) {
                    is Success -> response.body
                    is HttpError -> throw HttpException(response.status)
                }
        
        • 특정 타입의 값이 있는지 확인이 가능하다 (is or !is ), smart casts (객체 유형의 검사를 한 후 블block내에서 자동으로 캐스팅 되는것, 명시적인 형변환 필요 X) 로 인해 별도의 점검 없이 타입의 메소드나 속성에 접근이 가능한 점에 유의
        fun hasPrefix(x: Any) = when(x) {
            is String -> x.startsWith("prefix")
            else -> false
        }
        
    • 반복문

      • For : for loop 는 iterator가 제공하는 모든것을 반복, C#에서의 foreach loop 와 동일

        for (item in collection) print(item)
              
        //body는 block으로 감쌀 수 있음
        for (item : Int in ints){
          ...
        }
        
        • 멤버 또는 확장함수 iterator() 를 가지며 return type은 멤버 혹은 확장 함수인 next(), hasNext()를 가지며, hasNext()는 Boolean을 return 함 -> 3가지 함수는 모두 operator로 표시해야함

        • 숫자 범위 반복시 range expression을 사용

        for (i in 1..3) {
            println(i)
        }
        for (i in 6 downTo 0 step 2) {
            println(i)
        }
              
        //for loop(범위 또는 배열 반복)는 iterator를 생성하지 않고 index를 기반으로 한 loop로 compile 됨, 인덱스를 통해 반복하려면 아래와 같이 사용
        for(i in array.indices){
          print(array[i] + " ")
        }
              
        //withIndex 라이브러리 함수 사용 가능, 인덱스와 값을 동시에 사용 가능
        for ((index, value) in array.withIndex()) {
            println("the element at $index is $value")
        }
        
      • While : while과 do..while은 다른 언어들과 똑같이 동작

        while (x > 0) {
            x--
        }
              
        do {
            val y = retrieveData()
        } while (y != null) // y is visible here!
        
      • Break and continue in loops : Kotlin에서는 loop에서 전통적인 break과 continue operators를 지원함. Returns and jumps