[Java] record는 뭐야?

2025. 3. 25. 23:20·SW 공학 & 프로그래밍 언어/Java
728x90
반응형

 

record 등장 ?!

❓Java 14에 처음 등장

❗️Java 16부터 정식

✅ Java 21에서 거의 주력으로 자리잡은 record.

 

record에서 간략하게 알아보자.

  • setter ❌
  • getter, 생성자, equals, hashCode, toString 자동생성
  • final 필드로 수정 ❌ (불변객체)
  • 직렬화 가능
  • Swagger 문서화 도구 사용 가능

 


✅ 겉으로 보이는 차이점: 일반 객체(DTO)와 record 비교

일반 객체(DTO)와 비교해보자.

생성자 명시적으로 작성해야 함 자동 생성 (canonical constructor)
getter 직접 생성 or Lombok 필요 자동 생성
setter 직접 생성 or Lombok 필요 ❌ 없음 (불변)
equals/hashCode/toString 수동 or Lombok 필요 자동 생성
필드 수정 가능 여부 ✅ 가능 ❌ 불변
불변성 보장 ❌ ✅
JSON 직렬화 가능 가능 (Jackson 지원)
Swagger 설명 ✅ @Schema, @Parameter 등 사용 가능 ✅ Java 21 기준 사용 가능

✔️ 결론: record는 DTO용으로 거의 완벽하게 쓸 수 있어.

 

그렇다면 겉에서 보이는 차이점뿐 아니라, 내부적인 동작, 컴파일 타임, 성능 차이까지 궁금할 수 있지❓

 


✅ 눈에 안 보이는 차이점 

단순한 클래스가 아니다.

  • record는 내부적으로 java.lang.Record를 반드시 상속한다.
  • final class 라 상속은 불가능
  • 생성자, getter, equals, hashcode, toString 자동생성
  • JEP 395에서 공식적으로 도입(Java 16) 

 

 🔍 컴파일 결과 구조

record는 컴파일 후 바이트코드를 보면 일반 클래스와 다르게 JVM이 특별하게 인식하는 FLAG가 붙는다.
이를 확인하는 방법은 javap 명령어를 사용해서 확인이 가능하다.

 

javap -c MyRecord.class
public record UserDto(String name, int age) {}

 

바이트코드 결과
public final class MyRecord extends java.lang.Record {
  private final java.lang.String name;
  private final int age;
  
  public MyRecord(java.lang.String, int);
  public java.lang.String name();
  public int age();
  public java.lang.String toString();
  public final boolean equals(java.lang.Object);
  public final int hashCode();
}

 

✅ 여기서 extends java.lang.Record 가 record만의 특별한 특징이다.
✅ 일반 클래스는 Object를 상속하지만, record는 java.lang.Record를 강제 상속

즉, JVM이 "이건 일반 클래스가 아니라 record다!" 하고 특별 취급

 

🚀 컴파일 속도

record는 컴파일 시 자동 생성되는 코드가 많기 때문에:

  • 내가 코드를 직접 작성한 것보다 더 최적화된 바이트코드가 생성됨
  • 컴파일 속도는 오히려 빨라짐 (보일러플레이트 줄어드니까)

👉 Lombok 기반 DTO보다도 빠름 (Lombok은 애노테이션 프로세서 기반이라 상대적으로 컴파일 타임이 조금 느림)

 

🧠 런타임 성능

record는 final 클래스이고, 모든 필드도 final

  • 인라인 캐싱: 메서드 호출 위치에 해당 메서드를 인라인으로 삽입해서 호출 비용을 줄이는 최적화
    자바는 다형성 때문에 메서드 호출할 때 실제 구현체를 런타임에 결정하지만
    불변객체여서 자주 쓰는 타입에 대해 캐시함 
  • escape analysis:  객체가 메서드 밖으로 return 하지 않는 경우, JVM은 그 객체를 힙이 아니라 스택에 할당하여 최적화
  • 위 상황으로 JIT(Just-In-Time) 컴파일러가 최적화하기 더 쉬움
    JIT: 자주 실행되는 부분을 컴파일러가 기계어로 변환에 캐싱


✅ 한 줄 요약

record는 final, 불변, 단순 구조 덕분에 JIT 컴파일러가 더 빠르게, 더 공격적으로 최적화할 수 있는 조건을 잘 갖추고 있다.

 

728x90
반응형
저작자표시 비영리 (새창열림)

'SW 공학 & 프로그래밍 언어 > Java' 카테고리의 다른 글

Thread와 대안들  (2) 2025.06.02
CAS(Compare-And-Swap) 기법  (0) 2025.05.13
REST API에서 요청 DTO를 매번 만들어야 하나?  (0) 2025.03.25
REST API 설계, GET 방식과 보안이슈  (0) 2025.03.25
Java 버전별 변천사 ( Java 6 ~ )  (2) 2025.03.15
'SW 공학 & 프로그래밍 언어/Java' 카테고리의 다른 글
  • Thread와 대안들
  • CAS(Compare-And-Swap) 기법
  • REST API에서 요청 DTO를 매번 만들어야 하나?
  • REST API 설계, GET 방식과 보안이슈
크크크크
크크크크
공뷰를 합시다.
    반응형
  • 크크크크
    Tom's Note
    크크크크
  • 전체
    오늘
    어제
    • 분류 전체보기 (130)
      • IT 지식 (6)
      • CS (66)
        • 알고리즘 & 자료구조 (19)
        • 운영체제 (41)
        • 네트워크 (1)
        • 데이터베이스 (5)
      • 보안 (6)
      • SW 공학 & 프로그래밍 언어 (5)
        • Java (28)
        • 디자인 패턴 (1)
        • 형상관리 (2)
        • 톰캣(WAS) (2)
        • SW 방법론 (3)
        • 스프링부트 (5)
      • 시스템 설계 (4)
        • Docker (2)
      • 자격증 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      /etc/passwd
      스프링부트
      chmod
      리눅스
      passwd
      비트연산
      문제해결
      DTO
      docker
      man
      su
      자바
      which
      REST API
      분석기법
      2차
      ADsP
      apropos
      whatis
      java
      불변
      알고리즘
      whereis
      Chage
      cifs
      암호설정
      DI
      usermod
      단반향
      1급
    • 최근 댓글

    • 최근 글

    • 250x250
    • hELLO· Designed By정상우.v4.10.3
    크크크크
    [Java] record는 뭐야?
    상단으로

    티스토리툴바