Kotlin Grammar

Bard·2024년 9월 12일
1

Android Programming

목록 보기
1/2
post-thumbnail

Variables

Variable Declaration

val a: Int = 1 // 상수
var b: Int = 2 // 변수

타입을 명시적으로 지정해줄 수 있지만, 타입 추론이 존재하기 때문에 안써줘도 동작한다.

Conditional expresseions

If

일반적으로는 다음과 같이 쓸 수 있다.

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

When

when은 다른 언어의 switch와 똑같이 동작한다.

when (x) {
  1 -> print ("x == 1")
  2 -> print("x == 2")
  else -> {
    print("x is neither 1 nor 2")
  }
}

Null safety

코틀린은 기본적으로 변수에 null을 할당할 수 없다.

따라서 null을 할당하기 위해서는 다음과 같이 nullable type으로 지정해줘야 한다.

val languageName: String? = null

Null Safe call operator - ?.

기본적으로는 javascript의 optional chaining과 똑같다.

만약 null이 아닌 변수에 대해 특정 명령을 처리해야할 경우에는 다음과 같이 사용할 수 있다.

for (item in listWithNulls) {
  item?.let { println(it) }
}

Elvis operator - ?:

다음 식을 보자.

val l: Int = if (b != null) b.length else -1

코틀린의 ?:는 자바스크립트의 ??와 비슷하다.

val l: Int = b?.length ?: -1

Not-null assertion operator and safe case operator

val l= = b!!.length

위 코드에서 b는 null이 아니어야만 한다. 아니면 NPE가 발생한다.

val aInt: Int? = a as? Int

as?Int로 캐스팅을 할 때 실패하면 null값을 넣어주도록 해준다.

Functions

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

Collections

List

List<T>는 상수 배열로, 수정이 불가능하다.

val numbers = listOf(1, 2, 3, 4)

수정을 하고 싶다면 MutableList<T>를 사용해야 한다.

val numbers = mutableListOf(1, 2, 3, 4)

Set

Set<T>는 상수 집합으로, 수정이 불가능하다.

val numbers = setOf(1, 2, 3, 4)

수정을 하고 싶다면 MutableSet<T>를 사용해야 한다.

val numbers = mutableSetOf(1, 2, 3, 4)

Map

Map<T>는 상수 사상으로, 수정이 불가능하다.

val numbers = mapOf("key1" to 1, "key2" to 2)

수정을 하고 싶다면 MutableMap<T>를 사용해야 한다.

val numbers = mutableMapOf("key1" to 1, "key2" to 2)

Examples

다음은 코틀린으로 에라토스테네스의 체를 구현한 예이다.

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)
}
profile
The Wandering Caretaker

0개의 댓글