Posts [Kotlin] Kotlin Basics - Idioms
Post
Cancel

[Kotlin] Kotlin Basics - Idioms

  • 코틀린의 관용구를 파헤쳐보자 !


DTO

  • data 키워드를 사용한다.
  • 아래 항목은 자동으로 생성된다.
    • getter
    • setter
      • val (X)
      • var (O)
    • equals()
    • hashCode()
    • toString()
1
data class UserDto(val name: String, val email: String)


객체 타입 확인

1
2
3
4
5
when (obj) {
    is Foo  -> ...
    is Bar  -> ...
    else    -> ...
}


Read-only

list

1
val items = listOf("a", "b", "c")

map

  • key to value 형태
1
val items = mapOf("a" to 1, "b" to 2, "c" to 3)


범위 반복

closed range

1
2
// 1..100 == 1 <= .. <= 100
for (i in 1..100) { ... }

half-open range

1
2
// 1 until 100 == 1 <= .. < 100
for (i in 1 until 100) { ... }


Lazy

  • lazy 키워드를 사용하면, 호출 시점에 초기화된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Application.kt
fun main(args: Array<String>) {
    runApplication<Application>(*args)

    val item: String by lazy {
        println("Initialize the item")
        "hi"
    }

    println("Start")
    println("item 1: $item")
    println("item 2: $item")
    println("item 3: $item")
    println("End")
}

// 결과
Start
Initialize the item
item 1: hi
item 2: hi
item 3: hi
End


싱글턴

  • object 키워드를 사용한다.
1
2
3
object User {
    val name = "dani"
}


?:

  • 엘비스 연산자

if-not-null

1
2
3
4
val files = File("Test").listFiles()

// 만약 files가 null이 아니라면, files의 사이즈를 출력한다.
println(files?.size)

if-not-null-else

1
2
3
4
val files = File("Test").listFiles()

// 만약 files가 null이라면, "empty"를 출력한다.
println(files?.size ?: "empty")

if-null-else

1
2
3
4
5
6
7
// items의 key에 name이 없다면, IllegalStateException을 던진다.
val items = ...
val name = items["name"] ?: throw IllegalStateException("이름이 없습니다.")

// emails가 비었다면, ""을 반환한다.
val emails = ...
val main = emails.firstOrNull() ?: ""


let

  • T?.let { }에서 let 블럭 안에는 non-null 값만 들어갈 수 있다.
  • 만약 null 값인 경우에는 앞에서 본 ?:를 사용해서 기본값을 지정할 수 있다.
1
2
val user = ...
val name = user?.let { it.name } ?: "dani"


with

  • 객체의 메서드를 여러 개 호출할 때, 그룹화하는 용도로 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Person.kt
class Person {

    fun standUp()
    fun sitDown()
    fun moveForward(steps: Int)
    fun moveBack(steps: Int)
}

// Application.kt
fun main(args: Array<String>) {
    runApplication<Application>(*args)

    val person = Person()

    with(person) {
        standUp()
        (1..4).forEach {
            moveForward(10)
            moveBack(6)
        }
        sitDown()
    }
}


try-with-resources

Java 코드

1
2
3
4
5
6
7
public String readLine(String path) {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    } catch (IOException e) {
        ...
    }
}

Kotlin 코드

1
2
3
4
5
fun readLine(path: String): String {
    BufferedReader(FileReader(path)).use { br ->
        return br.readLine()
    }
}


swap

  • also 키워드를 사용한다.
1
2
3
4
5
6
7
8
9
var a = 1
var b = 2

a = b.also { b = a }

println("a: $a, b: $b")

// 결과
a: 2, b: 1


Reference

This post is licensed under CC BY 4.0 by the author.