24-05-06 Kotlin 구조 분해 선언 (2)
오늘은 스프링 숙련 강의 초반부를 보며 스프링 학습을 이어나갔다. 아마 당분간은 계속 강의를 보고 학습하는 시간을 가지게 될 것 같다.
어제 정리하다가 마치지 못했던 구조 분해 선언에 대해
1. Kotlin 구조 분해 선언
1-1. 루프문 안에서 구조 분해 활용하기
for문을 이용해 맵 전체를 돌아야하거나 리스트 전체를 돌면서 인덱스도 같이 필요한 경우 구조 분해를 활용하면 코드를 간결하게 작성할 수 있다.
아래 두 가지 예시 코드를 보면 쉽게 이해가 갈 것이다.
- for문 안에서 map의 키, 값 구조 분해를 이용하여 활용해보기
fun main() {
val maps = mutableMapOf(1 to "one", 2 to "two", 3 to "three", 4 to "four", 5 to "five")
for ((k,v) in maps) {
println("$k -> $v")
}
// 1 -> one
// 2 -> two
// 3 -> three
// 4 -> four
// 5 -> five
}
- for문 안에서 List와 withIndex() 함수를 활용해 구조 분해를 이용하여 인덱스와 요소 활용해보기
fun main() {
val list = listOf("일", "이", "삼", "사", "오")
for ((index,value) in list.withIndex()) {
println("index: $index, value: $value")
}
// index: 0, value: 일
// index: 1, value: 이
// index: 2, value: 삼
// index: 3, value: 사
// index: 4, value: 오
}
1-2. 사용하지 않는 변수 건너 뛰는 법
구조 분해 선언을 할 때 모든 필요없는 변수는 언더바(_)를 이용하여 건너뛸 수 있다.
코드를 간단하게 작성해서 확인해 볼 수 있다.
fun main() {
val triple = Triple("철수", "영희", "민수")
val (a, _, c) = triple
println("a: $a, c: $c") // a: 철수, c: 민수
}
1-3. 여러 개의 리턴 값을 가지는 함수에 구조 분해 활용해보기
하나의 함수로 부터 두 개의 값을 반환받고 싶은 경우가 있을 것이다. 이럴 때 데이터 클래스를 선언한 뒤 이 클래스의 인스턴스로 반환받으면 쉽게 가능하다.
그 다음 구조 분해 선언으로 변수들에 값을 넣어주면 된다. 코드로 직접 확인해보면 이해가 쉽다.
fun main() {
val numbers = intArrayOf(1100,200,300,40,201,330,400,500,600,700)
val (a, b) = sumAndAverage(*numbers)
println("a(sum): $a") // a(sum): 4371
println("b(average): $b") // b(average): 437.1
}
data class SumAndAverage(val sum: Int, val average: Double)
fun sumAndAverage(vararg numbs:Int): SumAndAverage {
val sum = numbs.reduce { sum, element -> sum + element }
val average = numbs.average()
return SumAndAverage(sum, average)
}
위의 코드에서는 데이터 클래스를 만들어서 반환받는 것을 해보았다. 데이터 클래스가 필요치 않은 경우라면 간단하게 Pair나 Triple을 활용하면 된다.
fun main() {
val numbers = intArrayOf(1100,200,300,40,201,330,400,500,600,700)
val (a, b) = sumAndAverage(*numbers)
println("a(sum): $a") // a(sum): 4371
println("b(average): $b") // b(average): 437.1
}
fun sumAndAverage(vararg numbs:Int): Pair<Int,Double> {
val sum = numbs.reduce { sum, element -> sum + element }
val average = numbs.average()
return Pair(sum, average)
}
1-4. 람다식 안에서 구조 분해 하기
람다식 안에서도 구조 분해를 활용할 수 있다. 그냥 매개변수 2개를 선언하는 것과 구조 분해를 통해 선언하는 것에 차이가 있기 때문에 주의해야 한다.
코드로 직접 확인해보는 것이 더 직관적이고 이해가 쉽다.
fun main() {
val maps = mutableMapOf(1 to "one", 2 to "two", 3 to "three", 4 to "four", 5 to "five")
val listOfPairs = listOf(1 to "하나", 2 to "둘", 3 to "셋", 4 to "넷", 5 to "다섯")
// 둘은 동일하다
println(maps.mapValues { it.value.uppercase() })
// {1=ONE, 2=TWO, 3=THREE, 4=FOUR, 5=FIVE}
println(maps.mapValues { (key, value) -> value.uppercase() })
// {1=ONE, 2=TWO, 3=THREE, 4=FOUR, 5=FIVE}
// 사용하지 않는 변수는 _를 사용해도 된다.
println(maps.mapValues { (_, value) -> value.lowercase() })
// {1=one, 2=two, 3=three, 4=four, 5=five}
// 둘은 동일하다
println(listOfPairs.map { (a, b) -> "$a -> $b" })
// [1 -> 하나, 2 -> 둘, 3 -> 셋, 4 -> 넷, 5 -> 다섯]
println(listOfPairs.map { pair -> "${pair.first} -> ${pair.second}" })
// [1 -> 하나, 2 -> 둘, 3 -> 셋, 4 -> 넷, 5 -> 다섯]
}
2. 오늘 배운 것
- DDD 과정에 대해 간단하게 학습해보았다.
- REST API에 대해 공부해보았다.
- 스프링 전체에 대한 개요에 대해 조금 더 알아보는 시간을 가졌다.