Java 16에 도입된 record 클래스의 개념과 사용법, 그리고 장점을 알아봅니다. 데이터 전달 객체(DTO)를 더 간결하게 만드는 방법을 살펴봅니다.
Java에서 불변 데이터 객체(DTO, Data Transfer Object)를 만들 때, 우리는 보통 다음과 같은 과정을 거치게 됩니다.
private final로 불변 필드를 선언합니다.equals()와 hashCode() 메서드 오버라이딩: 객체의 동등성 비교를 위해 필요합니다.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 키워드를 사용하여 정의합니다. 괄호 안에 필드를 선언하면, 컴파일러가 자동으로 생성자, getter 메서드, equals(), hashCode(), toString() 메서드를 생성해줍니다.
java // record 클래스 정의 public record Point(int x, int y) {}
보시다시피, 기존 방식에 비해 코드가 훨씬 간결해졌죠? Point record 클래스는 x와 y라는 두 개의 int 필드를 가지며, 이 필드들은 자동으로 final로 선언됩니다.
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]
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 생성자는 width와 height가 0보다 큰지 검사하고, 그렇지 않으면 IllegalArgumentException을 발생시킵니다.
Java record 클래스는 데이터 전달 객체를 더욱 간결하고 안전하게 만들 수 있는 강력한 도구입니다. 불변성을 기본으로 제공하며, 자동 생성되는 메서드를 통해 개발 생산성을 향상시킬 수 있습니다. 앞으로 Java 개발에서 record 클래스를 적극적으로 활용해 보세요.
저는 개인적으로 record 클래스를 사용하면서 DTO를 만들 때 코드가 훨씬 깔끔해지고 유지보수도 쉬워진다는 느낌을 받았어요. 특히 equals(), hashCode(), toString() 메서드를 직접 구현하지 않아도 된다는 점이 정말 편리하더라고요. 여러분도 한번 사용해 보시면 분명 만족하실 거라고 생각합니다.
| Java 예외 처리 베스트 프랙티스 (0) | 2026.02.23 |
|---|---|
| Java sealed class 정리 (0) | 2026.02.23 |
| Java 컬렉션 프레임워크 비교 (0) | 2026.02.22 |
| Java 멀티스레드 동기화 (0) | 2026.02.22 |
| Java 제네릭 완벽 가이드 (0) | 2026.02.22 |