class User(val name: String, var age: Int) { fun introduce() = println("I'm $name, $age years old") } val u = User("Alice", 30) u.introduce()
Data classes auto-generate equals(), hashCode(), toString(), and copy() — perfect for model objects.
data class Product(val id: Int, val name: String, val price: Double) val p1 = Product(1, "Widget", 9.99) val p2 = p1.copy(price = 12.99) // unchanged except price println(p1 == p2) // false — structural equality
sealed class UiState<out T> { object Loading : UiState<Nothing>() data class Success<T>(val data: T) : UiState<T>() data class Error(val msg: String) : UiState<Nothing>() } fun render(state: UiState<List<Product>>) = when (state) { is UiState.Loading -> showSpinner() is UiState.Success -> showList(state.data) is UiState.Error -> showError(state.msg) }