(Kotlin/코틀린) 구조분해 선언(Destructuring) 완전 정리

개요


1. 구조분해 선언이란?

val person = Person("Kim", 30)
val (name, age) = person

2. 내부적으로 어떻게 동작하나?

val (name, age) = person

// 내부 동작
val name = person.component1()
val age = person.component2()

3. data class에서 구조분해가 가능한 이유

data class는 컴파일러가 자동으로 componentN() 함수를 만들어줍니다.

data class Person(
    val name: String,
    val age: Int
)

// 위 코드 작성 시 아래의 함수들이 자동 생성
operator fun component1(): String = name
operator fun component2(): Int = age

// 자동 생성 된 componentN() 이 있기에 호출 가능
val person = Person("Kim", 30)
val (name, age) = person

println(name) // Kim
println(age)  // 30

4. Pair와 Triple에서 자주 사용된다

4.1 Pair

val pair = "Kotlin" to 100
val (language, score) = pair

println(language) // Kotlin
println(score)    // 100

4.2 Triple

val triple = Triple("Android", 14, true)
val (platform, version, isStable) = triple

5. Map 순회에서 자주 쓰는 패턴

val map = mapOf(
    "A" to 100,
    "B" to 200
)

for ((key, value) in map) {
    println("$key = $value")
}

6. 람다에서도 구조분해 가능

map.forEach { (key, value) ->
    println("$key -> $value")
}

7. 사용하지 않는 값은 _로 무시할 수 있다

val person = Person("Kim", 30)
val (name, _) = person

println(name)

8. 구조분해는 “간결함”보다 “명확함”이 우선이다

// 가독성 떨어짐
val (id, name, email, phone, address, birth, status) = user

// 명시적으로 꺼내는 것이 가독성 좋음
val name = user.name
val email = user.email

9. 구조분해 vs 일반 프로퍼티 접근

항목 구조분해 일반 접근
코드 길이 짧음 다소 길 수 있음
가독성 상황에 따라 좋음 명확함
순서 의존성 있음 없음
실수 가능성 순서 실수 가능 적음


Related Posts