너를 분해할 순 없잖아..
객체가 가지고 있는 여러 값을 분해해서 여러 변수에 한꺼번에 초기화
코드로 간단한 예를 들어보면
val food = Food("김치찌개", "스시")
val (korean, japenese) = food // korean, japenese 라는 변수를 선언함과 동시에 food의 여러 컴포넌트로 초기화
println(korean)
>> 스시
println(japenese)
>> 피자
이렇게 구조 분해 선언을 일반 변수와 비슷하지만 여러 변수들을 괄호로 묶었다는 점에서 차이가 있습니다.
구조 분해 선언의 내부에서는 각 변수를 초기화하기 위해 componentN이라는 함수를 호출하게 되는데, 여기서 N은 구조 분해 선언에 있는 변수 위치에 따라붙는 번호입니다.
componentN은 다음과 같이 컴파일됩니다.
val(a, b) = data
-> val a = data.component1()
val b = data.component2()
여기서 데이터 클래스의 주 생성자에 들어있는 프로퍼티에 대해서는 컴파일러가 자동으로 componentN 함수를 만들어줍니다.
또한 경우에 따라서 모든 값이 필요하지 않다면 밑줄(_)로 대체할 수도 있습니다.
val food = Food("김치찌개", "스시")
val (korean, _, japenese) = food
println("한식: $korean, 일식: $japenese")
>> "한식: 김치찌개, 일식: 스시"
이러한 구조 분해 선언은 무한하게 componentN을 선언할 수는 없고 맨 앞에 다섯 개의 원소에 대해서만 componentN 함수를 제공합니다.
이와 비슷한 기능으로는 코틀린 표준 라이브러리에 미리 정의된 Pair 나 Triple 클래스를 사용하면 함수에서 여러 값을 더 간단하게 반환할 수 있습니다.
코드로 간단한 예제를 살펴보면
val pair = Pair("김치찌개", "스시")
println("한식: ${pair.first}, 일식: ${pair.second}")
>> 한식: 김치찌개, 일식: 스시
또는
println("한식: ${pair.component1}, 일식: ${pair.component2}")
>> 한식: 김치찌개, 일식: 스시
또는
val (korean, japenese) = Pair("김치찌개", "스시")
println("한식: $korean, 일식: $japenese)
>> 한식: 김치찌개, 일식: 스시
위와 같은 방법으로 2개의 변수를 가진 객체를 간단하게 선언이 가능하고
val triple = Triple("김치찌개", "스시", "짜장면")
println("한식: ${triple.first}, 일식: ${triple.second}, 중식: ${triple.third} ")
>> 한식: 김치찌개, 일식: 스시, 중식: 짜장면
또는
println("한식: ${triple.component1}, 일식: ${triple.component2}, 중식: ${triple.component3}")
>> 한식: 김치찌개, 일식: 스시, 중식: 짜장면
또는
val (korean, japenese, chinese) = Triple("김치찌개", "스시")
println("한식: $korean, 일식: $japenese, 중식: $chinese)
>> 한식: 김치찌개, 일식: 스시, 중식: 짜장면
Triple은 위와 같은 3개의 변수를 가진 객체를 간단하게 생성할 수 있습니다.
🔔여기서 4개 이상의 변수를 가진 객체를 만드려면 데이터 클래스를 만들어서 사용해야 합니다.
구조 분해는 변수 선언이 들어갈 수 있는 곳이라면 어디든 구조 분해를 사용할 수 있습니다.
루프문 안에서도 사용이 가능하죠
특히 Map이나 List에 대해 이터레이션 할 때 굉장히 유용합니다.
val map = mapOf("한식" to "김치찌개")
for((key, value) in map) { //루프 변수에 구조 분해 선언을 사용
println("$key: $value")
}
>>> 한식: 김치찌개
val list = listOf("김치찌개", "스시", "짜장면")
for((index, value) in list.withIndex()) { //루프 변수에 구조 분해 선언을 사용
// withIndex()를 사용하여 index와 value를 모두 받음
println("${index} -> ${value}")
}
>> 0 -> 김치찌개
>> 1 -> 스시
>> 2 -> 짜장면
위와 같이 루프문에서도 구조 분해를 사용하여 간단하게 선언이 가능합니다.