record란
2020년 초에 Java 14 버전에서 프리뷰 기능으로 제공되어
Java 16 버전에서 정식 스펙으로 채택된 새로운 클래스 타입이다
데이터 중심의 클래스를 정의하기 위한 간결한 방법으로 주요 특징은 다음과 같다
- 간결한 데이터 클래스 정의
- 자동으로 메서드 생성 (toString(), equals(), hashCode(), getter)
- 불변성 보장
- 생성자 및 검증 로직 추가 가능
- 추가 메서드 정의 가능
record는 DTO, 불변 데이터 모델, 값 객체 등을 만들 때 유용하게 사용할 수 있다
예제 코드를 살펴보자
// 소괄호 안에 필드 변수를 정의하며 자동으로 private final로 선언
public record Student(
String name,
int age,
String major,
double gpa
) {}
기본 구조는 위와 같다
추가적으로 컴팩트 생성자를 통한 추가적인 검증이나 정규화를 수행할 수 있으며
추가 메서드를 정의할 수 있다 (값 변경은 불가능)
적용 코드
public record Student(
String name,
int age,
String major,
double gpa
) {
// 컴팩트 생성자 (선택적)
public Student {
if (age < 0) {
throw new IllegalArgumentException("나이는 음수일 수 없습니다.");
}
// 이름의 앞뒤 공백 제거
name = name.trim();
}
// 추가 메서드 정의
public boolean isHonorStudent() {
return gpa >= 4.0;
}
}
다음으로 정의한 레코드를 사용하는 예시를 살펴보자
public class StudentManagementSystem {
public static void main(String[] args) {
// 레코드 인스턴스 생성
Student student1 = new Student("김철수", 22, "컴퓨터 과학", 4.5);
Student student2 = new Student("이영희", 21, "경영학", 3.8);
// 레코드의 자동 생성된 메서드 사용
System.out.println("학생 이름: " + student1.name());
System.out.println("전공: " + student1.major());
// 커스텀 메서드 사용
System.out.println("최우등생인가요? " + student1.isHonorStudent());
// toString() 메서드 (자동 생성)
System.out.println(student1);
// equals() 메서드 (자동 생성)
Student sameStudent = new Student("김철수", 22, "컴퓨터 과학", 4.5);
System.out.println("두 학생은 같은가? " + student1.equals(sameStudent));
}
}
위와 같이 사용할 수 있는데
POJO의 경우 필드 이름이 name이라면 getName()으로 메서드를 정의하여 호출하지만
레코드의 경우는 필드 이름을 그대로 메서드 명으로 사용하여 것을 볼 수 있는데 이유는 다음과 같다고 한다
- 간결성
- 필드 이름을 그대로 사용함으로써 코드가 더 간결해지고 가독성이 향상된다
- 직관성
- 필드 이름과 getter 메서드 이름이 일치하여 더 직관적인 API를 제공한다
- 불변성 강조
- Record는 불변 데이터 객체를 위한 것이므로 get 접두사 없이 필드 이름을 사용하는 것이 이러한 특성을 잘 반영한다
- 함수형 프로그래밍 스타일
- 필드 이름을 그대로 사용하는 방식이 함수형 프로그래밍 패러다임과 더 잘 어울린다
자세한 내용은 https://openjdk.org/jeps/395 문서를 참고해보자
'Java' 카테고리의 다른 글
JDBC란 (0) | 2025.01.01 |
---|---|
직렬화(Serialization) (2) | 2024.12.01 |
고유 락 (Intrinsic Lock) (1) | 2024.11.29 |
Java에서의 Thread (0) | 2024.11.28 |
JVM stack & heap (1) | 2024.09.26 |