본문 바로가기
java & kotlin

[kotlin] 구조 분해 선언

by algosketch 2021. 12. 11.

 JavaScript 를 별로 안 좋아하지만 JavaScript 에서는 다음과 같은 편리한 문법이 가능하다.

// 함수 반환
function func() {
    return [10, 20];
}

// 사용
const [a, b] = func();

// React hooks
const [value, setValue] = useState();

 

 함수에서는 배열을 반환하고, 그 값을 한 번에 초기화할 수 있다. 코틀린에서도 조금 불편하긴 비슷한 문법이 가능하다.

fun main(args: Array<String>) {
    val person = Person("algosketch", 24)
    val (name, age) = person
    println("이름 : $name, 나이 : $age")
}

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

 data class 로 선언된 클래스의 인스턴스의 값은 구조분해 선언이 가능하다. 일반 클래스에서는 componentN(N <= 5) 연산자 오버로딩을 통해 구현할 수 있다.

fun main(args: Array<String>) {
    val person = Person("algosketch", 24)
    val (name, age) = person
    println("이름 : $name, 나이 : $age")
}

class Person(val name: String, val age: Int) {
    operator fun component1(): String {
        return name
    }

    operator fun component2(): Int {
        return age
    }
}

 일반 클래스의 경우 위와 같이 componentN 연산자를 오버로딩 해야 구조 분해 선언이 가능하다. 언어 차원에서 componentN 연산자를 무한히 지원할 수 없으므로 N 의 최대 값은 5이다. 배열과 컬렉션에도 componentN 함수가 있다. Map 컬렉션은 다음과 같이 이용 가능하다.

val frameworks = mapOf("java" to "Spring", "kotlin" to "Android")
    for ((key, value) in frameworks) {
        println("key = ${key} -> value = ${value}")
    }