[Java] Java 레코드(record)

아몬드봉봉·2024년 2월 12일
0

Java

목록 보기
16/17

Record

record는 불변 데이터를 객체 간에 전달하는 작업을 간단하게 만든다. Java 14부터 도입되어 16 버전에서 정식으로 채택된 클래스이다. record Type을 사용하면 불필요한 코드를 제거할 수 있고, 적은 코드로도 명확한 의도를 표현할 수 있다.

특징

  • 맴버변수는 private final로 선언된다.
  • equals, hashCode, toString, getter를 자동으로 생성한다.
  • 다른 클래스로 상속 받을 수 없지만 인터페이스로 구현이 가능하다.
  • 불변 객체로 abstract로 선언할 수 없으며 암시적으로 final로 선언된다.
  • 모든 필드를 매개변수로 사용하는 생성자를 자동으로 생성한다.

코드예제

DTO

public class UserDto {
    private String userName;
    private String userPhoneNumber;
    
    public UserDto(String userName, String userPhoneNumber) {
    	this.userName = userName;
        this.userPhoneNumber = userPhoneNumber;
    }
    
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPhoneNumber() {
        return userPhoneNumber;
    }

    public void setUserPhoneNumber(String userPhoneNumber) {
        this.userPhoneNumber = userPhoneNumber;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserDto userDto = (UserDto) o;
        return Objects.equals(userName, userDto.userName) && 
        		Objects.equals(userPhoneNumber, userDto.userPhoneNumber);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userName, userPhoneNumber);
    }
    
    @Override
    public String toString() {
        return "UserDto{" +
                "userName='" + userName + '\'' +
                ", userPhoneNumber='" + userPhoneNumber + '\'' +
                '}';
    }
}

유저 정보를 가지는 Dto 입니다. 이름과 전화번호만 사용하는데 보일러 플레이트 코드가 많은 것을 볼 수 있다.

보일러 플레이트 코드
최소한의 변경으로 여러 곳에서 재사용 되면 반복적으로 비슷한 형태를 가지고 있는 코드
(getter, setter, equals, hashCode,toString

record
public record UserRecordDto(String userName, String userPhoneNumber) { }

UserDto 코드와 비교하면 많은 것들이 사라진 것을 볼 수 있다.
Record의 구조는 recorde (header) {body}의 구조로 되어있다. 컴파일러는 헤더를 통해 String type의 userName, userPhoneNumber 이 있다는 것을 인식 후 코드에 명시적으로 접근제어자, constructor, getter, hashCode, toString, equals의 구현을 자동으로 제공한다.

DTO Test
public class DtoTest {

    public static void main(String[] args) {
        UserDto userDto = new UserDto();
        userDto.setUserName("aaaa");
        userDto.setUserPhoneNumber("00000000");

        System.out.println(
                userDto.getUserName() + userDto.getUserPhoneNumber()
        );
        
        UserRecordDto userRecordDto = new UserRecordDto("bbbb", "1111111");

        System.out.println(
                userRecordDto.userName() + userRecordDto.userPhoneNumber()
        );
        
    }
}

또한 record를 사용하게 되면 getUserName(), getUserPhoneNumber() 을 사용하는 것이 아닌 userName(), userPhoneNumber() 만 사용하는 것을 볼 수 있다.

FastCampus 강의를 보다가 강의 내용에 record를 사용하는 것을 보고 실무에서 Java 16 버전 이상을 사용한다면 적용해보고 싶어서 간략하게 정리를 해봤습니다.


출처

Oracle Java Record
openjdk
https://s7won.tistory.com/2
https://coding-start.tistory.com/355
https://devhooney.tistory.com/203
https://velog.io/@power0080/java%EC%9E%90%EB%B0%94-record%EB%A5%BC-entity%EB%A1%9C

profile
성장을 즐기는 백엔드 자바 개발자

0개의 댓글

관련 채용 정보