조종 다음은 개발
article thumbnail

🤨 레코드(record) 누구냐 넌?

레코드(record)란 불변의 데이터를 쉽게 생성할 수 있는 새로운 유형의 클래스이다.
JDK14에서 처음 소개되었고, JDK16에서 정식 스펙으로 포함되었다.

백문일불여일견, 우선 간단하게 뭔지 살펴보자.

클래스

위와 같이 복잡한 코드를 아래와 같이 코드 한 줄로 간단하게 사용할 수 있게 해주는 마법 같은 존재이다.

레코드

그렇기 때문에 데이터를 다루는 모델 클래스나 DTO 로 사용하기 매우 적합할 것 같다.

🧙 레코드가 자동으로 만들어 주는 것들

필드 및 생성자

클래스
레코드

기본 클래스와는 다르게 레코드는 선언 시 사용할 필드만 넣어주면 자동으로 private final필드를 선언하고 생성자도 선언한다. 별도로 생성자를 정의해주거나 필드값을 적어줄 필요가 없다.

getter

레코트는 필드값의 getter 도 자동으로 만들어준다.

다만 getter 사용시 getXXX 가 아니라 필드값 이름으로 접근한다.

(ex. baseballRecord.ball() . baseballRecord.strike() )

equals, hashCode, toString

재정의를 많이하는 equals, hashCode , toString 도 자동으로 생성해 준다.

만약 본인이 원하는 대로 재정의 하고 싶다면 그냥 재정의해주면 된다.

🎯 레코드의 특징

컴팩트 생성자 기능을 제공한다.

만약 생성자에서 검증과 같은 추가 기능을 하려면 일반 클래스와 같은 경우 위와 같이 작성할 것이다.

그런데 레코드의 경우 위와 같이 간단하게 생성자를 정의하면 된다.

자동으로 필드값을 가져오고 this.ball = ball 와 같이 필드값을 초기화도 알아서 해준다.

이러한 기능은 레코드에만 제공되는 기능이다.

정적 필드를 제외한 모두 필드값은 선언 시 정의되어야 한다.

static 이 아닌 비정적 필드값들은 레코드 선언 시 정의되어야 한다.

반면에 static 키워드를 사용하는 정적 필드값은 추가해 줄 수 있다.

기존 클래스와 동일하게 메서드를 추가해서 사용할 수 있다.

만약 메서드를 구현하고 싶다면 기존 클래스와 동일하게 메서드를 정의하면 된다.

확장이나 상속이 불가능한 final 클래스이다.

레코드는 확장이나, 상속이 불가능한 final 클래스이다.

앞에 final 이 생략되어 있다고 생각하면 된다.

모든 필드값은 private final 이여야 한다.

모든 필드값은 final 키워드로 정의하기 때문에 생성자를 통해서만 정의된다.

다시 말해서 한 번 정의되면 값이 변하지 않는다.

setter 가 없는 것도 이 때문이다.

🌐 Reference

Records In Java - Full Tutorial - The Best New Java Feature You're Not Using

[자바] JDK 17 까지의 변천사 by TestCode

[Java] 자바의 레코드(Record)

profile

조종 다음은 개발

@타칸

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!