728x90
페어
//f((1,3)) = 1 + 3 = 4
//함수에 하나의 인자로 들어온 것을 튜플이라고 한다
/*
data class Tuple(val a: Int, val b: Int)
fun plus(tuple: Tuple) = tuple.a + tuple.b
*/
fun plus(pair: Pair<Int, Int>) = pair.first + pair.second
fun main() {
//val plus = plus(Tuple(1, 3))
val plus = plus(Pair(1, 3))
println(plus)
val pair = Pair("A", 1)
//pair.first = "B" //컴파일 오류 -> first,second 가 val로 되어있기 때문에
val newPair = pair.copy(first = "B")
println(newPair)
val second = newPair.component2() //두번쨰 컴포넌트 접근//pair.second와 같다
println(second)
val list = newPair.toList() //리스트로 변환 //immutable 리스트이다
println(list)
}
- 함수형 프로그래밍의 접근법을 사용해서 plus를 수정한다면, 튜플이라는 개념을 사용할 수 있으며, 튜플이라는 클래스를 만들어 사용해야 한다.
- 튜플을 사용하면, 하나의 인자에 여러 원소를 포함할 수 있다.
- 코틀린은 Pair를 통해 2개의 요소가 있는 튜플을 기본적으로 제공한다.
- 첫 번째 인자는 first, 두 번째 인자는 second를 사용할 수 있으며, 페어는 기본적으로 불변이다.
- 내부 코드에 val 키워드로 first, second가 구현되어 있다.
- 내부 코드가 데이터 클래스 기반으로 copy, componentN 함수도 제공하며, toList를 사용해 요소를 불변 리스트로 만들 수도 있다.
트리플
fun main(){
val triple = Triple("A", "B", "C") //3개의 요소를 가진 집합
println(triple)
triple.first
triple.second
//triple.third = "D"
val newTriple = triple.copy(third = "D")
println(newTriple)
println(newTriple.component3())
//4개 이상부터는 자료구조를 새로 만들어야한다
val (a: String, b: String, c) = newTriple //구조분해 할당을 사용해서 값을 분해해서 초기화 할 수 있다.
//타입까지 명시적으로 지정해서 해줄 수 도 있다.
println("$a, $b, $c")
}
- 트리플은 3개의 요소를 가질 수 있는 튜플이다.
- 첫 번째 인자는 first, 두 번째 인자는 second, 세 번째 인자는 third를 사용할 수 있으며, 페어의 특성을 동일하게 가지고 있다.
- 불변성, copy, componentN 사용이 가능하다
구조 분해 할당
fun main(){
val triple = Triple("A", "B", "C") //3개의 요소를 가진 집합
val list3 = newTriple.toList()
val (a1, a2, a3) = list3 //list도 componentN 함수가 있고, 총 5개의 ComponentN 함수가 있다.
println("$a1, $a2, $a3")
list3.component1()
list3.component2()
list3.component3()
//list3.component4()
//list3.component5()
//val map = mutableMapOf("이상훈" to "개발자")
val map = mutableMapOf(Pair("이상훈", "개발자"))
for ((key, value) in map) {
println("${key}의 작업은 $value")
}
}
- 구조 분해 할당을 사용하면 값을 분해해서 한 번에 여러 변수를 초기화할 수 있다.
- 타입을 생략할 수 있지만 명시적으로 타입을 선언할 수도 있다.
- 구조 분해할당은 컴파일러 내부에서 componenentN 함수를 사용한다.
- 배열, 리스트에서도 구조분해 할당을 사용할 수 있으며, componentN을 사용할 수 있지만, 기본적으로 제공되는 개수는 앞에 있는 요소부터 최대 5개 요소에 대해서만 제공한다.
- for loop에서도 유용하게 사용되며, map을 초기화할 때 사용되는 to는 내부적으로 페어를 사용한다
728x90