record는 자바 14 프리뷰로 추가되었고, 이 후 16버전에서 정식으로 적용이 되었다.
🎯 record 클래스의 등장 배경
🧱 1. Boilerplate 코드 문제
Java는 객체지향 언어로서, 클래스 구조가 엄격하고 명확하지만 그만큼 반복적인 코드(boilerplate) 가 많다.
단순히 데이터를 담기 위한 VO/DTO 클래스조차 다음을 반복적으로 작성해야 했고,
- private final 필드 선언
- 생성자
- getter
- equals(), hashCode()
- toString()
➡ 실질적인 로직 없이 코드만 많아지는 문제가 생겼다.
(record 등장 전 기존에 사용하던 예시코드)
public class Person {
private final String name;
private final int age;
public Person(String name, int age) { ... }
public String getName() { ... }
public int getAge() { ... }
@Override public String toString() { ... }
@Override public boolean equals(Object o) { ... }
@Override public int hashCode() { ... }
}
이러한 단순 데이터 클래스를 간결하게 표현할 수 있는 방법이 필요하여 등장한 것이 record 이다.
✅ record로 변환
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) {
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 + "]";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person other = (Person) o;
return age == other.age && name.equals(other.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
🧠 사용법도 조금 달라짐
Person p = new Person("준수", 30);
System.out.println(p.name()); // getName()이 아니라 name()
System.out.println(p.age()); // getAge() 대신 age()
✅ 왜 record에는 setter가 없는가?
- record는 값 객체(Value Object) 개념에 기반합니다.
- 모든 필드는 private final로 선언되어 초기화 후 변경이 불가능합니다.
- setter가 있으면 불변성이 깨지기 때문에 의도적으로 금지되어 있습니다.
✅ record의 장점 요약
장점설명
| 간결함 | boilerplate 제거 – 코드를 짧고 읽기 쉽게 |
| 명확한 목적 | 데이터를 담기 위한 클래스임을 명시 |
| 불변성 보장 | 모든 필드는 final로 설정되어 안전 |
| IDE 지원 강화 | 자동 완성, 리팩토링 등에서 유리 |
| 패턴 매칭과 조합 | sealed, instanceof, switch와 잘 어울림 |
✅ 한계 및 제약
- 상속 불가 (final)
- 모든 필드는 final이어야 함
- 인스턴스 변수 외 추가 필드 불가
- record는 직렬화가 필요하거나 엔티티로 쓰기에는 부적절
'Program Language > Java' 카테고리의 다른 글
| Java21 Virtual Thread(가상쓰레드) - 1 (5) | 2025.07.22 |
|---|---|
| Java sealed class란? (1) | 2025.07.16 |
| Java 12 - Switch Expressions (1) | 2025.07.16 |
| Java10의 var 변수란?(Javascript X) (1) | 2025.07.15 |
| 자바 최신 버전과 1.8 버전의 차이 정리 (4) | 2025.07.15 |