범위와 반복레인지 클래스정방향 반복후방향 반복범위 안의 값 건너뛰기filter 이용배열과 리스트의 반복인덱스 얻기When을 사용해야 할 때표현식으로서의 when명령문으로써의 whenwhen과 변수의 스코프
범위와 반복
레인지 클래스
val oneToFive : IntRange = 1..5 val aToE: CharRange = 'a'..'e' val seekHelp: ClosedRange<String> = "hell".."help"
- 범위의 첫 번째 값을 쓰고 .. 연산자를 붙이고 범위의 마지막 값을 적으면 됨
정방향 반복
for (i in 1..5) { println("$i, ") } // 1, 2, 3, 4, 5
- 변수 i는 var이 아닌 val 임. 반복문 안에서 i를 변경시킬 수 없음
후방향 반복
for (i in 5.downTo(1)) { print("$i, ") } // 5, 4, 3, 2, 1 // .과 괄호를 선택사항으로 만드는 방법 for (i in 5 downTo 1) { print("$i, ") }
- 5..1은 동작하지 않고 downTo 메서드를 사용하면 됨
범위 안의 값 건너뛰기
for (i in 1 until 5) { print("$i, ") } // 1, 2, 3, 4 for (i in 1 until 10 step 3) { print("$i, ") } // 1, 4, 7 for (i in 10 downTo 0 step 3) { print("$i, ") } // 10, 7, 4, 1
- 마지막 값을 제외하고 반복하기 위해서는
until
을 이용
step
메서드를 이용하여 일부 값을 건너뛸 수 있음
filter 이용
for (i in (1..9).filter { it % 3 == 0 || it % 5 == 0 }) { print("$i, ") // 3, 5, 6, 9 }
- filter() 메서드는 람다표현식을 인자로 사용함
배열과 리스트의 반복
val array = arrayOf(1,2,3) // kotlin.arrayOf 함수. // 정수 객체가 아니고 원시 자료형인 Int 배열을 생성하기 위해서는 intArrayOf() 함수를 사용 // 비슷하게, List<T> 의 인스턴스를 listOf() 함수를 이용해서 만들고, for 문을 이용해서 반복가능 for (num in array) { println(num) }
인덱스 얻기
val names = listOf("Tom", "Jerry", "Spike") for (index in names.indices) { println("Position of ${names.get(index)} is $index") } for ((index, name) in names.withIndex()) { println("Position of $name is $index") }
When을 사용해야 할 때
코틀린에는 switch 문이 없고 대신에 when이 있다. when은 표현식으로 사용할 때와 명령문으로 사용할 때 각각 다른 맛을 보여준다.
표현식으로서의 when
fun isAlive(alive: Boolean, numberOfLiveNeighbors: Int): Boolean { if (numberOfLiveNeighbors < 2) { return false } if (numberOfLiveNeighbors > 3) { return false } if (numberOfLiveNeighbors == 3) { return true } return alive && numberOfLiveNeighbors == 2 } // when을 사용하면 fun isAlive(alive: Boolean, numberOfLiveNeighbors: Int) = when { numberOfLiveNeighbors < 2 -> false numberOfLiveNeighbors > 3 -> false numberOfLiveNeighbors == 3 -> true else -> alive && numberOfLiveNeighbors == 2 } // when 에 값이나 표현식을 전달 fun whatToDo(dayOfWeek: Any) = when (dayOfWeek) { "Saturday", "Sunday" -> "Relax" in listOf("Monday", "Tuesday", "Wednesday", "Thursday") -> "Work Hard" in 2..4 -> "Work hard" "Friday" -> "Party" is String -> "What?" else -> "No Clue" }
- 코틀린 컴파일러는 else 부분이 존재하는지, 표현식이 가능한 모든 입력에 대해 값을 생성하는지를 검증함 ⇒ 이 컴파일 시간 체크로 인해 코드의 정확성과 실수로 인한 오류를 줄일 수 있음
- 코틀린이 → 뒤에 블록을 허용해주긴 하지만 가독성 측면으로 봤을때, 블록을 사용할거면 메서드로 따로 추출하고 그 메서드를 호출하도록 간단화해라
명령문으로써의 when
- 하나 이상의 값에 기반해서 다른 동작을 원한다면 when 을 표현식이 아니라 명령문으로 사용하면 됨
when과 변수의 스코프
fun systemInfo(): String { val numberOfCores = Runtime.getRuntime().availableProcessors() return when (numberOfCores) { 1 -> "1 core, packing this one to the museum" in 2..16 -> "You have $numberOfCores cores" else -> "$numberOfCores cores!, I want your machine" } }
fun systemInfo(): String = when (val numberOfCores = Runtime.getRuntime().availableProcessors()) { 1 -> "1 core, packing this one to the museum" in 2..16 -> "You have $numberOfCores cores" else -> "$numberOfCores cores!, I want your machine" } }
- val을 when 의 인자로 넣어버림으로써
- when의 결과를 바로 리턴하여 { } 블럭과 return 키워드를 제거할 수 있음
- numberOfCores는 when 의 결과를 얻을 때만 사용가능. 이후 연산에서 사용 불가(변수 스코프 제한)