enum class WeekDay {
MONDAY, TUESDAY, WEDNESDAY
} // 이렇게 정의하고
// 이렇게 사용한다.
fun main() {
println(WeekDay.MONDAY)
}
정의할 때 "class" 키워드가 들어간 다는 점을 제외하면 java와 유사하다.
data class Person(val firstName: String,
val familyName: String,
val age: Int)
// 이렇게 정의하고
// 이렇게 사용한다.
fun main() {
val person1 = Person("John", "Doe", 25)
val person2 = Person("John", "Doe", 25)
println(person1 == person2) // true
}
equals(), hashCode(), toString() 같은 메소드들을 자동으로 생성해준다. 자바에서는 매번 구현해야 했다.
동등성(equality) 비교 연산을 자동으로 생성해준다.
class Person(val firstName: String,
val familyName: String,
val age: Int)
data class Mailbox(val address: String, val person: Person)
// 이렇게 정의하면 Person 클래스 때문에 동등성이 프로퍼티 값 비교만으로는 이루어지지 않는다.
fun main() {
val box1 = Mailbox("Unknown", Person("John", "Doe", 25))
val box2 = Mailbox("Unknown", Person("John", "Doe", 25))
println(box1 == box2) // false 반환
}
일반적으로 데이터 클래스는 불편 클래스로 설계하는 편이 더 합리적이다. 불변 데이터를 사용하면 코드에 대한 추론이 쉬워지고, 실수를 덜 저지르게 되기 때문이다. 특히 다중 쓰레드 환경에서는 불편성이 더욱 도움된다.
@JvmInline
value class Dollar(val amount: Int)
@JvmInline
value class Euro(val amount: Int)
값 클래스 주 생성자에는 불변 프로퍼티를 하나만 선언해야 한다. 런타임에 클래스 인스턴스는 별도의 래퍼 객체를 생성하지 않고 이 프로퍼티의 값으로 표현된다.
런타임에는 호출 지점을 함수 본문으로 인라인하는 인라인 함수처럼 인라인 클래스 객체를 사용하는 위치 대신 인라인 클래스에 들어있는 값이 들어간다.
@JvmInline
value class Dollar(val amount: Int) {
fun add(d: Dollar) = Dollar(amount + d.amount)
val isDept get() = amount < 0
}
fun main() {
print(Dollar(15).add(Dollar(20)).amount) // 35
print(Dollar(-100).isDebt) // true
val : 불변 변수 키워드
var : 가변 변수 키워드