본문 바로가기
Android 개발/Kotlin

Destructuring declaration 에 대해 알아보자 # 구조분해 선언 Kotlin

by Developer88 2023. 5. 1.
반응형

오늘은 Destructuring declaration 에 대해서 정리해 보도록 하겠습니다.

 

1. Destructuring declaration

한국말로는 구조파괴 또는 분해 선언이라고 할 수 있는데요.

단 한줄로, 객체의 여러 프로퍼티들을 한번에 선언하게 해주는 문법입니다.

코드가 짧아지고, 가독성도 향상됩니다.

 

2. 구현

2-1. 구현준비

실제로 코드로 보면서 이해하는 것이 빠를텐데요.

다음과 같은 간단한 Student 클래스가 있다고 가정해 보겠습니다.

 

data class Student(val name: String, val age: Int)

 

이제 위의 데이터 클래스로 객체를 아래와 같이 만들어줍니다.

 

val student = Student("Ive Shim", 23)

 

 

2-2. 기존방법

원래는 이 student 객체의 name과 age에 변수를 부여해서 접근한다면 다음의 2줄이 필요하게 됩니다.

 

val studentName = student.name
val studentAge = student.age

 

2-3. Destructuring declaration 문법

그런데, Destructuring declaration 을 이용하면 아주 심플하게,

다음 한줄로 선언이 가능하게 됩니다.

 

val (studentName, studentAge) = student

 

 

2-4. 다른 코드에서의 구현사례

다음과 같은 실제 사례도 한번 보겠습니다.

먼저 구현하기 전 입니다.

아래의 userType과 userList는 Pair()타입의 데이터인데요.

 

val userType = userWithSameType.first
val userList = userWithSameType.second
if(userList.isEmpty()) return

val firstUser = realtimeBusList.getOrNull(0) ?: return
val secondUser = realtimeBusList.getOrNull(1)

 

위의 경우 userType과 userList 를 바로 Destructuring declaration 로 구현가능합니다.

특히나 Pair타입과 같이 접근자가 first와 second같이 의미가 크지 않는 경우,

Destructuring declaration 선언하는 것이 간결하고 읽기 좋습니다.

 

val(userType, userList) = userWithSameType
if(userList.isEmpty()) return

val firstUser = realtimeBusList.getOrNull(0) ?: return
val secondUser = realtimeBusList.getOrNull(1)

 

 

아래와 같은 식으로도 사용할 수 있는데요.

matchingInfo 로 orderMin과 orderNum 이 있으면 Pair 로 데이터를 전달해 주는데,

이 2개의 데이터를 Destructuring declaration 로 아래와 같이 넣어줄 수 있습니다.

 

val (orderMin, orderNum) = if (matchingInfo != null) {
    Pair(matchingInfo.orderMin, matchingInfo.orderNum)
} else {
    Pair("", "")
}

 

Pair나 Triple 과 Destructuring declaration 얼마든지 같이 사용할 수 있습니다.

 

3. 주의할 점

3-1. Data class 객체에 사용하는 것이 디폴트

Kotlin에서는 기본적으로 data class의 객체에 Destructuring declaration 사용이 가능합니다.

compiler가 componentN() 함수를 구현해주기 때문인데요.

만약 다른 종류의 class에 사용하려고 할 경우,

아래와 같이, componentN() 함수를 직접 정의해 주어야 사용할 수 있습니다.

 

class Person(val firstName: String, val lastName: String) {
    operator fun component1(): String = firstName
    operator fun component2(): String = lastName
}

 

 

728x90

댓글