1.레코드 클래스란?
자바 14에서 도입된 클래스이고,데이터 캐리어 클래스(즉, 단순히 데이터를 포함하고 POJO(Plain Old Java Objects) 및 DTO(Data)라고도 알려진 모듈 간에 데이터를 전달하는 것이 목적인 클래스)를 생성하는 빠른 방법으로 사용하려는 의도이고 자바 컴파일러로 인해 자동으로 필드들을 불변객체, getter, hashCode(), equals() ,toString(), public constructor를 자동으로 생성해준다.
그리고 Jackson을 이용해 레코드 클래스를 json으로,json을 레코드 클래스로 변환 가능하다
예시 코드
빌더를 이용한 예시
@Builder
public record CartGameDTO(
Long gameId,
String gameName,
int gamePrice,
Integer orderCount,
Integer eachGameTotalPrice) {
public static CartGameDTO of(Game game, int orderCount){
return CartGameDTO.builder()
.gameId(game.getGameId())
.gameName(game.getGameName())
.gamePrice(game.getGamePrice())
.orderCount(orderCount)
.eachGameTotalPrice(game.getGamePrice() * orderCount)
.build();
}
}
1.기존 일반 클래스에서는 gameName에 대하 getter를 사용할때 getGameName()했는데 레코드에서는 바로 gameName()으로 한다.
2. 지금 예시는 빌더를 이용해서 했지만 생성자를 이용해서 할 수 있다.
2.레코드 클래스는 상속 불가
그리고 레코드 클래스는 다른 클래스 상속 받을 수 없지만 이를 다른 수단으로 할 수 있는 방법 있다.
(상속은 어떤 기능을 재사용,코드 중복 해결 하기 위한 것)
1. 레코드 클래스를 인터페이스로 만들고 인터페이스 메소드 구현후 코드 재사용을 높일 수 있다.
2. 컴포지션( 한 클래스가 다른 클래스를 포함하여 그 기능을 이용하는 것)을 이용하여 코드 재사용을 할 수 있다.
공식 문서 내용 번역
" 위의 제한 외에도 레코드는 일반 클래스처럼 작동합니다. 레코드는 최상위 수준으로 선언되거나 중첩될 수 있으며 일반 클래스일 수 있습니다. 인터페이스를 구현할 수 있으며 새 키워드를 통해 인스턴스화됩니다. 레코드 본문은 정적 메서드, 정적 필드, 정적 초기화 프로그램, 생성자, 인스턴스 메서드 및 중첩 유형을 선언할 수 있습니다. 기록과 상태 설명의 개별 구성요소에 주석을 달 수 있습니다. 레코드가 중첩된 경우 암시적으로 정적입니다. 이렇게 하면 레코드에 상태를 자동으로 추가하는 즉시 포함되는 인스턴스가 방지됩니다."
3. 제네릭 이용
record Container<T>(int id, T value) {}
Container<Integer> intContainer = new Container<>(1, 1);
Container<String> stringContainer = new Container<>(1, "1");
Integer intValue = intContainer.value();
String strValue = stringContainer.value();
4. 레코드 클래스 리플렉션?
일단 리플렉션이란
런타임중 레코드의 해당 타입을 알 수 없는데 접근하는 방법인 리플렉션이 가능하다
getRecordComponents()를 이용하면 된다
gpt의 답변
코드 예시
record Container<T>(int id, T value) {}
Container<Integer> intContainer = new Container<>(1, 1);
Class<?> containerCheck = intContainer.getClass();
System.out.println(Arrays.toString(containerCheck .getRecordComponents()));