티스토리 뷰
728x90
반응형
Java 14에서 처음 도입되었으며, 간결하고 불변(immutable)한 데이터 객체를 정의하는 데 사용됩니다.
데이터 클래스를 작성할 때 반복적으로 작성해야 하는 보일러플레이트 코드를 줄이기 위해 설계되었습니다.
1. 간단한 선언
- record 키워드를 사용하여 클래스를 선언하며, 기본적으로 불변 객체를 생성합니다.
- 예를 들어, 아래의 record는 equals(), hashCode(), toString(), 그리고 불변 필드에 대한 getter 메서드를 자동으로 생성합니다.
public record Point(int x, int y) {}
2. 자동 생성된 메서드
- Constructor: 모든 필드를 초기화하는 생성자가 자동으로 생성됩니다.
- Getter 메서드: 각 필드에 대해 자동으로 getter 메서드가 생성되며, 메서드 이름은 필드 이름과 동일합니다.
- toString(): 클래스명과 필드 값을 포함하는 포맷으로 자동 생성됩니다.
- equals(): 모든 필드 값을 기반으로 비교하는 메서드가 생성됩니다.
- hashCode(): 모든 필드 값을 기반으로 해시 값을 생성합니다.
3. 불변성
- 모든 필드는 기본적으로 final로 선언됩니다.
- 값을 변경할 수 없는 불변 객체입니다.
4. Compact 생성자 지원
- 선언된 필드에 대해 추가적인 유효성 검사를 수행하거나 특정 로직을 추가할 수 있습니다.
public record Point(int x, int y) {
public Point {
if (x < 0 || y < 0) {
throw new IllegalArgumentException("Coordinates must be positive.");
}
}
}
5. Custom 메서드
- record도 일반 클래스처럼 메서드를 정의할 수 있습니다.
public record Point(int x, int y) {
public double distanceFromOrigin() {
return Math.sqrt(x * x + y * y);
}
}
제한 사항
- 상속 불가능
- record는 자동으로 final로 선언되므로 상속할 수 없습니다.
- record 자체도 다른 클래스를 상속받을 수 없습니다(다만 인터페이스는 구현 가능).
- 모든 필드는 필수적
- record의 필드는 반드시 생성자에서 초기화되어야 하며, 디폴트 값이 없습니다.
- Mutable 필드 불가
- 필드가 불변이므로, 값을 변경해야 하는 경우 record는 적합하지 않습니다.
실제 활용 사례
DTO (Data Transfer Object)
public class Main {
public static void main(String[] args) {
Point p = new Point(3, 4);
System.out.println(p); // Point[x=3, y=4]
System.out.println(p.x()); // 3 (getter 메서드)
System.out.println(p.y()); // 4
}
}
public record Point(int x, int y) {}
Key-Value Pairs
public record Pair<K, V>(K key, V value) {}
728x90
반응형
'Java' 카테고리의 다른 글
[Java] JSON Jackson @JsonProperty (0) | 2025.02.24 |
---|---|
[Java] OpenCSV (0) | 2025.01.26 |
[Java] Lombok @UtilityClass (0) | 2025.01.12 |
[Java] Junit Parameterized Test (0) | 2024.12.04 |
[Java] 비트 연산 (0) | 2024.10.13 |
반응형
300x250