ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린 완벽 가이드] 3장 함수 정의하기 (3.3 조건문와 3.4 루프)
    코틀린 공부/코틀린 2023. 12. 29. 11:51

    3.3 조건문

    3.3.1 if 문으로 선택하기

    (자바랑 비슷해서 일부 생략)

     

    자바와 코틀린의 차이점은 if를 식으로 사용할 수 있다는 것이다.

    fun max(a: Int, b: Int) = if(a > b) a else b
    

     

    한쪽만 블록이 있을 수도 있다. 단, if else 둘다 있어야 한다.

    val result = if(i > 0){
        println("i is bigger than 0")
    }else
        println("i is smaller than 0")

     

    코틀린은 자바가 가지고 있는 3항 연산자 (조건 ? A : B) 가 없다. 이 부분이 그것을 상쇄해준다.

     

    3.3.2 범위, 진행, 연산

    코틀린은 순서가 정해진 값 사이의 수열(interval)을 표현하는 몇가지 타입을 제공한다. 코틀린에서는 이런 타입을 범위(range)라고 부름

     

    범위를 만드는 가장 간단한 방법은 .. 연산자를 사용하는 것이다.

    val chars = 'a'..'z'
    val twoDigits = 10.. 99
    val zero2One = 0.0..1.0

     

    in 연산을 사용하면 어떤 값이 범위 안에 들어 있는지 알 수 있다.

    val num = 'a'
    println(num in 'a'..'z') // num >= a && num <= z

     

    이와 반대 연산인 !in도 있다

    println(num !in 'a'..'z')
    

     

    실제로는 수 타입, Char, Boolean, String 등 모든 비교 가능한 타입에 대해 .. 연산을 쓸 수 있다. 기본적으로 <= 와 >=를 쓸 수 있는 타입이라면 이 타입에 대해 ..를 사용해 범위를 만들 수 있다.

    println("def" in "abc".."xyz") // true
    println("zzz" in "abc".."xyz") // false

     

    in/!in 연산을 지원하는 타압은 문자열이나 배열처럼 다른 타입의 원소를 담은 컨터이너 종류의 타입이라면 보통 이 두 연산을 지원한다.

    println(2 in numbers) // true
    println(9 !in numbers) // true
    println('a' in text) // true
    println('H' in text) // false

     

     

    until 연산은 .. 연산과 다르게 끝 값이 범위에 포함되지 않는다.

    println(5 in 5..5)
    println(5 in 5 until 5)

     

    범위와 연관이 있는 개념으로 진행(progression)이 있다. 진행은 정해진 간격(step)만큼 떨어져 있는 정수나 Char 값들로 이뤄진 시퀀스를  말한다. 정수나 Char에 대해 정의된 범위는 실제로는 간격이 1인 진행이라 할 수 있다. step을 사용해 더 큰 범위 옵션을 제공한다.

    for(a in 1..10 step 3){
        println(a) // 1, 4, 7, 10
    }
    for(a in 'a'..'z' step 5){
        println(a) // a f k p u z
    }

     

    downTo 연산 : 내려가는 진행

    println(5 in 10 downTo 1) // true
    

     

    3.3.3 when 문과 여렇 중에 하나 선택하기

    코틀린은 여러 대안 중 하나를 선택할 수 있는 더 간결한 대안인 when을 제공한다.

    fun hexDigit(n: Int): Char {
        return when (n) {
            in 0..9 -> '0' + n
            in 10..15 -> 'A' + n - 10
            else -> '?'
        }
    }

     

    when 문도 if처럼 식으로 사요 ㅇ가능 그럴 경우 else를 반드시 포함

    fun hexDigit2(n: Int): Char = when (n) {
            in 0..9 -> '0' + n
            in 10..15 -> 'A' + n - 10
            else -> '?'
        }
    

     

    코틀린 1.3부터는 다음과 같이 식의 대상을 변수에 연결 할 수 있다. 

    fun readHexDigit() = when(val n = readln().toInt()){
        in 0..9 -> '0' + n
        in 10..15 -> 'A' + n
        else -> '?'
    }

     

    3.4 루프

    3.4.1 while과 do-while 루프

    var randomNumber = Random.nextInt(0, 100)
    while (randomNumber < 50) {
        println("난수 = $randomNumber")
        randomNumber = Random.nextInt()
    }
    
    do {
        randomNumber = Random.nextInt(0, 100)
        println("난수 = $randomNumber")
    }while (randomNumber < 50)

     

    while과 do while의 차이점은 do while은 최소한 1번 수행되고 while은 수행이 안될 수도 있다.

     

    3.4.2 for 루프와 이터러블

    코틀린의 for loop를 사용하면 컬렉션과 비슷하게 여러 값이 들어있을 있는 값에 대한 루프를 수행할 수 있다.

    val a = IntArray(10) {it * it} // 0, 1, 4, 9, 16
    var sum = 0
    for (x in a){
        sum += x
    }
    println("Sum: $sum") // Sum: 285

     

     

    3.4.3 루프 제어 흐름 변경하기: break와 continue

    자바랑 같은 내용이라 생략...

     

    3.4.4 내포된 루프와 레이블

    루프를 내포시켜 사용하는 경우 break/continue 식은 가장 안쪽에 내포된 루프에만 적용된다. 경우에 따라 더 밖에 있는 루프의 제어 흐름을 변경하고 싶을 때가 있을때 사용한다

    fun indexOf(subarray: IntArray, array: IntArray): Int {
        outerLoop@ for(i in array.indices){
            for(j in subarray.indices){
                continue@outerLoop
            }
            return i
        }
        return -1
    }

     

    바깥쪽 루프에 레이블을 붙이고, 하위 배열에 오프셋을 찾는 과정에서 하위 배열과 배열의 원소가 일치하지 않는다면continue@outerLoop를 사용해 바깥쪽 루프에 현재 이터레이션을 끝내고 다음 이터레이션을 시작한다.

     

    레이블을 사용하면 break와 continue를 when 식안에 쓰면서 제어를 옮길 대상 루프를 지정할 수 있다.

    fun breakLoop(){
        val num = Random().nextInt(1, 101)
        
        loop@ while(true){
            val guess = readLine()!!.toInt()
            
            val message = when{
                guess < num -> "Too small"
                guess > num -> "Too big"
                else -> break@loop
            }
        }
    }

     

     

Designed by Tistory.