이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다.
레코드(record)
데이터 전달을 위한 DTO(Data Transfer Object)를 작성할 때 반복적으로 사용되는 코드를 줄이기 위함
Java 14부터 레코드가 도입되었다.
필드는 읽기만 가능하도록 private final로 선언됨
필드가 읽기만 가능하므로 setter가 없고, getter 이름이 단순히 필드 이름이다.
동등 비교를 위해 hashCode()와 equals() 메소드가 재정의 되어있다.
toString()메소드가 재정의 된다.
public record Member(String id, String name, int age) {
}
이렇게 단순하게 클래스명 앞에 recode 만 붙이고 뒤에 사용할 필드들을 나열한다.
그러면 자동으로 각 필드와 getter가 생성되고 hashCode(), equals(), toString() 메소드가 자동으로 오버라이딩되어 생성된다.
Main.java
public class Main {
public static void main(String[] args) {
Member m = new Member("winter", "눈송이", 25);
System.out.println(m.id());
System.out.println(m.name());
System.out.println(m.age());
System.out.println(m.toString());
System.out.println();
Member m1 = new Member("winter", "눈송이", 25);
Member m2 = new Member("winter", "눈송이", 25);
System.out.println("m1.hashCode(): " + m1.hashCode());
System.out.println("m2.hashCode(): " + m2.hashCode());
System.out.println("m1.equals(m2): " + m1.equals(m2) );
}
}
/*
winter
눈송이
25
Member[id=winter, name=눈송이, age=25]
m1.hashCode(): 306065155
m2.hashCode(): 306065155
m1.equals(m2): true
*/
롬복(lombok)
롬복은 JDK에 포함된 표준 라이브러리는 아니지만 개발자들이 즐겨 쓰는 자동 코드 생성라이브러리이다.
롬복은 레코드와 비슷하지만 더욱 편리한 기능을 제공한다.
레코드와 큰 차이점은 필드가 final이 아니며, 값을 읽는 getter와 setter의 이름이 각 getXxx(또는 isXxx), setXxx로 생성된다.
import lombok.Data;
@Data
public class Member {
private String id;
private String name;
private int age;
}
@Data @RequiredArgsConstructor, @Getter, @Setter, @EqualsAndHashCode, @ToString 애노테이션들이 합쳐진 것과 동일한 효과를 낸다.
아웃라인에 자동으로 메소드들이 선언되어 있는 것을 볼 수 있다.
@Data 외에도 아래와 같은 어노테이션을 사용할 수 있다.
tip @Data에 포함되어 있는 @RequiredArgsConstructor는 기본적으로 매개변수가 없는 생성자를 포함시키지만, final 또는 @NonNull이 붙은 필드가 있다면 이 필드만 초기화시키는 생성자를 포함시킨다. final과 @NonNull의 차이점은 초기화된 final 필드는 변경할 수 없지만(setter가 만들어지지 않음), @NonNull은 null이 아닌 다른 값으로 setter를 통해 변경할 수 있다는 것이다.