Kotlin의 기본적인 구문(Basic syntax)에 대한 정리입니다.
2021.09.03 - [Kotlin] - [Kotlin] 기본적인 구문 - 1
조건 표현식(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
}
'Kotlin' 카테고리의 다른 글
[Kotlin] StateFlow subscriptionCount 구독자 수 확인 (0) | 2021.10.15 |
---|---|
[Kotlin] Type checks와 형변환(casts) (0) | 2021.10.06 |
[Kotlin] Cold Stream(flow), Hot Stream(flow) 차이점 (0) | 2021.10.05 |
Kotlin callbackFlow callback listener의 데이터를 Coroutines flow로 보내기 (0) | 2021.09.13 |
[Kotlin] 기본적인 구문 - 1 (0) | 2021.09.03 |
Kotlin companion object(동반 객체) (0) | 2020.05.20 |