Java 14에서 프리뷰로 도입된 클래스 타입
순수히 데이터를 보유하기 위한 클래스
Java 14버전부터 도입되고 16부터 정식 스펙에 포함된 Record는 class처럼 타입으로 사용이 가능하다.
객체를 생성할 때 보통 아래와 같이 개발자가 만들어야한다.
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;
}
}
Person
을 만든다. name
, age
를 생성한다.보통 Entity
나 DTO
구현에 있어서 많이 사용하는 형식이다.
이를 Record 타입의 클래스로 만들면 상당히 단순해진다.
public record Person(
String name,
int age
) {}
자동으로 필드를 private final
로 선언하여 만들어주고, 생성자
와 getter
까지 암묵적으로 생성된다. 또한 equals
, hashCode
, toString
도 자동으로 생성된다고 하니 매우 편리하다.
대신 getter
메소드의 경우 구현시 getXXX()
로 명칭을 짓지만, 자동으로 만들어주는 메소드는 name()
, age()
와 같이 필드명으로 생성된다.
또한 equals 메서드가 생성됩니다.
이 메서드는 제공된 객체의 유형이 동일하고 모든 필드 값이 일치하는 경우 true를 반환합니다
@Test
public void givenSameNameAndAddress_whenEquals_thenPersonsEqual() {
String name = "Gome";
String address = "50 GomeHouse";
Person person1 = new Person(name, address);
Person person2 = new Person(name, address);
assertTrue(person1.equals(person2));
}
두 Person 인스턴스 간에 필드 중 하나라도 다른 경우 같음 메서드는 false를 반환합니다.
같음 메서드와 유사하게 해당 해시코드 메서드도 생성됩니다.
두 개체의 필드 값이 모두 일치하는 경우 두 Person 개체에 대해 동일한 값을 반환하는 hashCode 메서드를 생성합니다
@Test
public void givenSameNameAndAddress_whenHashCode_thenPersonsEqual() {
String name = "Gome";
String address = "50 GomeHouse";
Person person1 = new Person(name, address);
Person person2 = new Person(name, address);
assertEquals(person1.hashCode(), person2.hashCode());
}
필드 값 중 하나라도 다르면 해시코드 값이 달라집니다.
마지막으로, 레코드의 이름과 각 필드의 이름 및 대괄호 안의 해당 값이 포함된 문자열을 반환하는 toString 메서드도 수신합니다.
따라서 이름이 "Gom"이고 주소가 "50 GomeHouse"인 Person을 인스턴스화하면 다음과 같은 toString 결과가 반환됩니다.
Person[name=Gom, address=50 GomeHouse.]