[코틀린] 구조 분해

14288 단어 kotlinkotlin

코틀린에는 데이터 클래스의 특성중 구조 분해 선언(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

좋은 웹페이지 즐겨찾기