-
[코틀린] 외부 반복과 아규먼트 매칭코틀린 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