-
레코드
레코드는 불변 POJO와 동일한 기능을 가지고 있다.
명목상 튜플과 같이 이름으로 데이터 컴포넌트에 접근하는 단순한 데이터 집계 타입을 정의하는 방법이다.
가령 아래의 코드는 POJO로, 간단한 정보를 담고있다.
Getter와 Setter등이 있는 final 클래스이다.
@Getter @Setter @AllArgsConstructor public final class USER{ private String name; private bookean active; private LocalDateTime lastLogin; }
아래는 위의 POJO를 "불변"으로 만든 클래스이다.
보듯이 Setter가 없고 오로지 Getter만이 존재한다.
@Getter @AllArgsConstructor public final class USER{ private final String name; private final bookean active; private final LocalDateTime lastLogin; }
하지만 위의 코드는 롬복을 사용하였을때의 이야기이고, 사용하지 않는다면 Set과 Get에 대한 모든 설정을 진행해야 한다.
이런 귀찮음을 피하기 위해 Record가 존재하다.
레코드는 기본적으로 불변 POJO와 동일하게 동작한다.
더 적은양의 코드로, 롬복없이, 많은일의 처리가 가능하다.
public record User(String name, boolean active, LocalDateTime lastLogin){ }
레코드는 다른 클래스 및 열거형(enum)과 구분하기 위해 새로운 키워드인 record를 사용한다.
데이터 컴포넌트는 레코드의 이름 바로 아래에 생성자나 메소드 인수처럼 선언할 수 있다.
레코드의 일반적인 구문은 크게 두가지로, 첫번째는 다른 유형과 동일한 속성을 정이하는 헤더(Header)이며, 두번째는 생성자와 메서드를 지원하기 위한 바디(Body)이다.
헤더는 클래스나 인터페이스의 헤더와 유사하며 가시성, record 키워드, 이름, 제네릭 타입, 데이터 컴포넌트, 바디로 나뉘어진다.
레코드는 특별히 보장된 속성들과 명확하게 정의된 동작 등을 제공하는데, 이로 인해 반복적인 보일러플레이트를 줄일 수 있다. (컴포넌트 접근자, 세 가지 종류의 생성자, 객체 식별 및 설명 메서드)
모든 레코드 컴포넌트는 private 필드로 저장되며 레코드 내부에서는 필드에 직접적으로 접근할 수 있다.
그러나 외부에서는 public 접근자 메서드를 통해서만 가능하다. 이 접근자 메서드의 이름은 일반적인 Getter의 접두사인 get 없이 해당 컴포넌트의 이름과 일치한다.
public record User(String name, boolean active){} var user = new User("test",true); //아래에 getName이 아닌 name인 것을 확인할 수 있다. var username = user.name();
또 Body를 사용하면 Null 검사라던가 LowerCase또한 가능하다.
아래는 해당 코드이다
public record User(String name, boolean active){ public User{ Objects.requireNonNull(name); Objects.requireNonNull(active); name = name.toLowerCase(); } }
괄호를 포함한 모든 인수를 생략하기에 어색할 수 있으나, 이렇게 하면 인수가 없는 생성자와 명확한 구분이 가능하다.
'Devloper > 자바JAVA' 카테고리의 다른 글
자바 - 람다(Lambda) 문법 & 메서드 참조(::) (0) 2025.01.31 자바 - 스트림(Stream) (0) 2025.01.23 자바 - 함수형 인터페이스 (0) 2025.01.21 댓글