val a: Int = 1 // 상수
var b: Int = 2 // 변수
타입을 명시적으로 지정해줄 수 있지만, 타입 추론이 존재하기 때문에 안써줘도 동작한다.
일반적으로는 다음과 같이 쓸 수 있다.
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
when은 다른 언어의 switch
와 똑같이 동작한다.
when (x) {
1 -> print ("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}
코틀린은 기본적으로 변수에 null
을 할당할 수 없다.
따라서 null
을 할당하기 위해서는 다음과 같이 nullable type
으로 지정해줘야 한다.
val languageName: String? = null
기본적으로는 javascript의 optional chaining과 똑같다.
만약 null이 아닌 변수에 대해 특정 명령을 처리해야할 경우에는 다음과 같이 사용할 수 있다.
for (item in listWithNulls) {
item?.let { println(it) }
}
다음 식을 보자.
val l: Int = if (b != null) b.length else -1
코틀린의 ?:
는 자바스크립트의 ??
와 비슷하다.
val l: Int = b?.length ?: -1
val l= = b!!.length
위 코드에서 b는 null이 아니어야만 한다. 아니면 NPE가 발생한다.
val aInt: Int? = a as? Int
as?
은 Int
로 캐스팅을 할 때 실패하면 null
값을 넣어주도록 해준다.
Kotlin의 함수는 다양한 형식으로 정의할 수 있다.
void
대신 Unit
을 쓰며 이는 생략할 수 있다.
fun sum(a: Int, b: Int): Int {
return a + b
}
fun sum(a: Int, b: Int) = a + b
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}");
}
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}");
}
List<T>
는 상수 배열로, 수정이 불가능하다.
val numbers = listOf(1, 2, 3, 4)
수정을 하고 싶다면 MutableList<T>
를 사용해야 한다.
val numbers = mutableListOf(1, 2, 3, 4)
Set<T>
는 상수 집합으로, 수정이 불가능하다.
val numbers = setOf(1, 2, 3, 4)
수정을 하고 싶다면 MutableSet<T>
를 사용해야 한다.
val numbers = mutableSetOf(1, 2, 3, 4)
Map<T>
는 상수 사상으로, 수정이 불가능하다.
val numbers = mapOf("key1" to 1, "key2" to 2)
수정을 하고 싶다면 MutableMap<T>
를 사용해야 한다.
val numbers = mutableMapOf("key1" to 1, "key2" to 2)
다음은 코틀린으로 에라토스테네스의 체를 구현한 예이다.
fun sieve(idx: Int, li: MutableList<Int>) {
var i = idx+1
while(i < li.size) {
if(li[i] % li[idx] == 0) {
li.removeAt(i)
}
i++
}
}
fun main() {
val li = (2..100).toMutableList()
var i = 0
while(i < li.size) {
sieve(i, li)
i++
}
for(x in li)
println(x)
}