ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3-2. 함수 정의하기 : 조건문
    Study(종료)/Kotlin 22.09.13 ~ 12.18 2022. 9. 26. 12:51

    3장 정리

    3-1. 함수 정의하기 : 함수

    3-2. 함수 정의하기 : 조건문

    3-3. 함수 정의하기 : 루프

    3-4. 함수 정의하기 : 예외 처리


    3.2 조건문

    1) if문으로 선택하기

    if문을 사용하면 불(boolean) 식의 결과에 따라 두 가지 대안(true/false)중 하나를 선택할 수 있다. 문법은 아래와 같다.

    fun min (a: Int, b: Int): Int{
        return if(a < b) a
        else b
    }
    
    fun max(a: Int, b: Int) = if (a > b) a else b
    
    fun main(args: Array<String>) {
        if(args.isNotEmpty()){
            val message = "Hello :) ${args[0]}"
            println(message)
        }else{
            println(":(")
        }
    }

     

    2) 범위(Range), 진행(Progression), 연산

    코틀린은 순서가 정해진 값 사이의 수열을 표현하는 몇 가지 범위와 진행 타입을 제공한다.여기서 타입은 Int, Float 같은 변수 타입이며

    코틀린 표준 라이브러리에 IntRange, FloatRange, CharProgression 등으로 정의돼 있다.

    범위를 만드는 방법은 수 값에 대해 .. 연산자를 사용하는 것이다.

    var chars = 'a'..'z'
    // CharRange
    var twoDigits = 10..99
    // IntRange
    var zero2One = 0.0..1.0
    // ClosedFloatingPointRange<Double>

    .. 연산을 통해 만들어 지는 범위는 닫혀있다. 즉 시작 값과 끝 값이 범위에 포함된다.

    실제로 위 코드를 작성하면 Intellij에서는 범위를 아래와 같이 표시해 준다

    코드 입력시 범위를 표시해 주는 모습

    끝값이 제외된 반만 닫힌 범위를 만드는 until 연산도 있다.

    이 연산은 정수 타입에 대해서만 사용할 수 있고, 끝 값보다 1 작은 값까지 들어있는 범위를 만들어낸다.

    var twoDigits = 10 until 99 // 10 <= until < 99
    
    // var chars = 'a'until'z' 
    // error
    // var zero2One = 0.0 until 1.0
    // error

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

    일반적인 경우 두 개의 비교식을 조합한 것과 동일하다.이와 반대 연산인 !in 연산도 있다.

    val chars = "abc" .. "xyz"
    println("efg" in chars) // true
    println("zzz" in chars) // false
    println("zzz" !in chars) // true
    
    val twoDigits = 10 until 99
    println(20 in twoDigits) // true
    println(99 in twoDigits) // false

    내장 범위 연산에서 끝 값이 시작 값보다 확실히 더 작으면 범위가 빈 범위가 된다.

    println(5 in 5..5) // true
    println(5 in 5 until 5) // false
    println(5 in 10..1) // false
    
    val arr = 10..1
    println(arr.isEmpty()) // true

    범위와 연관이 있는 개념으로 진행(Progression)이 있다.

    책에서 진행이라고 번역했는데, 이 파트에서 진행이라고 말하는 것 보다는 

    그냥 Progression이라고 표현하는게 더 나아보이기 때문에 Progression이라고 설명하겠다.

    Progression은 정해진 간격만큼 떨어져있는 정수나 Char값으로 이뤄진 수열을 말한다.

    정수나 Char에 대해 정의된 범위는 실제로는 간격이 1인 Progression이라고 할 수 있다.

    하지만 일반적으로 Progression이 범위(Range)보다 더 많은 옵션을 제공한다.

     

    downTO 연산을 이용하면 역방향(Descending) Progression을 만들수 있고,

    step를 이용해 간격을 지정할 수 있다.

    val range = 1..10 step 3 // 1, 4, 7, 10
    for(i in 1..10){
            print("$i ${i in range} ")
    }
    // 1 true 2 false 3 false 4 true 5 false 
    // 6 false 7 true 8 false 9 false 10 true

    step은 양수여야 한다 downTo와 step를 이용해서 Progression을 만들 수 있는데, 이 때도 step는 양수를 사용한다.

    Progression의 원소는 시작 값 + 간격(step)을 더해서 만들어진다.

    따라서 실제로는 끝 값이 Progression에 포함된 원소가 아닐 수도 있다.

    // val range = 10 downTo 1 step -3
    // IllegalArgumentException: Step must be positive, was: -3.
    val range = 11 downTo 1 step 3 // 11, 8, 5, 2
    for(i in 1..11){
        print("$i ${i in range} ")
    }

     


    3) when 문과 여럿 중에 하나 선택하기

    if문은 두 가지 가능성 중 하나를 선택하게 해준다.

    이런 if문을 연쇄적으로 여러 개 사용하면 관심 대상인 조건을 순차적으로 검사하면서 여럿 중 하나를 선택할 수 있다.

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

    두 식을 비교하면 다음과 같다.

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

    코틀린의 when은 여러 대안 중 하나를 선택한다는 점에서 자바의 switch문과 비슷하지만,

    코틀린의 when에서는 임의의 조건을 검사할 수 있지만 자바의 switch문에서는 주어진 식의 여러 값중 하나만 선택할 수 있다.


    다음 글

    3-3. 함수 정의하기 : 루프

    반응형

    댓글

Designed by Tistory.