728x90
while 같은 경우 JAVA와 동일하고, for 같은 경우 for 아이템 in 원소들 형태를 취한다.
while
while(조건){
//문장
}
do {
//문장
} while(조건)
수에 대한 이터레이션 : 범위와 수열
코틀린에서는 초깃값, 증가값, 최종 값 루프가 없기 때문에 범위를 사용한다.
범위는 기본적으로 두 값으로 이뤄진 구간이며, 보통 그 두 값은 정수 등의 숫자 타입의 값이며 (..) 연산자로 시작 값과 끝 값을 연결해서 범위를 만든다
val oneToTen = 1..10
- 코틀린에서 범위는 폐구간 또는 양끝을 포함하는 구간이다
- 위 예에서 항상 10은 포함이 되있다는 의미
- 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 경우를 수열이라고 한다.
fun fizzBuzz(i: Int) = when {
i % 15 == 0 -> "FizzBuzz " //i 가 15로 나누어 떨어지면 FizzBuzz 반환
i % 3 == 0 -> "Fizz "//i 가 3로 나누어 떨어지면 Fizz 반환
i % 5 == 0 -> "Buzz "//i 가 5로 나누어 떨어지면 Buzz 반환
else -> "$i "
}
fun main(args: Array<String>) {
for(i in 1..100){
print(fizzBuzz(i))
}
}
100 ~ 1 까지 거꾸로 세고, 짝수만 실행
fun main(args: Array<String>) {
for(i in 100 downTo 1 step 2){
print(fizzBuzz(i))
}
}
- 증가 값 step을 갖는 수열에 대해 이터레이션 한다.
- 증가 값을 이용해 수를 건너뛸 수 있다.
- 증가 값을 음수로 만들면 정방향 수열이 아닌 역방향 수열을 만들 수 있다.
- 100 downTo 1로 역방향 수열을 만든다
- ..(연산자)는 항상 끝 값을 포함하게 되는 데 포함하지 않는 경우에 대해서는 until 함수를 사용하자
- x in 0 until size 라는 루프는 for(x in 0..size-1)과 같지만 좀 더 명확하게 개념을 표현한다.
맵에 대한 이터레이션
val binaryReps = TreeMap<Char, String>()
fun iterator(){
for(c in 'A' .. 'F'){
val binary = Integer.toBinaryString(c.toInt())
binaryReps[c] = binary
}
for((letter, binary) in binaryReps){
println("$letter = $binary")
}
}
fun listIterator(){
val list = arrayListOf("10", "11", "1001")
for((index, element) in list.withIndex()){
println("$index: $element")
}
}
- .. 연산자는 숫자 타입의 값 뿐만 아니라 문자 타입의 값에도 적용할 수 있다.
- letter, binary라는 두 변수에 저장한다.
- get, put을 사용하는 대신에 map[key]map [key] 또는 map [key] = value를 사용해 값을 가져오고 설정할 수 있다.
- 맵에 사용했던 구조 분해 구문을 맵이 아닌 컬렉션에도 활용할 수 있다
- 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션이 가능하다.
- 인덱스를 저장하기 위한 변수를 별도로 선언하고 루프에서 매번 그 변수를 증가시킬 필요가 없다.
in으로 컬렉션이나 범위의 원소 검사
in 연산자를 사용해 어떤 값이 범위에 속하는지 검사할 수 있다. 반대로 !in을 사용하면 어떤 값이 범위에 속하지 않는지 검사할 수 있다.
fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'
fun main(args: Array<String>) {
println(isLetter('q'))
println(isNotDigit('X'))
}
when 식으로 변경
fun recognize(c: Char) = when(c){
in '0'..'9' -> "It's a digit"
in 'a'..'z', in 'A'..'Z' -> "It's a letter"
else -> "I don't know..."
}
- 비교가 가능한 클래스(Comparable을 구현) 라면 클래스의 인스턴스 객체를 사용해 범위를 만들 수 있다.
- Comparable을 사용하는 범위의 경우 그 범위 내의 모든 객체를 항상 이터레이션 할 수 없다
- 예를 들어 Java , Kotlin 일 경우 둘 사이의 모든 객체를 이터레이션 할 수 없다
- 하지만 in 절을 사용하면 값이 해당 범위 안에 속하는 지 항상 결정할 수 있다
- "kotlin" in "Java".."Scala" // "Java" <= "Kotlin" && "Kotlin" <= "Scala"
- 컬렉션에도 마찬가지로 적용 가능
- "kotlin" in setOf("Java", "Scala")
728x90
'KotlinInAction > 코틀린 기초' 카테고리의 다른 글
| 코틀린의 예외 처리 (0) | 2022.07.26 |
|---|---|
| enum과 when (0) | 2022.07.25 |
| 클래스와 프로퍼티 (0) | 2022.07.25 |
| 함수와 변수 (0) | 2022.07.25 |