자바 14에 도입된 record는 데이터 전달 객체(DTO)나 값 객체를 간결하게 표현하기 위한 새로운 클래스 유형입니다. record는 코드의 양을 줄이고 가독성을 높여 개발 생산성을 향상시키는 데 기여합니다.
1. Record 기초
1.1 정의 및 특징
- 선언: record 키워드를 사용하여 선언하며, 괄호 안에 구성 요소(component)를 정의합니다.
- 자동 생성: record는 다음과 같은 메서드를 자동으로 생성합니다.
- 정규 생성자 (Canonical Constructor):
- 모든 구성 요소를 매개변수로 받는 생성자.
- 접근자 (Accessor Method):
- 각 구성 요소에 대한 접근자 메서드 (getter와 유사하지만 getX() 대신 x() 형식).
- equals() 및 hashCode():
- 필드 값을 기반으로 객체의 동등성 비교.
- toString():
- 객체의 상태를 문자열로 표현.
- 정규 생성자 (Canonical Constructor):
- 불변성: record의 구성 요소는 기본적으로 final이며, 값 변경이 불가능한 불변 객체를 생성합니다.
- 상속 제한: record는 다른 클래스를 상속할 수 없으며, 다른 클래스로부터 상속받을 수도 없습니다.
- 인터페이스 구현 가능: record는 implements를 사용하여 인터페이스를 구현할 수 있습니다.
1.2 사용 예시
record Point(int x, int y) {}
public class Main {
public static void main(String[] args) {
Point p1 = new Point(10, 20);
Point p2 = new Point(10, 20);
System.out.println(p1.x()); // 접근자 사용
System.out.println(p1.equals(p2)); // equals() 메서드 사용
System.out.println(p1); // toString() 메서드 사용
}
}
2. Record 분석
2.1 장점
- 코드 간결성: 보일러플레이트 코드 감소로 개발 생산성 향상.
- 가독성 향상: 데이터 구조를 명확하게 표현하여 코드 이해도를 높임.
- 불변성 보장: 스레드 안전성이 증가하고, 부작용(side effect)을 방지.
- 데이터 모델링 용이: 데이터 중심 프로그래밍에서 유용함.
2.2 단점 및 주의사항
- 불변성 제한: 객체 상태 변경이 필요한 경우 record를 사용할 수 없음.
- 상속 불가: 기존 클래스를 확장해야 하는 경우 record 사용이 제한됨.
- 역직렬화 문제: Jackson 라이브러리 사용 시 jackson-module-parameter-names 모듈 추가 필요.
- 로컬 레코드(Local Record): 메서드 내부에서 record를 정의할 수 있지만, 가독성과 유지보수성이 저하될 수 있음.
3. Record 심화
3.1 정규 생성자 (Canonical Constructor)
- record는 자동으로 정규 생성자를 생성하지만, 필요에 따라 직접 정의할 수 있음.
- 정규 생성자 내부에서 데이터 유효성 검사나 추가적인 초기화 작업을 수행 가능.
record Point(int x, int y) {
public Point { // 정규 생성자
if (x < 0 || y < 0) {
throw new IllegalArgumentException("좌표는 음수일 수 없습니다.");
}
}
}
3.2 압축 생성자 (Compact Constructor)
- 정규 생성자에서 필드 값을 직접 할당하는 부분을 생략하고, 필요한 로직만 구현 가능.
- ⚠️ 단, record의 필드는 final이므로 값을 변경할 수 없음.
record Point(int x, int y) {
public Point { // 압축 생성자
x = Math.max(x, 0);
y = Math.max(y, 0);
}
}
3.3 인스턴스 메서드 및 정적 메서드
- record 본문에 인스턴스 메서드나 정적 메서드를 추가할 수 있음.
record Point(int x, int y) {
public int distance(Point other) {
return (int) Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2));
}
public static Point origin() {
return new Point(0, 0);
}
}
3.4 제네릭 Record
- record는 제네릭 타입을 사용할 수 있음.
record Pair<T, U>(T first, U second) {}
4. Record 활용
- DTO (Data Transfer Object): API 요청 및 응답 데이터를 표현.
- 값 객체 (Value Object): 불변 데이터 모델링.
- 데이터 구조 표현: 복잡한 데이터 구조를 간결하게 표현 가능.
5. 추가 학습 자료
- Oracle Java Documentation - Records:
https://docs.oracle.com/en/java/javase/17/language/records.html - Baeldung - Introduction to Java 14 Records:
https://www.baeldung.com/java-14-records
🔹 마무리
record는 자바 개발자가 데이터 중심 프로그래밍을 더욱 효율적으로 수행할 수 있도록 지원하는 강력한 기능입니다. 다양한 활용 사례를 통해 record의 장점을 경험해 보세요!
'Programming Language > Java' 카테고리의 다른 글
| Jackson 라이브러리 (0) | 2025.03.05 |
|---|---|
| 동시성 (Concurrency) (0) | 2025.03.05 |
| Exception handling (0) | 2025.03.05 |
| Optional (예제 주의) (0) | 2025.03.05 |
| Stream 심화 (0) | 2025.03.05 |
