Deep dive
A `data class` is a convenient way to declare value-like types. Kotlin generates:
- `equals()` / `hashCode()` based on constructor properties
- `toString()`
- `copy(...)`
- `componentN()` for destructuring
When it’s a good fit
- DTOs, request/response models, configuration objects.
- Domain value objects where equality is “by data”.
Practical notes
- `copy()` is shallow (it copies references).
- Prefer `val` properties for immutability; `data class` itself doesn’t enforce it.
Common pitfalls
- Using mutable properties in keys for HashMap/HashSet.
- Expecting inheritance behavior (data classes are final by default).
- Treating `copy()` as deep clone.