[JAVA] Record

강민승·2023년 9월 3일
0

JAVA

목록 보기
13/15

[Java] Record

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를 생성한다.
  • 생성자를 만든다.
  • getter를 구현한다.

보통 EntityDTO 구현에 있어서 많이 사용하는 형식이다.

이를 Record 타입의 클래스로 만들면 상당히 단순해진다.


public record Person(
	String name,
    int age
) {}

자동으로 필드를 private final 로 선언하여 만들어주고, 생성자getter까지 암묵적으로 생성된다. 또한 equals, hashCode, toString 도 자동으로 생성된다고 하니 매우 편리하다.

대신 getter 메소드의 경우 구현시 getXXX()로 명칭을 짓지만, 자동으로 만들어주는 메소드는 name(), age()와 같이 필드명으로 생성된다.


equals()

또한 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를 반환합니다.

hashcode

같음 메서드와 유사하게 해당 해시코드 메서드도 생성됩니다.

두 개체의 필드 값이 모두 일치하는 경우 두 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

마지막으로, 레코드의 이름과 각 필드의 이름 및 대괄호 안의 해당 값이 포함된 문자열을 반환하는 toString 메서드도 수신합니다.

따라서 이름이 "Gom"이고 주소가 "50 GomeHouse"인 Person을 인스턴스화하면 다음과 같은 toString 결과가 반환됩니다.

Person[name=Gom, address=50 GomeHouse.]

[참고 자료]

profile
Step by Step goes a long way. 꾸준하게 성장하는 개발자 강민승입니다.

0개의 댓글