ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린] 외부 반복과 아규먼트 매칭
    코틀린 2022. 3. 7. 11:01

    1. 범위와 반복

    range

    코틀린에서는 특정 범위 내 반복을 위한 클래스가 있다.

    val shortRange: IntRange = 1 .. 5

    1부터 5까지의 반복을 위한 클래스는 위와 같다.

    val aToZ: CharRange = 'a' .. 'z'
    

    위는 a 부터 z까지의 반복을 하기 위한 변수 정의이다.

    val stringRange: ClosedRange<String> = "aaa" .. "aad"
    println(stringRange.contains("aac"))
    println(stringRange.contains("aae"))

     

    정방향 반복

    val shortRange: IntRange = 1 .. 5
    println(shortRange)
    for(i in shortRange) print("$i ") // 1 2 3 4 5 출력
    val aToZ: CharRange = 'a' .. 'z'
    for(i in aToZ) println(i) // a부터 z까지 출력됨
    val stringRange: ClosedRange<String> = "aaa" .. "aad"
    for(i in stringRange) println(i) // 에러 발생

    IntRange, CharRange와 다르게 ClosedRange<T> 타입은 iterator()을 구현해주어야 한다.

     

    후방향 반복

    for(i in 5.downTo(1))
        print("$i ")
    // 5 4 3 2 1
    
    for(i in 5 downTo 1) // 중위표기법 사용 가능
        print("$i ")

    후방향 반복은 downTo 메서드를 이용하면 된다.

     

    범위안의 값 건너뛰기

    until 메소드는 마지막 값을 포함시키지 않는다. 

    for(i in 1 until 5)
        print("$i ")
    
    // 1 2 3 4 출력됨

    step 메소드로 일정 간격으로 반복문을 실행시킬 수 있다.

    println("step")
    for(i in 1 .. 10 step 3)
        print("$i ")
    // 1, 4, 7, 10 출력
    
    
    println("step to downTo")
    for(i in 10 downTo 1 step 3)
        print("$i ")
    // 10, 7, 4, 1 출력

    filter로 좀 더 세부적인 제한을 줄 수 있다.

    println("filter")
    for(i in (1 .. 10).filter { it % 3 == 0 || it % 5 == 0}) // 3의배수 또는 5의배수만 반복
        print("$i ")

     

    2. 배열과 리스트의 반복

    배열생성은 arrayOf로 할 수 있다.

    val array = arrayOf(1, 2, 3)
    println(array.joinToString(", ", "[", "]") // 출력 [1, 2, 3]
    println(arrayOf("ab", "ac", "ad").joinToString(", ", "[", "]")) // 출력 [ab, ac, ad]

    arrayOf로 배열을 생성하게 되면 객체의 타입을 가진 배열이 생성된다. 원시타입 int로 배열을 생성하고 싶으면 intArrayOf를 사용할 수 있다.

    println(intArrayOf(1, 2, 3).joinToString(", ", "[", "]") // [1, 2, 3]

    List<T>의 인스턴스를 listOf()함수를 이용해서 만들 수도 있다.

    println(listOf(1, 2, 3).javaClass) // class java.util.Arrays$ArrayList

    반복시 index가 필요한 경우가 있다. 이럴 경우 indices 프로퍼티나, withIndex 함수를 이용할 수 있다.

    val names = listOf("park", "kim", "lee")
    for(index in names.indices) {
        println("$index ${names[index]}")
    } // 0 park, 1 kim, 2 lee 가 개행과 함께 출력됨
    
    for((index, name) in names.withIndex()) {
        println("$index $name")
    } // 0 park, 1 kim, 2 lee 가 개행과 함께 출력됨

     

    3. when을 사용해야 할 때

    표현식으로서의 when

    코틀린에는 switch문이 없고 대신 when이 있다.

    if else 를 여러개 사용하여 작성해야 하는 경우 when 표현식을 고려해 볼 수 있다.

    when이 표현식으로 활용될 때는 else를 통해 기본 값을 만들어 주어야 한다.

    fun isAlive(alive: Boolean, numberOfLiveNeighbors: Int) = when {
        numberOfLiveNeighbors > 3 -> false
        numberOfLiveNeighbors < 2 -> false
        numberOfLiveNeighbors == 3 -> true
        else -> alive && numberOfLiveNeighbors == 2
    }
    

    when은 인자를 받을 수도 있다. 

    fun translateDay(dayOfWeek: Any) = when (dayOfWeek) {
        "Sat", "Sun" -> "주말"
        in listOf("Mon", "Tue", "Wed", "Thu", "Fri") -> "평일"
        in 0 .. 4 -> "평일"
        is String -> "Give Mon - Sun"
        else -> "Give String"
    }
    
    println(translateDay("Sat")) // 주말
    println(translateDay("Fri")) // 평일
    println(translateDay("abcd")) // Give Mon - Sun
    println(translateDay(10)) // Give String

    위의 when은 dayOfWeek을 인자로 받아 dayOfWeek 의 값이나 타입에 따라서 다른 문자열을 반환한다.

     

    명령문으로써의 when

    명령문일때는 Unit을 리턴하게되고 else가 없어도 상관 없다. 아무곳에도 해당되지 않으면 아무것도 하지 않는다.

    fun printTranslateDay(dayOfWeek: Any) {
        when (dayOfWeek) {
            "Sat", "Sun" -> println("주말")
            in listOf("Mon", "Tue", "Wed", "Thu", "Fri") -> println("평일")
            in 0..4 -> println("평일")
            is String -> println("Give Mon - Sun")
        }
    }
    printTranslateDay("Sat") // 주말
    printTranslateDay("Fri") // 평일
    printTranslateDay("abcd") // Give Mon - Sun
    printTranslateDay(10) // 아무것도 하지 않음

     

    when과 변수의 스코프

    when의 인자를 선언하는 곳에 변수를 정의해서 변수의 스코프를 when 안에서만 사용되도록 제한할 수 있다.

    val dayOfWeek: Any = "Sat"
    println(when (dayOfWeek) {
        "Sat", "Sun" -> "주말"
        in listOf("Mon", "Tue", "Wed", "Thu", "Fri") -> "평일"
        in 0 .. 4 -> "평일"
        is String -> "Give Mon - Sun"
        else -> "Give String"
    })
    println(dayOfWeek)
    
    println(when (val dayOfWeek1: Any = "Sat") {
        "Sat", "Sun" -> "주말"
        in listOf("Mon", "Tue", "Wed", "Thu", "Fri") -> "평일"
        in 0 .. 4 -> "평일"
        is String -> "Give Mon - Sun"
        else -> "Give String $dayOfWeek1"
    })
    //print(dayOfWeek1)

     

    참고

    다재다능 코틀린 프로그래밍 4장

    '코틀린' 카테고리의 다른 글

    [코틀린] 클래스와 상속  (0) 2022.03.13
    [코틀린] 객체와 클래스  (0) 2022.03.13
    [코틀린] 타입 안정성  (0) 2022.03.07
    [코틀린] 컬렉션  (0) 2022.03.07
    [코틀린] 함수  (0) 2022.03.06

    댓글

Designed by Tistory.