728x90
반응형
✅ 대상을 이터레이션 : while과 for 루프
- 코틀린 특성 중 자바와 가장 비슷한 것은 이터레이션
- 코틀린의 while문은 자바와 동일함
- for는 자바의 for-each 루프에 해당하는 형태만 존재
- 코틀린의 for는 C#과 마찬가지로 for <아이템> in <원소들> 형태를 취함
- 이런 for 루프는 컬렉션에 대한 이터레이션에 가장 많이 쓰임
📌 while 루프
- 코틀린에는 while과 do-while 루프가 있으며 자바와 큰 차이가 없음
// while
while (조건) { // 조건이 참인 동안 본문을 반복 실행
/* ... */
}
// do-while
do {
/* ... */
} while (조건) // 맨 처음 무조건 본문을 한번 실행한 다음 조건이 참인 경우 반복 실행
📌 수에 대한 이터레이션 : 범위와 수열
- 자바의 for 문은 초깃값, 증가 값, 최종 값을 사용한 루프
- 코틀린에는 이러한 for 루프가 없기 때문에 범위를 사용
- 범위는 기본적으로 두 값으로 이뤄진 구간이며, 보통은 그 두값은 정수 등의 숫자 타입의 값
- .. 연산자로 시작 값과 끝 값을 연결해 범위 생성
- 코틀린의 범위는 폐구간(닫힌 구간) 또는 양끝을 포함하는 구간(두 번째 값이 항상 범위에 포함된다는 뜻)
- 정수 범위로 수행할 수 있는 가장 단순한 작업은 범위에 속한 모든 값에 대한 이터레이션
- 이런 식으로 어떤 범위에 속한 값을 일정한 순서로 이터레이션하는 경우를 수열이라고 부름
// when과 for문을 사용해 피즈버즈 게임 구현하기
fun fizzBuzz(i: Int) = when {
i % 15 == 0 -> "FizzBuzz"
i % 3 == 0 -> "Fizz"
i % 5 == 0 -> "Buzz"
else -> "$i"
}
for(i in 1..100) { // 1..100 범위의 정수에 대해 이터레이션
print(fizzBuzz(i)
} // 1 2 Fizz 4 Buzz Fizz 7 ...
for(i in 100 downTo 1 step 2) {
print(fizzBuzz(i))
} // Buzz 98 Fizz 94 92 FizzBuzz 88 ...
- 위의 예제에서 마지막 for 문을 보면 증가 값 step을 갖는 수열에 대해 이터레이션 함
- 증가 값을 사용하면 수를 건너 뛰어서 갈 수 있음
- 증가 값을 음수로 만들면 정방향 수열이 아닌 역방향 수열을 만들 수 있음(역방향 수열의 기본 증가 값 : -1)
- 끝 값을 포함하지 않는 반만 닫힌 범위에 대한 이터레이션하는 경우도 있지만 이는 추후에 다룸
📌 맵에 대한 이터레이션
// 맵을 초기화하고 이터레이션하기
val binaryReps = TreeMap<Char, String>() // 키에 대해 정렬하기 위해 TreeMap을 사용
for(c in 'A' .. 'F') { // A부터 F까지 문자의 범위를 사용해 이터레이션
val binary = Integer.toBinaryString(c.toInt()) // 아스키 코드를 2진 표현으로 변환
binaryReps[c] = binary // c를 키로 c의 2진 표현을 맵에 추가
}
for((letter, binary) in binaryReps) { // 맵에 대해 이터레이션. 맵의 키와 값을 두 변수에 각각 대입
println("$letter = $binary")
}
- .. 연산자를 숫자 타입의 값뿐 아니라 문자 타입의 값에도 적용할 수 있음
- 맵을 사용했던 구조 분해 구문을 맵이 아닌 컬렉션에도 활용 가능
- 구조 분해 구문을 사용하면 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션할 수 있음
- 인덱스를 저장하기 위한 변수를 별도로 선언하고 루프에서 매번 그 변수를 증가시킬 필요가 없음
val list = arrayListOf("10", "11", "1001")
for((index, element) in list.withIndex()) {
println("$index : $element")
}
📌 in으로 컬렉션이나 범위의 원소 검사
- in 연산자를 사용해 어떤 값이 범위에 속하는지 검사할 수 있음
- 반대로 !in을 사용하면 어떤 값이 범위에 속하지 않는지 검사 가능
// in을 사용해 값이 범위에 속하는지 검사하기
fun isLetter(c: Char) = c in 'a' .. 'z' || c in 'A' .. 'Z'
fun isNotDigit(c: Char) = c !in '0' .. '9'
println(isLetter('q')) // true
println(isNotDigit('x')) // true
// when에서 in 사용하기
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('8')) // It's a digit!
728x90
반응형
'Studying > Kotlin' 카테고리의 다른 글
[Kotlin In Action] 3장. 함수 정의와 호출(1) - 컬렉션과 함수 만들기 (0) | 2023.05.02 |
---|---|
[Kotlin In Action] 2장. 코틀린 기초(4) - 코틀린의 예외 처리 (0) | 2023.04.24 |
[Kotlin In Action] 2장. 코틀린 기초(2) - enum과 when (0) | 2023.04.24 |
[Kotlin In Action] 2장. 코틀린 기초(1) - 함수와 변수 / 클래스와 프로퍼티 (0) | 2023.04.20 |
[Kotlin In Action] 1장. 코틀린이란 무엇이며, 왜 필요한가? (0) | 2023.04.17 |