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 설명은 다음 링크를 참고하자
https://nosorae.tistory.com/24
- 출처 : codelabs https://developer.android.com/codelabs/kotlin-bootcamp-extensions#1
'Kotlin' 카테고리의 다른 글
[Kotlin] 흥미돋는 코틀린의 타입을 정리해보자 (0) | 2023.01.05 |
---|---|
[Kotlin] 람다함수는 무엇이고 왜 쓰고 어떻게 쓸까? (1) | 2023.01.01 |
[Kotlin] 상속/ interface/ abstract class/ object/ data class/ enum class (0) | 2021.08.05 |
[Kotlin] 접근제어자 ( visibility modifiers ) (0) | 2021.08.04 |
[Kotlin] Class (constructor, getter/setter, companion object) 기초 (0) | 2021.08.04 |