레코드(Record)?
*참조*
https://velog.io/@conatuseus/Java-Immutable-Object%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4
https://scshim.tistory.com/372
레코드란 뭘까?
프로젝트를 진행하던중 record라는 클래스를 사용하는걸 봤다.
매우 생소했고 뭐지? 음반같은건가? 하는 생각이 더 들었다.
당연히 그건 아니였고 레코드는 jdk14에서 추가된 클래스였다..
레코드
ㆍ 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스라고 한다.
불변객체
2023.06.19 - [분류 전체보기] - 불변객체?
불변객체?
불변 객체란 뭘까? 말만 들으면 변하지않는 객체? 라는 생각이 든다. 먼저 객체는 언제 변할까? 더보기 인스턴스 변수 직접 수정: 객체의 인스턴스 변수가 변경 가능한 타입인 경우, 해당 변수에
notenoughtime.tistory.com
- 기존의 불변 객체
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
상태(name, age)를 보유하는 불변 객체를 생성하기 위한 많은 코드를 작성함
- 모든 필드에 final을 사용하여 명시적으로 정의
- 필드 값을 모두 포함한 생성자
- 모든 필드에 대한 접근자 메서드(getter)
- 상속을 방지하기 위해 클래스 자체를 final로 선언하기도함
- 로깅 출력을 제공하기 위한 toString 재정의
- 두 개의 인스턴스를 비교하기 위한 hashCode, equals 재정의
학원에서도 이렇게 배웠었다.
toString도 쓰고 getter,setter도 쓰고 이걸 써주는 lombok같은걸 써서 작업을 줄이는 것도 해봤다.
그렇지만 레코드를 사용하면?
public record Person(String name, int age) {
}
위와 같은 생성자들을 써줄 필요 없이 훨씬 간결한 방식으로 동일한 불변 데이터 객체 정의할 수 있다.
컴파일러는 헤더(타입과 이름)를 통해 내부 필드를 추론한다
- 생성자를 작성하지 않아도 되고 toString, equals, hashCode 메소드에 대한 구현을 자동으로 제공
import lombok.Builder;
public record BoardCommandDto() {
public record BoardCreateRequestDto(
String title,
String content
){}
@Builder
public record BoardCreateResponseDto(
boolean success
){}
}
이와 같이 프로젝트에서 작성할 수 있었다.
ㆍ레코드의 제한
- 레코드는 암묵적으로 final 클래스(상속불가)이고, abstract 선언 불가
- 다른 클래스를 상속(extends) 받을 수 없음, 인터페이스 구현(implements)은 가능
이라고 한다~