자바 14에서 Preview 형태로 나와 자바 16부터 정식 지원하는 record 타입 클래스가 있다. 불변 객체를 위한 클래스라고도 한다. 왜냐하면 모든 필드가 final 로 정의되기 때문이다.
사용법
public record Person(
String name,
int age,
String gender
) {
}
Person person = new Person("이준호", 99, "M");
System.out.prinln(person.name()); // 이준호
- 소괄호 안에 필드를 정의한다.
- 클래스내 구현 내용이 있든 없든 중괄호가 무조건 있어야 한다.
- 클래스 필드에 접근 할 경우 get{필드명} 이 아닌 {필드명} 만을 사용한다. ex) person.name()
특징
- 모든 필드는 final 로 선언된다.
- All Arguments Constructor 가 정의되어 있다.
- toString, equals, hashCode 가 정의되어 있다.
- 상속이 불가능하다. 부모 클래스를 상속 받거나, 자식 클래스를 가질 수 없다.
- 컴팩트 생성자
public record CompactRecord(String name) {
// 컴팩트 생성자
public CompactRecord {
// name이 null이거나 빈 문자열인 경우 예외 발생
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("name must not be null or empty");
}
}
}
컴팩트 생성자의 경우 All Arguments Constructor 를 통해 final 필드가 정의되기 이전에 실행되며 이곳에서 전처리가 가능하다.
활용
DTO
@Builder
public record CreatePersonRequestDto(
@NotBlank
String name,
@NotBlank
Integer age,
@NotBlank
String gender
) {
}
디폴트로 All Arguments Constructor 가 생성되기 때문에 필드가 추가 및 수정 또는 순서가 바뀔 것을 예상하면 Builder 를 사용하는것이 더 편리하다.