Kotlin

[Kotlin] 기본적인 구문 - 2

Darane 2021. 9. 7. 10:02

Kotlin의 기본적인 구문(Basic syntax)에 대한 정리입니다.

2021.09.03 - [Kotlin] - [Kotlin] 기본적인 구문 - 1

 

[Kotlin] 기본적인 구문 - 1

Kotlin의 기본적인 구문(Basic syntax)에 대한 정리입니다. 패키지 정의와 imports 방법(Package definition and imports) 기본적으로 Java와 동일하게 패키지명은 소스파일의 맨 위에 작성합니다. package three..

3edc.tistory.com

조건 표현식(Conditional expressions)

fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

Kotlin에서 if를 표현식으로 사용할 수 있습니다.

fun maxOf(a: Int, b: Int) = if (a > b) a else b

반복문(for loop, while loop)

val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
    println(item)
}

또는

val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}
val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}

 

when 표현식(when expression)

fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

 

 

 

범위(Ranges)

in 연산자를 사용하여 숫자가 범위 내에 있는지 확인할 수 있습니다.

val x = 10
val y = 9
if (x in 1..y+1) {
    println("fits in range")
}

숫자가 범위를 벗어 났는지 확인할 수 있습니다.

val list = listOf("a", "b", "c")

if (-1 !in 0..list.lastIndex) {
    println("-1 is out of range")
}
if (list.size !in list.indices) {
    println("list size is out of valid list indices range, too")
}

반목문에서 범위(range)를 사용할 수 있습니다.

for (x in 1..5) {
    print(x)
}

Progression을 사용한 반복문 입니다.

Progression: 시작점과 끝점이 있으며 구간을 정할 수 있는 범위입니다. 범위(Range)는 구간이 1인 Progression입니다.

for (x in 1..10 step 2) {
    print(x)
}
println()
for (x in 9 downTo 0 step 3) {
    print(x)
}

 

 

컬렉션(Collections)

컬렉션을 사용한 반복문입니다.

for (item in items) {
    println(item)
}

in 연산자를 사용하여 컬렉션에 객체가 포함 되었는지 확인할 수 있습니다.

when {
    "orange" in items -> println("juicy")
    "apple" in items -> println("apple is fine too")
}

람다식(lambda expressions)을 사용한 컬렉션의 필터 적용(filter)과 맵(map) 적용입니다.

val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
    .filter { it.startsWith("a") }
    .sortedBy { it }
    .map { it.uppercase() }
    .forEach { println(it) }

 

 

Nullable 값과 null 확인(Nullable values and null checks)

null 값이 사용 되는 경우 명시적으로 nullable로 표시되어야 합니다. Nullable 형식은 이름 마지막에 ?를 붙입니다.

parseInt는 Int를 반환하는 함수 인데 null을 반환할 수 있습니다.

fun parseInt(str: String): Int? {
    // ...
}

nullable 값을 반환하는 함수를 사용하는 경우 아래와 같이 처리합니다.

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // 'x * y'를 사용하면 null이 포함될 수 있으므로 오류가 발생합니다.
    if (x != null && y != null) {
        // x 및 y는 null 검사 후 자동으로 non-nullable로 캐스트됩니다.
        println(x * y)
    }
    else {
        println("'$arg1' or '$arg2' is not a number")
    }    
}

또는

// ...
if (x == null) {
    println("Wrong number format in arg1: '$arg1'")
    return
}
if (y == null) {
    println("Wrong number format in arg2: '$arg2'")
    return
}

// x 및 y는 null 검사 후 자동으로 non-nullable로 캐스트됩니다.
println(x * y)

 

 

형변환(Type checks and automatic casts)

is 연산자는 표현식이 특정 유형(type)의 인스턴스인지 확인합니다. 변경할 수 없는(immutable) 지역 변수나 속성이 특정 유형(type)에 대해 확인이 된 경우 명시적으로 형변환(캐스팅)할 필요가 없습니다.

fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // 'obj'는 이 분기에서 'String'으로 자동 형변환됩니다.
        return obj.length
    }

    // 'obj'는 유형 검사 분기 외부에서 여전히 'Any' 유형입니다.
    return null
}

또는

fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // 'obj'는 이 분기에서 'String'으로 자동 캐스트됩니다.
    return obj.length
}

또는

fun getStringLength(obj: Any): Int? {
    // 'obj'는 '&&'의 오른쪽에 있는 'String'으로 자동 캐스팅됩니다.
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}

 

반응형