개발/Java

Java record 클래스 사용법

hanks 2026. 2. 22. 18:16

Java 16에 도입된 record 클래스의 개념과 사용법, 그리고 장점을 알아봅니다. 데이터 전달 객체(DTO)를 더 간결하게 만드는 방법을 살펴봅니다.

왜 필요한가?

① 불변 데이터 객체의 번거로움

Java에서 불변 데이터 객체(DTO, Data Transfer Object)를 만들 때, 우리는 보통 다음과 같은 과정을 거치게 됩니다.

  1. 필드 선언: private final로 불변 필드를 선언합니다.
  2. 생성자: 필드를 초기화하는 생성자를 만듭니다.
  3. Getter 메서드: 각 필드에 대한 getter 메서드를 제공합니다.
  4. equals()hashCode() 메서드 오버라이딩: 객체의 동등성 비교를 위해 필요합니다.
  5. toString() 메서드 오버라이딩: 객체의 내용을 보기 좋게 출력하기 위해 필요합니다.

이 과정은 상당히 반복적이고 번거롭습니다. 특히 필드가 많아질수록 코드는 더욱 길어지고 가독성이 떨어지게 되죠.

java // 기존 방식의 불변 데이터 객체 public class Point { private final int x; private final int y;

public Point(int x, int y) {
    this.x = x;
    this.y = y;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Point point = (Point) o;
    return x == point.x && y == point.y;
}

@Override
public int hashCode() {
    return Objects.hash(x, y);
}

@Override
public String toString() {
    return "Point{" +
            "x=" + x +
            ", y=" + y +
            '}';
}

}


핵심 개념

항목 설명
Record 클래스 Java 16에 도입된 새로운 종류의 클래스입니다. 데이터 홀더(Data Holder) 역할을 수행하며, 불변성을 기본으로 제공합니다.
Compact 생성자 생성자 본문이 없는 간결한 형태의 생성자입니다. 필드에 대한 유효성 검증 로직 등을 추가할 때 유용합니다.
표준 메서드 자동 생성 equals(), hashCode(), toString() 메서드가 자동으로 생성됩니다. 개발자가 직접 구현할 필요가 없어 코드 양을 줄여줍니다.
불변성 Record 클래스의 필드는 final로 선언되며, 생성자를 통해 초기화된 후에는 값을 변경할 수 없습니다.

단계별 사용법

① Record 클래스 정의

Record 클래스는 record 키워드를 사용하여 정의합니다. 괄호 안에 필드를 선언하면, 컴파일러가 자동으로 생성자, getter 메서드, equals(), hashCode(), toString() 메서드를 생성해줍니다.

java // record 클래스 정의 public record Point(int x, int y) {}

보시다시피, 기존 방식에 비해 코드가 훨씬 간결해졌죠? Point record 클래스는 xy라는 두 개의 int 필드를 가지며, 이 필드들은 자동으로 final로 선언됩니다.

② Record 클래스 사용

Record 클래스는 일반 클래스와 거의 동일하게 사용할 수 있습니다. 객체를 생성하고, getter 메서드를 통해 필드에 접근할 수 있습니다.

java // record 클래스 사용 예시 public class Main { public static void main(String[] args) { Point p = new Point(10, 20); System.out.println("x = " + p.x()); // getter 메서드 호출 System.out.println("y = " + p.y()); System.out.println(p); // toString() 메서드 자동 생성 } }

위 코드의 실행 결과는 다음과 같습니다.

x = 10 y = 20 Point[x=10, y=20]

③ Compact 생성자 활용

Record 클래스는 Compact 생성자라는 특별한 형태의 생성자를 지원합니다. Compact 생성자는 생성자 본문이 없으며, 필드에 대한 유효성 검증 로직 등을 추가할 때 유용합니다.

java public record Rectangle(int width, int height) { public Rectangle { // Compact 생성자 if (width <= 0) { throw new IllegalArgumentException("width는 0보다 커야 합니다."); } if (height <= 0) { throw new IllegalArgumentException("height는 0보다 커야 합니다."); } } }

위 예제에서 Compact 생성자는 widthheight가 0보다 큰지 검사하고, 그렇지 않으면 IllegalArgumentException을 발생시킵니다.


장점 및 활용 사례

  • 코드 간결성: 불필요한 코드를 줄여 가독성을 높입니다.
  • 불변성 보장: 데이터의 안정성을 높입니다.
  • DTO, VO (Value Object) 구현: 데이터를 담는 객체를 간편하게 만들 수 있습니다.
  • 함수형 프로그래밍: 불변 데이터 구조를 활용한 함수형 프로그래밍에 유용합니다.

마무리

Java record 클래스는 데이터 전달 객체를 더욱 간결하고 안전하게 만들 수 있는 강력한 도구입니다. 불변성을 기본으로 제공하며, 자동 생성되는 메서드를 통해 개발 생산성을 향상시킬 수 있습니다. 앞으로 Java 개발에서 record 클래스를 적극적으로 활용해 보세요.

저는 개인적으로 record 클래스를 사용하면서 DTO를 만들 때 코드가 훨씬 깔끔해지고 유지보수도 쉬워진다는 느낌을 받았어요. 특히 equals(), hashCode(), toString() 메서드를 직접 구현하지 않아도 된다는 점이 정말 편리하더라고요. 여러분도 한번 사용해 보시면 분명 만족하실 거라고 생각합니다.