본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 36] 구조 분해 선언

하나 이상의 아이템을 반환하고 싶다면?

 

기존에는 변수, 클래스 등에 대해서 반환을 했지만, 여러개의 값을 반환하고 싶다면 코틀린에서는 구조 분해 선언을 통해 반환한다고 한다.

오늘 학습할 아톰은 구조 분해 선언이고 이가 어떻게 쓰이는지 알아보자.

 


 

[ 구조 분해 선언 ]

 

구조 분해 선언

val (식별자1, 식별자2, 식별자3, ,,,) = 여러 값이 들어있는 값

 

: 여러 식별자를 동시에 선언하면서 초기화

: 여러 값이 들어있는 값(객체)을 여러 컴포넌트로 분해해 각 컴포넌트를 순서대로 대입

: 식별자 이름을 괄호에 넣어야 함

: 식별자 중 일부가 필요하지 않은 경우, 이름 대신 밑줄(_)을 사용할 수 있고 맨 뒤쪽의 이름은 아예 생략 가능

: 지역 var / val에만 적용 가능하며, 클래스 프로퍼티 정의 시에는 사용 불가

 


 

Pair

: 표준 라이브러리 클래스

: 두 값을 반환

: List / Set 처럼 파라미터화된 타입

: first, second 프로퍼티를 통해 내용에 접근 가능

 

* Triple 클래스도 존재하며, 이는 세가지 값을 묶음. 더 많은 값을 저장하고 싶은 경우 클래스를 만들어 사용

 

[ Pair 예시 ]

import atomictest.eq

fun compute(input: Int): Pair<Intz String> =
	if (input > 5)
		Pair(input * 2, "High")
    else
		Pair(input * 2, "Low")
        
fun main() {
	compute(7) eq Pair(14, "High")
    compute(4) eq Pair(8z "Low")
    
    val result = compute(5)
    result.first eq 10
    result.second eq "Low"
}

 

 

[ Pair 구조 분해 선언 ]

import atomictest.eq

fun compute(input: Int): Pair<Intz String> =
	if (input > 5)
		Pair(input * 2, "High")
    else
		Pair(input * 2, "Low")

fun main() {
	val (value, description) = compute(7)
    value eq 14
	description eq "High”
}

 


 

[ data 클래스 구조 분해 선언 ]

data 클래스 구조 분해 선언

: data 클래스는 자동으로 구조 분해 선언을 지원

: Pair / Triple 보다 data 클래스 반환하는 것이 정보를 추가하거나 제거하기 좋음

: 인스턴스 구조 분해 시 data 클래스 생성자에 각 프로퍼티가 나열된 순서대로 값이 대입

 

import atomictest.eq

data class Tuple(
	val i:Int,
    val d:Double,
    val s:String,
    val b:Boolean,
    val 1:List<Int>
)

fun main() {
	val tuple = Tuple(
		1, 3.14, "Mouse", false, listOf()) 
    val (i, d, s, b, 1) = tuple // data 클래스 구조분해 자동 지원
    
    i eq 1
    d eq 3.14
    s eq "Mouse"
    b eq false
    1 eq listOf()
	val (_, _, animal) = tuple // 식별자 명 생략 가능
	animal eq "Mouse"
}

 


 

[ withIndex() ]

withIndex()

: List에 대해 표준 라이브러리가 제공하는 확장 함수

: 컬렉션의 값을 IndexedValue 타입 객체에 담아서 반환하며, 객체 구조 분해 가능

 

import atomictest.trace

fun main() {
	vallist=listOf('a', 'b', 'c')
	for ((index, value) in list.withlndex()) {
		trace("$index:$value")
	}
	trace eq "0:a 1:b 2:c"
}

 


 

[ 오늘의 학습 소감 ]

 

오늘은 코틀린에서 제공하는 구조 분해 선언에 대해서 학습했다. 솔직히 소감을 말하자면 구조 분해 선언이 좋은 것은 알겠지만, 기존에 클래스를 반환하는 것과의 차이가 뭘까에 대한 생각이 많이 든 학습 아톰이었다. 둘의 차이점은 존재하고 가독성, 불변성 등 생각보다 많은 차이가 존재하는 것 같은데, 언젠가는 이 차이를 명확히 알고 사용할 수 있는 날이 오길 바라며, 오늘 학습을 마치려고 한다.