1. record란?
- 자바 14부터 도입된 불변(immutable) 데이터 클래스
- DTO, VO, Response 등 값을 담는 용도에 적합
- getter, toString(), equals(), hashCode() 등 자동 생성
public record Person(String name, int age) {}
자동으로 아래 코드가 생성된다:
public final class Person {
private final String name;
private final int age;
public Person(String name, int age) { ... }
public String name() { return name; }
public int age() { return age; }
public String toString() { ... }
public boolean equals(Object o) { ... }
public int hashCode() { ... }
}
2. record의 특징
항목 설명
| 불변성 | 모든 필드는 private final, 수정 불가 |
| 상속 | 클래스 상속 불가 (final), 인터페이스만 구현 가능 |
| 생성자 | 주 생성자 하나, 커스텀 생성자도 정의 가능 |
| 메서드 | 메서드 오버라이드 가능 (ex: toString) |
3. enum처럼 사용할 수 있다?
public record SaleType(String code, String label) {
public static final SaleType 일반 = new SaleType("A001", "일반");
public static final SaleType 제휴 = new SaleType("A002", "제휴");
}
- enum처럼 public static final 인스턴스로 고정된 목록을 제공
- 단, enum처럼 switch문이나 타입 제한 기능은 없음
- 대신 값 + 설명이 필요한 상황엔 더 유연하게 활용 가능
4. enum과의 차이점
구분 enum record + static final
| 용도 | 고정된 종류 (상태, 타입 등) | 코드-명칭 매핑, 값 객체 표현 |
| 개수 제한 | 선언된 항목만 가능 | 제한 없음 |
| 비교 방식 | == 비교 가능 | equals() 비교 필요 |
| DB 매핑 | 제약 있음 (String/Ordinal) | 자유롭게 가능 |
| switch 사용 | 가능 | 불가능 |
| 유연성 | 제한적 | 유연함 |
5. 언제 record를 써야 할까?
✔ DTO / 응답객체 / 코드값 매핑 등 불변 데이터 구조가 필요할 때
✔ enum처럼 쓰되, 설명 필드가 추가로 필요할 때
✔ 여러 상수 값들을 객체처럼 그룹화 하고 싶을 때
요약
🔹 enum은 타입 제한이 필요할 때,
🔹 record는 유연한 불변 데이터 표현이 필요할 때 사용하자.