on
코틀린[Kotlin] 흐름 통제하기 (When, Loop, Ranges, Equality...
코틀린[Kotlin] 흐름 통제하기 (When, Loop, Ranges, Equality...
코틀린으로 반복문, 조건문 등을 어떻게 사용하는지 알아보겠습니다~!
코틀린 공식 문서를 참고했습니다.
When
자바에서서 사용되는 switch문 대신에 Kotlin은 When으로 구성할 수 있습니다. When을 선언문이나 표현식으로 사용할 수 있습니다.
When 선언문
fun main() { cases("Hello") cases(1) cases(0L) cases(MyClass()) cases("hello") } fun cases(obj: Any) { when (obj) { // 1 1 -> println("One") // 2 "Hello" -> println("Greeting") // 3 is Long -> println("Long") // 4 !is String -> println("Not a string") // 5 else -> println("Unknown") // 6 } } class MyClass
when 선언문입니다 obj가 1인지 확인합니다. obj가 Hello와 같은지 확인합니다. 타입 검사를 합니다. 반대 타입 검사를 합니다. 기본 선언문(생략 가능).
모든 조건은 그중 하나가 충족될 때까지 순차적으로 확인됩니다. 따라서 첫 번째 적합한 조건만 실행됩니다.
When 표현식
fun main() { println(whenAssign("Hello")) println(whenAssign(3.4)) println(whenAssign(1)) println(whenAssign(MyClass())) } fun whenAssign(obj: Any): Any { val result = when (obj) { // 1 1 -> "one" // 2 "Hello" -> 1 // 3 is Long -> false // 4 else -> 42 // 5 } return result } class MyClass
when 표현식입니다. obj가 1인 경우 값을 "one"로 설정합니다. obj가 "Hello"와 같으면 값을 1로 설정합니다. obj가 Long의 인스턴스인 경우 값을 false로 설정합니다. 이전 조건이 충족되지 않으면 값 "42"를 설정합니다. when 선언문과 달리 when 표현식은 default가 일반적으로 when 표현식에 필요합니다. (컴파일러가 다른 분기가 가능한 모든 경우를 포함하는지 확인할 수 있는 경우를 제외함, 예를 들어 seal class)
Loops
Kotlin은 일반적으로 사용되는 모든 루프를 지원합니다: for, while, do-while
for
For는 Kotlin에서는 대부분의 언어와 동일한 방식으로 작동합니다.
val cakes = listOf("carrot", "cheese", "chocolate") for (cake in cakes) { // 1 println("Yummy, it's a $cake cake!") }
리스트의 각 케이크를 반복합니다.
while and do-while
while 및 do-while 구문은 대부분의 언어와 유사하게 작동합니다.
fun eatACake() = println("Eat a Cake") fun bakeACake() = println("Bake a Cake") fun main(args: Array) { var cakesEaten = 0 var cakesBaked = 0 while (cakesEaten < 5) { // 1 eatACake() cakesEaten ++ } do { // 2 bakeACake() cakesBaked++ } while (cakesBaked < cakesEaten) }
조건이 참인 동안 블록을 실행합니다. 블록을 먼저 실행한 다음 조건을 확인합니다.
Iterators
Iterators 연산자를 구현하여 클래스에 고유한 Iterators를 정의할 수 있습니다.
class Animal(val name: String) class Zoo(val animals: List) { operator fun iterator(): Iterator { // 1 return animals.iterator() // 2 } } fun main() { val zoo = Zoo(listOf(Animal("zebra"), Animal("lion"))) for (animal in zoo) { // 3 println("Watch out, it's a ${animal.name}") } }
클래스의 iterator를 정의합니다. 이름이 iterator여야 하고 operator 한정자가 있어야 합니다. 다음 메서드 요구 사항을 충족하는 iterator를 반환합니다. next(): Animal hasNext(): Boolean 사용자 정의 iterator를 사용하여 Zoo의 동물을 반복합니다.
iterator는 타입 또는 확장 함수로 선언할 수 있습니다.
Ranges
Kotlin에는 범위를 정의하기 위한 도구들이 있습니다.
for(i in 0..3) { // 1 print(i) } print(" ") for(i in 0 until 3) { // 2 print(i) } print(" ") for(i in 2..8 step 2) { // 3 print(i) } print(" ") for (i in 3 downTo 0) { // 4 print(i) } print(" ") // 0123 012 2468 3210
0에서 3(포함)까지의 범위를 반복합니다. 다른 프로그래밍 언어(C/C++/Java)의 'for(i=0; i<=3; ++i)'와 같습니다. 0에서 3(제외)까지의 범위를 반복합니다. Python의 for 루프 또는 다른 프로그래밍 언어(C/C++/Java)의 'for(i=0; i<3; ++i)'와 같습니다. 연속 요소에 대해 사용자가 정의한 증가 단계를 사용하여 범위를 반복합니다. 역순으로 범위를 반복합니다.
Char 범위도 지원됩니다.
for (c in 'a'..'d') { // 1 print(c) } print(" ") for (c in 'z' downTo 's' step 2) { // 2 print(c) } print(" ")
알파벳 순서로 문자 범위를 반복합니다. Char 범위는 step 및 downTo도 지원합니다.
범위는 if 문에서도 유용합니다.
val x = 2 if (x in 1..5) { // 1 print("x is in range from 1 to 5") } println() if (x !in 6..10) { // 2 print("x is not in range from 6 to 10") }
값이 범위에 있는지 확인합니다. !in은 in의 반대입니다.
동일성 확인 (Equality Checks)
Kotlin은 구조적 비교를 위해 ==를 사용하고 참조 비교를 위해 ===를 사용합니다.
더 정확하게 말하면, a == b는 if (a == null) b == null else a.equals(b)로 컴파일됩니다.
val authors = setOf("Shakespeare", "Hemingway", "Twain") val writers = setOf("Twain", "Shakespeare", "Hemingway") println(authors == writers) // 1 println(authors === writers) // 2
Authors.equals(writers)를 호출하고 요소 순서 무시를 설정하기 때문에 true를 반환합니다. authors와 writers가 별개의 참조이므로 false를 반환합니다.
조건 표현식 (Conditional Expression)
Kotlin에는 삼항 연산자가 없습니다.(condition ? then : else) 대신 if를 표현식으로 사용할 수 있습니다.
fun max(a: Int, b: Int) = if (a > b) a else b // 1 println(max(99, -42))
from http://develop-writing.tistory.com/67 by ccl(A) rewrite - 2021-09-22 14:27:23