본문 바로가기
Program Language/Java

Java record란?

by 준짱IT 2025. 7. 16.

record는 자바 14 프리뷰로 추가되었고, 이 후 16버전에서 정식으로 적용이 되었다.

🎯 record 클래스의 등장 배경

🧱 1. Boilerplate 코드 문제

Java는 객체지향 언어로서, 클래스 구조가 엄격하고 명확하지만 그만큼 반복적인 코드(boilerplate) 가 많다.
단순히 데이터를 담기 위한 VO/DTO 클래스조차 다음을 반복적으로 작성해야 했고,

  • private final 필드 선언
  • 생성자
  • getter
  • equals(), hashCode()
  • toString()

➡ 실질적인 로직 없이 코드만 많아지는 문제가 생겼다.

 

(record 등장 전 기존에 사용하던 예시코드)

public class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) { ... }
    public String getName() { ... }
    public int getAge() { ... }
    @Override public String toString() { ... }
    @Override public boolean equals(Object o) { ... }
    @Override public int hashCode() { ... }
}

이러한 단순 데이터 클래스를 간결하게 표현할 수 있는 방법이 필요하여 등장한 것이 record 이다.

 

✅ record로 변환

public record Person(String name, int age) {}

 

내부적으로 컴파일되면 아래와 같이 소스가 생성이 됨

public final class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String name() { return name; }
    public int age() { return age; }

    @Override
    public String toString() {
        return "Person[name=" + name + ", age=" + age + "]";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person other = (Person) o;
        return age == other.age && name.equals(other.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 

🧠 사용법도 조금 달라짐

Person p = new Person("준수", 30);

System.out.println(p.name()); // getName()이 아니라 name()
System.out.println(p.age());  // getAge() 대신 age()

 

✅ 왜 record에는 setter가 없는가?

  • record는 값 객체(Value Object) 개념에 기반합니다.
  • 모든 필드는 private final로 선언되어 초기화 후 변경이 불가능합니다.
  • setter가 있으면 불변성이 깨지기 때문에 의도적으로 금지되어 있습니다.

✅ record의 장점 요약

장점설명
간결함 boilerplate 제거 – 코드를 짧고 읽기 쉽게
명확한 목적 데이터를 담기 위한 클래스임을 명시
불변성 보장 모든 필드는 final로 설정되어 안전
IDE 지원 강화 자동 완성, 리팩토링 등에서 유리
패턴 매칭과 조합 sealed, instanceof, switch와 잘 어울림
✅ 한계 및 제약
  • 상속 불가 (final)
  • 모든 필드는 final이어야 함
  • 인스턴스 변수 외 추가 필드 불가
  • record는 직렬화가 필요하거나 엔티티로 쓰기에는 부적절