[Java] Record

Oz·2025년 3월 12일
0

강의를 보면 Spring JPA를 공부하면서, 강사님이 DTO를 만들 때 Record를 사용하는 것을 봤는데,
너모 초면이신 내용이라 한번 정리하려고 합니다.

Java 14에서 추가된 내용으로, 이전에는 boilerplate field와 메서드가 포함된 클래스를 생성해 객체 간의 변경 불가능한 데이터를 전달했어야 했는데 Record가 등장하면서 그 기능을 대체하게 됨.

Java 16부터 정식 기능으로 포함.(Java 14에서는 Preview)

  • 불변 데이터 객체를 정의하기 위한 클래스 유형!

🐽 Record 특징

1. 불변 객체(Immutable)

record필드 값을 변경할 수 없음.

  • getter()만 가진 객체들은 Record 형태로 변경이 가능할 듯.

2. 자동 생성 메서드

record를 선언하면 자동으로 아래의 메서드들이 생성이 됨.

  • 기본 생성자
  • getter 메서드
  • toString()
  • equals()
  • hashCode()

3. 클래스 선언이 간결해짐.

DTO, VO 클래스 생성 시 사용하면 필수 메서드들을 직접 구현할 필요가 없어 간결해짐.

🐽 Record의 사용 예시

  1. 기존 Java 클래스로 DTO 생성 (POJO 방식)
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;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

  1. record로 DTO 생성
public record Person(String name, int age) {}

getter, toString(), equals(), hashCode() 가 자동으로 생성됨.


🐽 Record의 주요 기능

1. 생성자 추가

record는 기본 생성자가 자동 생성되지만, 직접 추가할 수 있음.

public record Person(String name, int age) {
    public Person {
        if (age < 0) {
            throw new IllegalArgumentException("나이는 0 이상이어야 합니다.");
        }
    }
}
--------------------------------------------------------------------------------
public record GetUserResponseDto(Long id, String name, String profileImage, Integer followingCount, Integer followerCount) {

//record의 경우 this로만 생성자를 선언할 수 있음
public GetUserResponseDto(User user) {
    this(user.getId(), user.getName(), user.getProfileImage(), user.followingCount(),
            user.followerCount());
}

2. 정적 필드, (정적) 메서드 추가

public record Person(String name, int age) {
    public static String country = "대한민국";

    public String greeting() {
        return "안녕하세요, 저는 " + name + "이고, 나이는 " + age + "살입니다.";
    }
    
    public static String getCountry() {
		    return country;
    }
}

단, 인스턴스 변수는 추가할 수 없고, record의 생성자에서 정의한 필드만 가질 수 있음.

🐽 Record 장단점

장점

  1. 코드가 간결해짐.
    • getter/setter, toString(), equals(), hashCode()를 직접 작성할 필요 없음.
  2. 불변 객체(Immutable)
    • 값 변경을 방지하여 안정성을 높임.
  3. JVM 최적화 가능
    • 불변 데이터 객체이므로 JIT 컴파일러가 최적화하기 쉬움.

단점

  1. 값 변경이 불가능
    • 필드 값을 수정할 수 없으므로, mutable한 객체가 필요한 경우에는 적절하지 않음.
  2. 상속 불가능
    • recordextends 키워드를 사용할 수 없음 (다른 클래스를 상속할 수 없음).
  3. 필드 추가 불가능
    • record 내부에서 선언되지 않은 인스턴스 변수를 추가할 수 없음.

언제 사용할까?

DTO, VO 나 DB 결과 등 불변성이 중요하고, 데이터 보관, 전달 역할이 주된 경우 사용이 유용할 것으로 보임.


Java Development Kit Version 17 API Specification

profile
Oreo 맛있다!

0개의 댓글