실무 프로젝트로 배우는 Kotlin & Spring/코틀린 고급

페어와 구조분해할당

webmaster 2022. 10. 16. 23:19
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

'실무 프로젝트로 배우는 Kotlin & Spring > 코틀린 고급' 카테고리의 다른 글

고급 예외처리  (0) 2022.10.22
스코프 함수  (0) 2022.10.22
지연 초기화  (0) 2022.10.16
제네릭  (0) 2022.10.16
확장 함수  (0) 2022.10.09