[Kotlin] 구조 분해

박상군·2022년 4월 3일
2

Kotlin

목록 보기
1/9
post-thumbnail

너를 분해할 순 없잖아..

코틀린에는 데이터 클래스의 특성중 구조 분해 선언(Destructuring Declaration)이라는 특성이 있습니다.

1. 구조 분해란?

객체가 가지고 있는 여러 값을 분해해서 여러 변수에 한꺼번에 초기화

코드로 간단한 예를 들어보면

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 함수를 제공합니다.


2. Pair와 Triple

이와 비슷한 기능으로는 코틀린 표준 라이브러리에 미리 정의된 Pair 나 Triple 클래스를 사용하면 함수에서 여러 값을 더 간단하게 반환할 수 있습니다.

코드로 간단한 예제를 살펴보면

Pair

val pair = Pair("김치찌개", "스시")

println("한식: ${pair.first}, 일식: ${pair.second}")

>> 한식: 김치찌개, 일식: 스시

또는

println("한식: ${pair.component1}, 일식: ${pair.component2}")

>> 한식: 김치찌개, 일식: 스시

또는

val (korean, japenese) = Pair("김치찌개", "스시")
println("한식: $korean, 일식: $japenese)

>> 한식: 김치찌개, 일식: 스시

위와 같은 방법으로 2개의 변수를 가진 객체를 간단하게 선언이 가능하고

Triple

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개 이상의 변수를 가진 객체를 만드려면 데이터 클래스를 만들어서 사용해야 합니다.


3. 구조 분해 선언과 루프

구조 분해는 변수 선언이 들어갈 수 있는 곳이라면 어디든 구조 분해를 사용할 수 있습니다.
루프문 안에서도 사용이 가능하죠
특히 Map이나 List에 대해 이터레이션 할 때 굉장히 유용합니다.

Map

val map = mapOf("한식" to "김치찌개")

for((key, value) in map) {  //루프 변수에 구조 분해 선언을 사용
   println("$key: $value")
}

>>> 한식: 김치찌개

List

val list = listOf("김치찌개", "스시", "짜장면")

for((index, value) in list.withIndex()) {  //루프 변수에 구조 분해 선언을 사용
// withIndex()를 사용하여 index와 value를 모두 받음
   println("${index} -> ${value}")
}

>> 0 -> 김치찌개
>> 1 -> 스시
>> 2 -> 짜장면

위와 같이 루프문에서도 구조 분해를 사용하여 간단하게 선언이 가능합니다.


참조 링크1
참조 링크2

0개의 댓글