NDM

Java Record 클래스를 알아보자 본문

Java

Java Record 클래스를 알아보자

ndm.jr 2023. 6. 26. 09:06

 

코드 리뷰 도중 record 클래스에 대해 알게되었습니다

 

항상 Java 11버전만 사용해서 몰랐던 내용이므로, 한번 정리하고 넘어가려 합니다

 

코드리뷰는 역시 몰랐던 것을 알게되고, 간과했던 부분을 잡는다는 점에서 매우 효율적인것 같습니다

 


## 개념설명

 

JDK 14에서 preview로 등장했고, JDK16부터 정식 스펙으로 결정되었습니다.

불변 클래스를 쉽게 생성할 수 있도록 도와주는 클래스입니다.

 

public class Person {
    private final String name;
    private final int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}

 

불변 클래스를 만들기 위해 보통 다음과 같이 작성됩니다.

  • 모든 필드는 private final
  • 필드값을 포함한 생성자
  • Getter 메소드
  • 상속 방지를 위해 경우에 따라 클래스 레벨에서 final 사용
  • toString / Equals / HashCode 재정의

이것은 다음과 같은 단점이 있습니다.

  • 대부분의 클래스에서 반복되는 유사 작업
  • 값 객체라는 사실을 모호해지게 만드는 코드들

위 코드를 Record를 사용해 작성하면 이렇게 됩니다

 

public record Person (String name, String address) {}

 

한눈에 [이름, 주소를 갖는 사람]을 나타내는 값 객체라는 것을 알 수 있습니다.

 

더불어 Record를 선언하면 다음과 같은 작업이 수행됩니다.

 

  • Getter 메소드 추가
    • getXXX가 아닌, 필드명()으로 생성
  • 클래스는 final, 모든 필드는 private final
  • 모든 필드를 포함하는 생성자 추가(public)
  • Equals / HashCode / toString 메서드 추가
    • Equals는 모든 필드 값이 일치해야만 True를 반환합니다
    • HashCode는 필드 값중 하나라도 다르다면 다른 해시값을 반환합니다

 

추가적으로 다음과 같은 작업을 수행할 수 있습니다

  • static 변수, 메서드를 가질 수 있습니다
  • 생성자를 별도로 명싱하고 validation을 하는것도 가능합니다

## 내 생각

 

record는 불변 클래스를 만드는데 도움을 줄 수는 있지만 완전한 불변 클래스를 만들 수는 없다고 생각합니다

필드에 Collection이라도 들어오게 된다면 추가적인 작업이 불가피해 보이기 때문입니다

 

또한 [모든 필드를 파라미터로 받는 public한 생성자를 자동으로 생성한다] 라는 점이 @AllArgsConstructor의 단점을 그대로 안고 가게 될 것이라고 생각합니다

 

하지만 간단한 DTO나 값 객체에 한해서 사용한다면 반복되는 코드를 줄일 수 있어 지루한 작업을 피할 수 있을 것이라고 생각합니다


출처

 

https://colevelup.tistory.com/28

 

[Java] Java14 레코드(Record)를 알아보자

Java 8 , 11 버전만 사용하다 보니 이후 버전에 추가된 것들에 대해서 학습을 하려고 합니다. Java 14에서 추가된 레코드(Record)에 대해서 레코드의 목적, 자동생성 항목 등 레코드의 기본 사항에 대해

colevelup.tistory.com

https://scshim.tistory.com/372

 

[Java] 자바의 레코드(Record)

레코드란? ㆍ 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스 ㆍ JDK14에서 preview로 등장하여 JDK16에서 정식 스펙으로 포함 기존의 불변 데이터 객체 public class Person

scshim.tistory.com