Kotlin

[Kotlin] Pair , Triple 과 Destructure

노소래 2021. 8. 5. 10:47

 

Pair 와 Triple 은 코틀린에서 미리 만들어놓은 data class 이다.  둘 다 Tuples 파일에 정의되어있다. 즉 이것도 클래스임을 다시 생각하며 아래를 보자

 

- Pair 만들기 ( to 키워드, List.partition() )

to 키워드로 Pair 를 만드는 방법은 간단하다. 변수 사이에 to 를 넣으면 된다.

val equipment = "fish net" to "catching fish"
println("${equipment.first} used for ${equipment.second}")

요소끼리 타입이 같지 않아도 된다! 위 코드에서 equipment 의 타입은  Pair<String, String> 이다. <> 안의 타입을 바꾸면 타입도 다르게 할 수 있을 것이다. 즉 아래와 같이 작성이 가능하다.

fun main() {
    val catchInfo = "gold fishes" to 5
    println(catchInfo)
    println("I catched ${catchInfo.second} ${catchInfo.first}")
}
(gold fishes, 5)
I catched 5 gold fishes

이미 Pair 인 것을 Pair 의 요소로 사용할 수도 있다. 아래와 같은 방식이다.

val equipment2 = ("fish net" to "catching fish") to "equipment"
println("${equipment2.first} is ${equipment2.second}\n")
println("${equipment2.first.second}")

 

 

한편 List 에서 List 의 Pair 를 만드는 법은 List 의 partition 함수를 사용하는 것이다. Collection 에 다음과 같이 정의되어있다.

public inline fun <T> Iterable<T>.partition(
    predicate: (T) → Boolean
): Pair<List<T>, List<T>>

반환값이 Pair<List<T>, List<T>> 임을 확인할 수 있다. 원 하나씩 돌면서 조건에 맞는지 확인하는 것으로 보인다.

fun main() {

    val students = mutableListOf<Int>()
    students.add(3)
    students.add(2)
    students.add(4)
    students.add(5)
    students.add(1)
    students.add(6)
    val doubleList = students.partition {
        it < 4
    }
    println(doubleList.first)
    println(doubleList.second)

}
[3, 2, 1]
[4, 5, 6]

 

- Triple 

Triple 은 다음과 같이 클래스를 만드는 것과 같이 만들면 된다. 

Pair 도 클래스 만드는 것과 같이 생성할 수 있지만 

/**
 * Creates a tuple of type [Pair] from this and [that].
 *
 * This can be useful for creating [Map] literals with less noise, for example:
 * @sample samples.collections.Maps.Instantiation.mapFromPairs
 */
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

to 를 키워드로 사용할 수 있으므로 사용하면 될 것 같다.

fun main() {
    val pairNum = Pair(1, 2)
    val tripleNum = Triple(6, 9, 42)

    println(pairNum.toString())
    println(pairNum.toList())

    println(tripleNum.toString())
    println(tripleNum.toList())
}
(1, 2)
[1, 2]
(6, 9, 42)
[6, 9, 42]

 

- Destructure

처음에 Pair 와 Triple 모두 data class 라고 했다. 그래서 마찬가지로 destructuring 이 가능하다.

개수와 순서에 유의해서 코드를 작성한다. 중간에 하나를 생략하고 싶다면 _ 를 사용하면 된다.

val equipment = "fish net" to "catching fish"
val (tool, use) = equipment
println("$tool is used for $use")
val numbers = Triple(6, 9, 42)
val (n1, n2, n3) = numbers
println("$n1 $n2 $n3")

 

data class 의 destructuring 설명은 다음 링크를 참고하자 

 

[Kotlin] 상속/ interface/ abstract class/ object/ data class/ enum class

- open 키워드와 상속 다른 클래스를 상속하는 방법은 현재클래스이름(생성자) : 상속클래스이름(생성자) 코틀린은 default 로 부모 클래스의 properties 와 member variables 를 private 이 아닌 이상 접근은

nosorae.tistory.com

 https://nosorae.tistory.com/24  

 

- 출처 : codelabs https://developer.android.com/codelabs/kotlin-bootcamp-extensions#1