IT/Java

[Java] record 클래스에 대하여

_이준호_ 2024. 4. 15. 18:04

자바 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 를 사용하는것이 더 편리하다.