티스토리 뷰

Java

[Java] record

snail voyager 2025. 1. 12. 17:38
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);
    }
}

제한 사항

  1. 상속 불가능
    • record는 자동으로 final로 선언되므로 상속할 수 없습니다.
    • record 자체도 다른 클래스를 상속받을 수 없습니다(다만 인터페이스는 구현 가능).
  2. 모든 필드는 필수적
    • record의 필드는 반드시 생성자에서 초기화되어야 하며, 디폴트 값이 없습니다.
  3. 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