JAVA 14에서 처음 도입된 데이터 전용 클래스
불변 데이터 객체를 간결하게 정의할수있도록 만들어짐
기존의 클래스서는 필드,생성자,getter,equals,hashCode,toString등 을직접 작성해야했음
Person클래스
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String name() { return name; }
public int age() { return age; }
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
해당 클래스에서 record를 사용하면 아래처럼 한줄로 같은기능구현가능
public record Person(String name, int age) {}
특징
| 항목 | 설명 |
| -------------------------- | ----------------------------------------------------- |
| 불변성 (Immutable) | 모든 필드는 final이며, 객체 생성 후 변경 불가 |
| 자동 생성 메서드 | equals(), hashCode(), toString() 자동 생성 |
| 생성자 자동 생성 | 컴파일러가 주 생성자(canonical constructor) 자동 생성 |
| Compact Constructor 지원 | 유효성 검사 등을 위해 생성자 직접 정의 가능 |
| 인터페이스 구현 가능 | implements 가능하지만 extends는 불가 (final 클래스이므로 상속 불가) |
예시코드
public record Student(String name, int score) {
// compact constructor (필드 유효성 검사 등 가능)
public Student {
if (score < 0 || score > 100) {
throw new IllegalArgumentException("점수는 0~100 사이여야 합니다.");
}
}
// 메서드 추가도 가능
public String grade() {
if (score >= 90) return "A";
else if (score >= 80) return "B";
else if (score >= 70) return "C";
else return "F";
}
// 인터페이스 구현도 가능
// public record Student(String name, int score) implements Comparable<Student> {...}
}
class Main {
public static void main(String[] args) {
Student s1 = new Student("한주영", 95);
System.out.println(s1); // Student[name=한주영, score=95]
System.out.println(s1.name()); // 한주영
System.out.println(s1.score()); // 95
System.out.println(s1.grade()); // A
}
}
```java
## 🧠 4. record를 쓰면 좋은 경우
✅ DTO(Data Transfer Object)
✅ API 응답 객체
✅ 단순 데이터 묶음 (ex. Pair, Coordinate, Point 등)