기본 문법
Classes
- 기본적으로 Kotlin에서 모든 클래스는 final로 선언되며 상속이 불가하다, 이는 불변성을 강화하기 위함
- 상속 가능한 클래스로 만들려면 open 키워드를 붙여 사용할 수 있는데, 보통은 Hibernate Proxy를 사용할 때 같이 활용하는걸로 보인다
- Hibernate Proxy는 Lazy Loading을 위해 사용하는데, 조인 쿼리로 데이터를 가져올 경우 많은 데이터를 필요로 할때 가져오도록 성능을 안정시킬 수 있는 것
고급 문법
컬렉션 처리
fold
- 컬렉션을 순회하며 초기값을 시작으로 누적(accumulate)하여 하나의 결과값을 만들어내는 함수
- fold 내 초기값을 세팅, 함수 내 acc, 누적값과 요소들로 구성된다
// Example1
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.fold(0) { acc, num -> acc + num }
println(sum) // 15
// Example2
val dataList = listOf(
DataModel(name = "A", value = 10),
DataModel(name = "B", value = 20),
DataModel(name = "A", value = 30),
)
val total = dataList.fold(mutableMapOf<String, Int>()) { acc, element ->
val key = element.name
val value = element.value
acc[key] = acc.getOrDefault(key, 0) + value
acc
}
println(total) // { "A":40, "B":20 }
associate
- 컬렉션을 맵으로 변환할때 사용하는 함수이며, 두 가지 변형이 있다
- associateWith : 각 요소를 Key로, 변환값을 Value로 세팅
- associateBy : 각 요소를 Value로, 변환값을 Key로 세팅
val dataList = listOf("one", "two", "three")
// Example1
val lengthMap = dataList.associate { it to it.length }
println(lengthMap) // { "one"=3, "two"=3, "three"=5 }
// Example2
val sameLengthMap = dataList.associateWith { it.length }
println(sameLengthMap) // { "one"=3, "two"=3, "three"=5 }
// Example3
val charMap = dataList.associateBy { it.first() }
println(charMap) // { "o"="one", "t"="three" }