자바 Record (자바 16에서 채택된 새로운 클래스)
TDD에 대해 공부하다가 Record로 이너 클래스를 만드는 경우를 볼 수 있었다.
Record는 자바 14에 새로 도입되었고 자바 16에서 정식 채택된 새로운 유형의 클래스다.
불변 객체를 쉽게 생성하고 다룰 수 있다는 특징이 있다.
밑에는 Record를 사용하지 않고 기존에 Java로 불변 객체를 만드는 Class다.
import java.util.Objects;
public final class Car {
private final String name;
private final int price;
// 생성자
public Car(String name, int price) {
this.name = name;
this.price = price;
}
// Getter 메서드
public String getName() {
return name;
}
public int getPrice() {
return price;
}
// equals 재정의
@Override
public boolean equals(Object o) {
if(this == o){
return true;
}else if(!(o instanceof Car)){
return false;
}else{
Car other = (Car) o;
return Objects.equals(name, other.name)
&& Objects.equals(price, other.price);
}
}
// hashCode 재정의
@Override
public int hashCode(){
return Objects.hash(name, price);
}
// toString 재정의
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
Car라는 클래스를 정의하는데 불변 객체로 만들기 위해서 아래와 같은 순서를 따랐다.
1. Class를 final로 만들어서 상속으로 인해 불변이 깨지지 않도록 생성.
2. 필드 변수를 final로 만들어서 불변성 갖춤.
3. setter를 사용하지 않아 불변성 갖춤.(변경 불가)
4. hashCode()와 equals()를 재정의 하면서 안정성 챙김
5. 필드 데이터 제공을 위해 getter 추가
이렇게 불변 객체를 만들 수 있는 Class를 정의했는데 이게 굉장히 귀찮고 복잡하다.
(메서드 재정의해야하고 final 붙이고 이것 저것 신경쓸 게 많다.)
그래서 등장한 게 Record
Record는 키워드를 통해 간편하게 불변 객체를 만들 수 있다.
아래는 위에서 Java로 만든 불변 객체를 Record 클래스를 이용해서 만든 코드다.
public record Car(String name, int price) {
}
진짜 너무 간단하지 않나???
파라미터로 필드 변수를 정의하기만 해주면 끝이다.
이렇게 하면 자동으로 final 필드가 생성되고, 생성자가 만들어지고, hashCode() 및 equals() 메서드가 재정의된다.
또한 getter도 자동으로 들어있게 된다.
public static void main(String[] args) throws IOException {
Car car = new Car("이름1", 1234);
Car car1 = new Car("이름1", 1234);
System.out.println(car.hashCode());
System.out.println(car1.hashCode());
}
record를 사용해서 값을 동일하게 가지는 car 객체를 2개 만들었다.
이 두 개의 hashCode를 출력하면 동일한 값이 출력되게 된다.
record를 잘 사용하면 생산성에서 너무 큰 효율이 나올 것이라고 생각한다.