코틀린 특성 중 자바와 가장 비슷한 것이 이터레이션이다.
코틀린 while 루프는 자바와 동일하다.
for 루프는 자바의 for-each 루프에 해당하는 형태만 존재한다.
코틀린의 for는
for <아이템> in <원소들> 형태를 취한다.
수에 대한 이터레이션 : 범위와 수열
자바 for 루프에는 초깃값, 증가값, 최종값이 존재한다.
하지만. 코틀린에서는 범위를 사용한다.
[Java]
for (int i = 1; i <= 10; i++) {
....
}
[Kotlin]
val oneToTen = 1..10
코틀린의 범위는 폐구간(닫힌 구간) 또는 양끝을 포함하는 구간이다.
이런 식으로 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 경우를 수열(progression) 이라고 부른다.
증가 값을 갖고 범위 이터레이션 하기
for (i in 100 downTo 1 step 2) {
print("$i ");
}
// 결과 값
/*
100 98 96 94 92 90 88 86 84 82 80 78 76 74 72 70 68 66 64 62 60 58 56 54 52 50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2
*/
코틀린 for 루프도 증가 값을 설정할 수 있다.
위 코드는 증가 값 set을 갖는 수열에 대한 이터레이션이다.
또한 증가 값을 음수로 만들면 정방향이 아닌, 역방향 수열을 만들 수 있다.
그리고 코틀린의 .. 은 항상 범위의 끝 값을 포함한다.
하지만 끝 값을 포함하지 않는 반만 닫힌 범위에 대해서 이터레이션을 하면 편할 때가 있다.
그런 범위를 만들고 싶다면
for (x in 0 until size)
for (x in 0.. size-1)
위와 같이 코드를 작성해주면 된다.
맵에 대한 이터레이션
맵을 초기화하고 이터레이션 하기
import java.util.*
val binaryReps = TreeMap<Char, String>()
for (c in 'A'..'F') {
val binary = Integer.toBinaryString(c.code)
binaryReps[c] = binary
// 위 코드는 자바의 binaryReps.put(c, binary)
}
// Key Value 쌍을 같이 가져오기
for ((letter, binary) in binaryReps) {
println("$letter = $binary")
}
// Key Value 따로 뽑기
for ((key) in binaryReps) {
println(key) //key
println(binaryReps[key]) //value
}
.. 연산자를 숫자 타입의 값뿐 아니라 문자 타입의 값에도 적용할 수 있다.
위 코드에서 A부터 F에 이르는 문자를 모두 포함하는 범위를 만듭니다.
자바와 다르게(자바는 get, put 이용)
코틀린은 map[key] 나 map[key] = value 를 사용해 값을 가져오고 설정할 수 있다.
맵에서 사용했던 구조 분해 구문을 맵이 아닌 컬렉션에도 활용할 수 있다.
이런 분해 구문을 사용하면 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션할 수 있다.
즉, 인덱스를 저장하기 위한 변수를 별도로 선언하고 루프에서 매번 그 변수를 증가시킬 필요가 없다.
[Java]
List<String> list = Arrays.asList("10", "11", "1001");
int idx = 0;
for(String s : list) {
System.out.println(idx++ + " " + s);
}
[Kotlin]
val list = arrayListOf("10", "11", "1001")
for ((index, element) in list.withIndex()) {
println("$index: $element")
}
in으로 컬렉션이나 범위의 원소 검사
- in : 어떤 값이 범위에 속하는 지 검사할 수 있음
- !in : 반대로 하게 되면, 어떤 값이 범위에 속하지 않는지 검사할 수 있음
[Java]
boolean isLetter (char c) {
if('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z') {
return true;
}else return false;
}
boolean isNotDigit (char c) {
if (Character.isDigit(c)) return true;
else return false;
}
[Kotlin]
fun isLetter (c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit (c : Char) = c !in '0'.. '9'
in과 !in 연산자는 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.."
}
println(recognize('*'))
객체와 컬렉션에서도 사용이 가능하다.
// 객체
println("Kotlin" in "Java".."Scala")
// 컬렉션(set)
println("Kotlin" in setOf("Java", "Scala"))
'Language > Kotlin' 카테고리의 다른 글
[Kotlin IN ACTION] - Kotlin 함수 정의와 호출(확장함수) (0) | 2022.07.18 |
---|---|
[Kotlin IN ACTION] - Kotlin Exception (예외처리) (0) | 2022.07.14 |
[Kotlin IN ACTION] - Kotlin 스마트 캐스트 (0) | 2022.07.09 |
[Kotlin IN ACTION] - Kotlin 클래스와 프로퍼티 (0) | 2022.07.05 |
[Kotlin IN ACTION] - Kotlin 함수와 변수 (0) | 2022.07.04 |