Search

Destructuring declarations

val (name, age) = person println(name) println(age)
Kotlin
복사
이 구문을 구조 분해 선언이라고 하고 구조 분해 선언은 여러 변수를 동시에 생성한다.
여기서는 name 과 age 라는 두 개의 새로운 변수를 선언하고 독립적으로 사용할 수 있다.
val name = person.component1() val age = person.component2()
Kotlin
복사
구조 분해 선언은 위와 같은 코드로 컴파일된다.
component1() 및 component2() 함수는 Kotlin에서 널리 사용되는 관례의 일환으로 객체의 속성을 반환하는 함수이다.
component3(), component4() 처럼 필요한 수만큼 호출될 수 있다.
componentN() 같은 구성 요소 함수는 operator 키워드로 표시되어야 하며 이렇게 함으로써 구조 분해 선언에서 사용할 수 있다.

사용 예시

for 루프

for ((a, b) in collection) { ... }
Kotlin
복사
a와 b는 collection의 각 요소에서 호출된 component1() 및 component2()의 반환값을 받게 된다.
즉, 컬렉션의 각 요소를 반복하면서 각각의 값에 접근할 수 있다.

함수에서 두 값을 반환하는 예시

data class Result(val result: Int, val status: Status) fun function(...): Result { // computations return Result(result, status) } // Now, to use this function: val (result, status) = function(...)
Kotlin
복사
데이터 클래스를 사용하면 기본적으로 componentN() 함수가 자동으로 생성되므로 구조 분해 선언을 통해 쉽게 값을 사용할 수 있다.
표준 클래스인 Pair 를 사용하여 function() 이 Pair<Int, Status> 를 반환하도록 할 수도 있지만 데이터에 이름을 적절히 붙이는 것이 종종 더 좋다.

Map과 구조 분해 선언

for ((key, value) in map) { // 키와 값을 사용하여 작업 수행 }
Kotlin
복사
Map을 구조 분해하며 탐색하기 위한 조건
1.
Map을 값의 시퀀스로 제공하여 iterator() 함수를 제공해야 한다.
2.
각 요소를 쌍으로 표시하기 위해 component1() 및 component2() 함수를 제공해야 한다.
operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator() operator fun <K, V> Map.Entry<K, V>.component1() = getKey() operator fun <K, V> Map.Entry<K, V>.component2() = getValue()
Kotlin
복사
표준 라이브러리에서는 위와 같은 확장을 제공한다.

사용하지 않는 변수를 위한 언더스코어

val (_, status) = getResult()
Kotlin
복사
구조 분해 선언에서 변수가 필요 없는 경우 변수 이름 대신 언더스코어를 사용할 수 있다.
이렇게 생략된 구성 요소에 대해서는 componentN() 함수가 호출되지 않는다.

람다에서의 구조 분해

map.mapValues { entry -> "${entry.value}!" } map.mapValues { (key, value) -> "$value!" }
Kotlin
복사
람다가 아래 타입의 매개변수를 가지고 있다면 괄호 안에 여러 개의 새 매개변수를 넣어 구조 분해할 수 있다.
Pair 타입
Map.Entry
적절한 componentN 함수가 있는 다른 타입
{ a -> ... } // 하나의 매개변수 { a, b -> ... } // 두 개의 매개변수 { (a, b) -> ... } // 구조 분해된 쌍 { (a, b), c -> ... } // 구조 분해된 쌍과 다른 매개변수
Kotlin
복사
두 매개변수를 선언하는 것과 구조 분해된 쌍을 매개변수로 선언하는 것의 차이를 주의하라.
map.mapValues { (_, value) -> "$value!" }
Kotlin
복사
구조 분해된 매개변수의 구성 요소 중 하나가 사용되지 않는 경우 이름을 만들 필요 없이 언더스코어로 대체할 수 있다.
map.mapValues { (_, value): Map.Entry<Int, String> -> "$value!" } map.mapValues { (_, value: String) -> "$value!" }
Kotlin
복사
구조 분해된 매개변수 전체 또는 특정 구성 요소에 대해 타입을 지정할 수 있다.