반응형
구조 분해 선언과 component 함수
구조 분해 선언(destructuring declaration)
>>> val p = Point(10, 20)
>>> val (x, y) = p // x와 y 변수를 선언한 다음에 p와 여러 컴포넌트로 초기화
>>> println(x)
10
>>> println(y)
20
구조 분해 선언의 각 변수를 초기화하기 위해 componentN 이라는 함수를 호출한다.
class Point(val x: Int, val y: Int){
operator fun component1() = x
operator fun component2() = y
}
여러 값을 한꺼번에 반환해야 하는 함수는 구조 분해 선언 구문을 사용하면 쉽게 풀어서 여러 변수를 넣을 수있다.
//값을 저장하기 위한 데이터 클래스를 선언
data class NameComponents(val name : String, val extension : String)
fun splitFilename(fullName: String) : NameComponents {
val result = fullName.split('.', limit = 2)
return NameComponents(result[0], result[1]) // 함수에서 데이터 클래스의 인스턴스를 반환
}
>>> val (name, ext) = splitFilename("example.kt") //구조 분해 선언 구문을 사용해 데이터 클래스를 푼다
>>> println(name)
example
>>> println(ext)
kt
물론 무한히 componentN을 선언할 수는 없다
코틀린 표준 라이브러리에서는 맨 앞의 다섯 원소에 대한 componentN을 제공한다
>>> val x = listOf(1,2)
>>> val (a,b,c,d,e) = x
java.lang.ArrayIndexOutOfBoundsException: 2 at java.util.Arrays$ArrayList.get(Arrays.java:3841)
>>> val (a,b,c,d,e,f) = x
error : destructuring declaration initializer of type List<Int> must have a 'component6()' function val (a,b,c,d,e,f) = x
Pair나 Triple 클래스를 사용하면 함수에서 여러값을 더 간단하게 반환할수있다 하지만 그안에 담긴 원소의 의미를 말해주지 않으므로 가독성이 떨어지지만 직접 클래스를 작성할 필요가 없으므로 코드는 더 단순해진다.
구조 분해 선언과 루프
변수 선언이 들어갈 수 있는 장소라면 어디든 구조 분해 선언을 사용할 수 있다.
fun printEntries(map: Map<String, String>) {
for((key, value) in map) { //루프 변수에 구조 분해 선언을 사용한다.
println("$key -> $value")
}
}
>>> val map = mapOf("Oracle" to "JAVA", "JetBrains" to "Kotlin")
>>> printEntries(map)
Oracle -> Java
JetBrain -> Kotlin
for(entry in map.entries) {
val key = entry.component1()
val value = entry.component2()
}
반응형
'코틀린 & Java > 코틀린인액션' 카테고리의 다른 글
고차 함수 정의 (0) | 2023.05.23 |
---|---|
delegated property 프로퍼티 접근자 로직 재활용 (0) | 2023.05.09 |
Kotlin 범위 관례 인덱스로 원소 접근 Get, Set (0) | 2023.05.09 |
Kotlin == 비교연산자 오버로딩 (0) | 2023.05.09 |
Kotlin Plus 산술연산자 오버로딩 (0) | 2023.05.09 |