Skip to content
ioob.dev
Go back

Kotlin 입문 2편 — 조건문과 반복문

· 3분 읽기
Kotlin 시리즈 (2/12)
  1. Kotlin 입문 1편 — 변수와 타입
  2. Kotlin 입문 2편 — 조건문과 반복문
  3. Kotlin 입문 3편 — 함수
  4. Kotlin 입문 4편 — 클래스와 객체
  5. Kotlin 입문 5편 — 컬렉션과 람다
  6. Kotlin 6편 — Null 안전성 심화
  7. Kotlin 7편 — 제네릭
  8. Kotlin 8편 — sealed class와 enum
  9. Kotlin 9편 — 코루틴 기초
  10. Kotlin 10편 — 코루틴 심화
  11. Kotlin 11편 — DSL과 고급 함수
  12. Kotlin 12편 — 실전 패턴
Table of contents

Table of contents

if는 표현식이다

Java에서 if는 문(statement)이다. 값을 반환하지 않기 때문에 삼항 연산자 ? :가 따로 존재한다. Kotlin에서는 if 자체가 값을 반환하기 때문에 삼항 연산자가 아예 없다.

val score = 85
val grade = if (score >= 90) "A" else if (score >= 80) "B" else "C"

println(grade) // B

블록으로 쓸 수도 있는데, 이때 각 블록의 마지막 줄이 반환값이 된다.

val message = if (score >= 60) {
    println("통과!")
    "합격"  // 이 값이 message에 들어감
} else {
    println("재시험...")
    "불합격"
}

이게 왜 좋을까? var로 변수를 먼저 선언하고 조건별로 값을 채우는 패턴이 사라진다. val + if 표현식 조합이면 변수 선언과 동시에 값이 확정되기 때문에, 이후에 값이 바뀔 걱정을 할 필요가 없다.

when

Java의 switch를 쓰다 보면 break를 빠뜨리거나, 타입 제한 때문에 불편할 때가 있다. Kotlin의 when은 이런 문제가 없다.

val day = 3

val dayName = when (day) {
    1 -> "월요일"
    2 -> "화요일"
    3 -> "수요일"
    4 -> "목요일"
    5 -> "금요일"
    6, 7 -> "주말"
    else -> "알 수 없음"
}

whenif처럼 표현식이라 값을 반환할 수 있다. 그리고 단순 값 비교를 넘어서 범위, 타입 체크, 조건식까지 가능하다.

val x = 15

when {
    x < 0 -> println("음수")
    x in 1..10 -> println("1~10 사이")
    x is Int -> println("정수인데 10 초과")
    else -> println("기타")
}

인자 없이 when을 쓰면 if-else 체인을 더 읽기 좋게 바꿀 수 있다. 조건이 3개 이상인 분기에서 특히 유용하다.

인자가 있는 when과 없는 when의 의사결정 흐름을 비교해보면 차이가 분명해진다.

flowchart LR
    Input[입력값] --> Check{when 형태}
    Check -->|인자 있음| A["when(x)<br/>값/범위/타입 매칭"]
    Check -->|인자 없음| B["when { }<br/>임의의 boolean 조건"]
    A --> Branch1[해당 case 실행]
    B --> Branch2[참인 첫 조건 실행]
    Branch1 --> Return[값 반환/동작 수행]
    Branch2 --> Return

for와 범위(range)

Kotlin의 for는 Java의 향상된 for문과 비슷한데, 범위(range) 표현이 추가된다.

// 1부터 5까지 (5 포함)
for (i in 1..5) {
    print("$i ")  // 1 2 3 4 5
}

..은 끝 값을 포함한다. 끝 값을 제외하려면 until을 쓴다.

// 배열 인덱스 순회에 적합
for (i in 0 until 5) {
    print("$i ")  // 0 1 2 3 4
}

역순이나 간격 조절도 된다.

for (i in 5 downTo 1) {
    print("$i ")  // 5 4 3 2 1
}

for (i in 1..10 step 2) {
    print("$i ")  // 1 3 5 7 9
}

범위 연산자들이 어떤 수열을 만드는지 정리하면 이렇다.

flowchart LR
    A["1..5"] --> A1["1, 2, 3, 4, 5<br/>끝 포함"]
    B["1 until 5"] --> B1["1, 2, 3, 4<br/>끝 제외"]
    C["5 downTo 1"] --> C1["5, 4, 3, 2, 1<br/>역순"]
    D["1..10 step 2"] --> D1["1, 3, 5, 7, 9<br/>간격 조절"]

리스트를 순회할 때는 인덱스가 필요한지 아닌지에 따라 쓰는 방식이 달라진다.

val fruits = listOf("사과", "바나나", "딸기")

// 값만 필요할 때
for (fruit in fruits) {
    println(fruit)
}

// 인덱스도 필요할 때
for ((index, fruit) in fruits.withIndex()) {
    println("$index: $fruit")
}

Java에서 for (int i = 0; i < list.size(); i++)라고 쓰던 패턴이 훨씬 간결해진다.

while

whiledo-while은 다른 언어와 거의 같다.

var count = 3

while (count > 0) {
    println("카운트: $count")
    count--
}

do {
    println("최소 1번 실행")
} while (false)

한 가지 알아둘 점은, Kotlin에는 전통적인 for (int i = 0; i < n; i++) 스타일의 for문이 없다는 것이다. 범위 표현으로 완전히 대체된다.


다음 편에서는 Kotlin의 함수를 다룬다. 기본값 파라미터, named argument, 확장 함수가 코드를 얼마나 깔끔하게 만들어주는지 살펴보자.

3편: 함수


Related Posts

Share this post on:

Comments

Loading comments...


Previous Post
Kotlin 입문 1편 — 변수와 타입
Next Post
Kotlin 입문 3편 — 함수