fun main() {
val p = Point(10, 20)
val (x, y) = p // p의 여러 컴포넌트로 초기화
println(x)
// 10
println(y)
// 20
}

class Person(val x: Int, val y: Int) {
operator fun component1() = x
operator fun component2() = y
}
data class NameComponent(val name: String, val extension: String)
fun splitFilename(fullName: String): NameComponent {
val (name, extension) = fullName.split('.', limit = 2)
return NameComponent(name, extension)
}
fun main() {
val (name, ext) = splitFilename("example.txt")
println(name)
// example
println(ext)
// txt
}
fun printEntries(map: Map<String, String>) {
for((key, value) in map) {
println("$key -> $value")
}
}
fun main() {
val map = mapOf("Oracle" to "Java", "JetBrains" to "Kotlin")
printEntries(map)
// Oracle -> Java
// JetBrains -> Kotlin
}
위 예제는 2가지의 관례를 사용함
람다가 data class나 map 같은 복합적인 파라미터로 받을 때도 구조 분해 선언을 쓸 수 있음
map.forEach { (key, value) ->
println("$key -> $value")
}
data class Person(
val firstName: String,
val lastName: String,
val age: Int,
val city: String
)
fun introducePerson(p: Person) {
val (firstName, _, age) = p
println("This is $firstName, aged $age")
}
fun main() {
val me = Person("yoo", "wuseon", 26, "ganwondo")
introducePerson(me)
// This is yoo, aged 26
}
코틀린 구조 분해의 한계
- 구조 분해 연산의 결과 → 인자의 위치에 따라 결정됨
- 코드를 리펙터링 할 때 클래스 프로퍼티의 순서를 바꾸면 미묘한 문제가 발생할 수 있음
- 이 문제를 해결하기 위해 이름 기반 구조 분해가 개발되고 있는 중임