티스토리 뷰

코틀린 공식문서에 있는 Example들을 하나씩 읽어보며 정리하자.

참고: https://play.kotlinlang.org/byExample/overview

 

 

Control Flow

When

흔히 사용하는 switch 문 대신에 코틀린에서는 when 문을 제공한다.

when 문은 statement 와 expression 으로 사용할 수 있다.

 

When Statement

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

/*
Greeting
One
Long
Not a string
Unknown
*/
  1. when statement 이다.
  2. obj가 1과 같은지 검사한다.
  3. obj가 Hello와 같은지 검사한다.
  4. obj가 Long타입인지 검사한다.
  5. obj가 String타입이 아닌지 검사한다.
  6. 디폴트 상황일때 해당 구문이 실행된다.(생략 가능)

모든 분기는 조건 중에 하나를 만족할 때까지 순차적으로 실행된다. 따라서 가장 먼저 조건에 부합하는 분기만 실행될 것이다.

 

When Expression

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

/*
1
42
one
42
*/
  1. when expression 이다.
  2. obj가 1과 같으면 값에 "one"이 설정된다.
  3. obj가 Hello와 같으면 값에 1이 설정된다.
  4. obj가 Long타입의 인스턴스라면 값에 false가 설정된다.
  5. 앞에 있는 조건을 하나도 만족하지 못한 경우 값에 42가 설정된다. when statement 와 달리 when expression 에서는 디폴트 분기(else)가 대부분 있어야 한다. (컴파일러가 앞에 있는 케이스가 가능한 모든 케이스를 커버한다고 판단할 수 있는 경우를 제외하고는) 

Loops

코틀린은 일반적으로 사용되는 모든 반복문을 지원한다.(for, while, do-while)

 

for

대부분의 언어의 for와 동일하게 작동한다.

val cakes = listOf("carrot", "cheese", "chocolate")

for (cake in cakes) {					//1                              
    println("Yummy, it's a $cake cake!")
}

for (i in cakes.indices) {				//2
    println("$i 번째는 ${cakes[i]}")
}

/*
Yummy, it's a carrot cake!
Yummy, it's a cheese cake!
Yummy, it's a chocolate cake!
0 번째는 carrot
1 번째는 cheese
2 번째는 chocolate
*/
  1. 리스트에 있는 케이크를 반복한다
  2. .indices를 사용하여 리스트 인덱스에 접근한다.

 

while and do-while

while 및 do-while 구문도 대부분의 언어와 유사하게 작동한다.

fun eatACake() = println("Eat a Cake")
fun bakeACake() = println("Bake a Cake")

fun main(args: Array<String>) {
    var cakesEaten = 0
    var cakesBaked = 0
    
    while (cakesEaten < 5) {                    // 1
        eatACake()
        cakesEaten ++
    }
    
    do {                                        // 2
        bakeACake()
        cakesBaked++
    } while (cakesBaked < cakesEaten)

}

/*
Eat a Cake
Eat a Cake
Eat a Cake
Eat a Cake
Eat a Cake
Bake a Cake
Bake a Cake
Bake a Cake
Bake a Cake
Bake a Cake
*/
  1. 조건이 true인 동안 블럭을 실행한다.
  2. 블럭을 한 번 실행하고, 조건을 체크한다.

 

Iterator

내가 만든 클래스에 iterator 연산자를 구현하여 나만의 iterator을 정의할 수 있다.

class Animal(val name: String)

class Zoo(val animals: List<Animal>) {

    operator fun iterator(): Iterator<Animal> {             // 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}")
    }

}

/*
Watch out, it's a zebra
Watch out, it's a lion
*/
  1. 클래스에 iterator을 정의한다. 메소드 이름은 반드시 iterator 이여야하고 앞에 operator 라는 키워드를 붙여야한다.
  2. 다음 메서드 요구 사항을 만족하는 iterator를 반환한다.
    • next() : Animal
    • hasNext() : Boolean
  3. 사용자가 정의한 iterator를 사용하여 zoo의 animal을 반복한다.

iterator는 타입이나 확장함수로 선언될 수 있다.


Ranges

코틀린에는 범위(ranges)를 정의하기 위한 여러 방법이 있다.

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 
*/
  1. 0 부터 3(포함)까지 1씩 증가하면서 반복
  2. 0 부터 3(제외)까지 1씩 증가하면서 반복
  3. 2 부터 8(포함)까지 2식 증가하면서 반복
  4. 3 부터 0까지 역순으로 반복

Char ranges 도 지원한다.

for (c in 'a'..'d') {        // 1
    print(c)
}
print(" ")

for (c in 'z' downTo 's' step 2) { // 2
    print(c)
}
print(" ")

/*
abcd zxvt 
*/
  1. 알파벳순으로 char 범위를 반복한다. ('d' 포함)
  2. char ranges도 'step'과 'downTo' 키워드를 지원한다.

ranges 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")
}

/*
x is in range from 1 to 5
x is not in range from 6 to 10
*/
  1. 값이 범위(1 부터 5)에 있는지 검사한다.
  2. !in은 in의 반대이다. (포함되지 않는지 검사한다.)

Equality Checks

코틀린은 구조 비교(값 비교) == 연산자를 사용하고 참조 비교를 위해 === 연산자를 사용한다.

더 정확하게, a == b 를 a == null ? b == null : a.equal(b) 로 컴파일한다.

(a가 null이면 b가 null인지에 따라 true 및 false 리턴, a가 null이 아니면 a.equals(b)의 결과 리턴)

val authors = setOf("Shakespeare", "Hemingway", "Twain")
val writers = setOf("Twain", "Shakespeare", "Hemingway")

println(authors == writers)   // 1
println(authors === writers)  // 2

/*
true
false
*/
  1. true 리턴, authors.equals(writers)를 호출하기 때문이다. set 은 컬렉션에 저장된 요소의 순서를 무시하기 때문에 구조적으로 같다고 판단한다.
  2. false 리턴, authors와 writers가 다른 참조값을 갖기 때문이다.

Conditional Expression

코틀린에는 삼항연사자 condition ? then : else 가 없다. 대신 if 가 expression 으로 사용된다.

fun max(a: Int, b: Int) = if (a > b) a else b         // 1

println(max(99, -42))

/*
99
*/
  1. if는 expression으로 동작하고 값을 리턴한다.
링크
최근에 올라온 글
글 보관함
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31