코틀린 & Java/코틀린인액션

Kotlin 구조 분해 선언과 component 함수(Pair, Triple)

코딩하는후운 2023. 5. 9. 13:30
반응형

구조 분해 선언과 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()
}
반응형