🤨 레코드(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
'개발 스토리' 카테고리의 다른 글
자바 스트림(Stream)이란 무엇이고 왜 쓰는건가? (0) | 2023.10.22 |
---|---|
MVC 패턴에 대해, 그리고 이를 지키는 규칙 (2) | 2023.10.21 |
Git 의 기본 동작과 Fork vs Clone (2) | 2023.10.20 |
JAVA 8 버전으로 변경 (MAC M1, intelij) (0) | 2023.09.08 |
Spring Boot 기본 클래스 " "을(를) 찾거나 로드할 수 없습니다. (0) | 2023.08.29 |