728x90
1.9.0 언어 업데이트
release note
What's new in Kotlin 1.9.0 | Kotlin
Enum 클래스 entries 속성
- values()의 함수를 entries라는 속성으로 대체하였습니다.
- values()의 단점은 호출할때마다 새로운 인스턴스를 매번 할당해야 하기 때문에 성능 문제로 이어질수 있다는 단점이 있습니다.
- 모든 호출마다 Mutable Array 복사본을 생성해 반환.
- 아울러 불변이 아니기 때문에, 수정이 가능한 부분이 있었습니다.
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
fun main() {
val directions = Direction.values()
directions.forEach { println(it) }
directions.sortDescending()
directions.forEach { println(it) }
}
- 위의 두가지의 문제점을 해결학기 위해 entries 속성을 제공합니다.
fun main() {
val directions = Direction.entries
directions.forEach { println(it) }
directions.sortDescending() // 에러 발생
directions.forEach { println(it) }
}
해당 values()기능은 계속 지원되지만 대신에 entries 속성을 사용하는 것이 좋습니다.
data object
- data class와 동일한 방식으로 toString, equals, haseCode를 포함한 방식입니다. obejct선언과 같이 data class를 선언합니다.
sealed interface ReadResult
data class Number(val number: Int) : ReadResult
data class Text(val text: String) : ReadResult
data object EndOfFile : ReadResult
fun main() {
println(Number(7)) // Number(number=7)
println(EndOfFile) // EndOfFile
}
- 이로 인해 sealed class, interface hierarchy로 구성된 sealed 계층에서 유용해졌습니다.
Inline value classes
- value class 내에 보조 생성자의 body를 작성할 수 있습니다.
@JvmInline
value class Person(private val fullName: String) {
// Allowed since Kotlin 1.4.30:
init {
check(fullName.isNotBlank()) {
"Full name shouldn't be empty"
}
}
// Allowed by default since Kotlin 1.9.0:
constructor(name: String, lastName: String) : this("$name $lastName") {
check(lastName.isNotBlank()) {
"Last name shouldn't be empty"
}
}
}
이전에는 public 구성자에서만 body를 작성할 수 있었고, 그러다 보니 캡슐화나 값의 제약을 건 inline class (value class)를 만드는것이 불가능 했지만, 가능하게 되었습니다.
728x90
728x90
'Backend > Kotlin' 카테고리의 다른 글
프로젝트에 Kotlin의 컨벤션을 지키기 위해 Ktlint를 사용해보기. (2) | 2023.12.03 |
---|---|
Kotlin의 val vs var (0) | 2022.02.05 |