Destructuring declaration 에 대해 알아보자 # 구조분해 선언 Kotlin
오늘은 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
}