코틀린 1.6부터는 value class로 명칭이 변경되었다.
inline
으로 만들 수 있다.
inline
클래스는 모두 정적 메서드로 만들어진다.inline class Name(private val value: String) { /* ... */ }
inline
클래스는 타입만 맞는다면 바로 값을 집어 넣는 것도 허용된다.val name: Name = Name("Marcin")
// 컴파일 후
val name: String = "Marcin"
time
이 어떤 단위인지 알 수 없기에 실수할 확률이 높다. (ms? s?)interface Timer {
fun callAfter(time: Int, callback: () -> Unit)
}
inline class Millis(val milliseconds: Int) { /* ... */ }
interface Timer {
fun callAfter(timeMillis: Millis, callback: () -> Unit)
}
inline class StudentId(val studentId: Int)
inline class TeacherId(val teacherId: Int)
inline class SchoolId(val studentId: Int)
class Grades(
val studentId: StudnetId,
val teacherId: TeacherId,
val schoolId: SchoolId,
)
inline
으로 동작하지 않기에 장점이 하나도 없다.typealias
를 사용해 타입에 새로운 이름을 붙여줄 수 있다.typealias ClickListener = (view: View, event: Event) -> Unit
class View {
fun addClickListener(listener: ClickListener) { }
// ...
}
typealias
는 타입 안전하지 않아 둘을 혼용해도 오류가 발생하지 않는다.typealias Seconds = Int
typealias Millis = Int
fun main() {
val seconds: Seconds = 10
val millis: Millis = seconds // 컴파일 에러가 발생하지 않는다.
}