ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] record 예약어
    Java 2025. 2. 13. 21:51

    record 예약어

    자바 14에서 처음 도입되고, 자바 16에서 정식 기능으로 추가된 예약어로, 불변 데이터 객체(immutable data objects)를 간편하게 선언할 수 있도록 지원하는 기능이다.

     

    record의 특징

    1. 자동으로 필드, 생성자(모든 필드 포함), Getter, equals(), hashCode(), toString() 제공

    2. record의 필드는 상수 (final)

    3. 일반적인 POJO 클래스와 비교했을 때 코드가 훨씬 간결함

    4. Serializable을 구현하여 직렬화 가능

    5. 상속 불가능

     


    record 사용 예제

    public record User(String name, int age) {}
    public class RecordExample {
        public static void main(String[] args) {
            User kim = new User("kim", 20);
            User lee = new User("lee", 25);
    
            System.out.println("lee = " + lee);               // lee = User[name=lee, age=25]
            System.out.println("lee.name() = " + lee.name()); // lee.name() = lee
            System.out.println("lee.age() = " + lee.age());   // lee.age() = 25
    
            System.out.println(kim.equals(new User("kim", 20)));        // true
            System.out.println("kim.equals(lee) = " + kim.equals(lee)); // kim.equals(lee) = false
        }
    }

     

    위 record를 일반 클래스로 나타내면 아래와 같다. 이 코드를 record를 사용하면 단 한 줄로 바꿀 수 있다.

    @Getter
    @EqualsAndHashCode
    @ToString(of = {"name", "age"})
    @AllArgsConstructor
    public class User {
        private final String name;
        private final int age;
    }

     

    record에 컴팩트 생성자와 일반 메서드도 선언 가능하다.

    public record User(String name, int age) {
    
        // Compact constructor
        public User {
            if (age < 0) {
                throw new IllegalArgumentException("Age cannot be negative!");
            }
        }
    
        public String greeting() {
            return "Hello, my name is " + name + " and I am " + age + " years old.";
        }
    }

    이처럼 record를 사용하면 불변 객체를 정말 간편하게 정의할 수 있다. record는 주로 DTO, 불변 객체, 단순 데이터 저장용 클래스를 만들 때 사용된다. 하지만 record는 불변 객체이므로 필드 값을 변경해야 하는 경우에는 적합하지 않다. 또한, 상속을 지원하지 않으므로, 클래스를 확장해야 하는 경우에는 일반 클래스를 사용해야 한다.

    'Java' 카테고리의 다른 글

    [Java] 생산자-소비자 문제  (0) 2025.04.08
    [Java] volatile 예약어  (1) 2025.02.18
    [Java] 리플렉션(Reflection)에 대해서  (1) 2025.01.17
    [Java] I/O 정리  (1) 2024.11.09
    [Java] Charset과 문자 인코딩  (0) 2024.11.08