Data Class
데이터를 담는 목적으로 사용되는 클래스로, 자동으로 아래 기본 메서드들을 생성해준다.
hashCode() ,copy() , equals() ,toString() , componentsN()
자바 vs 코틀린
자바에서 일반적인 Dto를 보면 아래와 같다.
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override
public boolean equals(Object o) { ... }
@Override
public int hashCode() { .. }
@Override
public String toString() { ... }
}
사실 다 lombok을 가져다 쓰니.. Lombok Data 어노테이션을 붙인다고 하면 getter, setter, toString(), equals(), hashCode() 를 다 자동 생성해주긴 한다.
import lombok.Data;
@Data
public class User {
private final String name;
private final int age;
}
하지만, Lombok 라이브러리를 추가해줘야 하고 Lombok 자체가 런타임이 아니라 컴파일 타임에 코드를 생성하기 때문에 디컴파일하면 여전히 코드가 많다.
반면, 코틀린 data class를 사용하면 Lombok 없이도 동일한 기능을 수행할 수 있다. (getter, setter, equals(), hashCode(), toString() 자동 생성)
data class User(
val name: String,
val age: Int
)
또한, hashCode() ,equals() ,toString() 뿐만 아니라 componentsN() (구조분해), copy() 도 자동으로 생성해준다.
copy()
객체를 변경할 때, 새로운 객체를 쉽게 생성할 수 있다.
val user1 = User("Alice", 25)
val user2 = user1.copy(age = 26)
println(user2) // User(name=Alice, age=26)
componentN() : 구조 분해 (Destructuring)
필드 순서대로 component1(), component2(), component3() … 메서드를 자동 생성한다.
val (name, age) = user1
println(name) // Alice
println(age) // 25
내부적으로는 이렇게 동작한다.
val name = user.component1()
val age = user.component2()
자바에서 많이 쓰는 Lombok은 구조 분해를 제공하지 않기 때문에 아래와 같이 써야 한다.
@Data
public class User {
private final String name;
private final int age;
}
User user = new User("Alice", 25);
String name = user.getName();
int age = user.getAge();
Java record vs Kotlin data class
공통점 : 둘 다 불변 객체를 쉽게 쓰는 데 초점을 맞추고 있음
기능 | Java record | Kotlin data class |
자동 생성되는 메서드 | getter, equals(), hashCode(), toString() | getter, equals(), hashCode(), toString(), copy(), componentN() |
필드 변경 가능 여부 | 모든 필드 final (불변) | val(불변), var(가변 가능) |
구조 분해 지원 | ❌ 지원하지 않음 | ✅ componentN() 자동 생성 |
상속 가능 여부 | ❌ record는 final (상속 불가) | ✅ data class는 open 가능 |
추가 메서드 정의 | ✅ 가능 | ✅ 가능 |
JVM 버전 | Java 14+ | Java 6+ (Kotlin 자체 지원) |
- copy(), 구조 분해는 코틀린만 제공한다.
- record는 상속이 불가한데 코틀린 data class는 open 키워드를 앞에 붙이면 가능하다고 한다.
728x90
'study' 카테고리의 다른 글
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 15장 구글 드라이브 설계 (2) | 2024.11.04 |
---|---|
리눅스 scp 명령어로 ssh에서 파일 쉽게 옮기기 (2) | 2024.09.22 |
Anthropic Claude Workbench에서 프롬프트 테스트하기 (1) | 2024.09.15 |