레코드
데이터 전달을 위한 DTO(Data Transfer Object)를 작성할 때 반복적으로 사용되는 코드를 줄이기 위해 Java 14부터 레코드(Record)가 도입되었다. 예를 들어 사람의 정보를 전달하기 위한 Person DTO가 다음과 같다고 가정해 보자.
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 name() { return this.name; }
public String age() { return this.age; }
@Override
public int hashCode() { ... }
@Override
public boolean equals(Object obj) { ... }
@Override
public String toString() { ... }
Person의 데이터(필드)는 읽기만 가능하도록 필드를 private final로 선언하였으며, 필드 이름과 동일한 Getter 메서드를 가지고 있다. 그리고 동등 비교를 위해 hashCode(), equals() 메서드를 재정의 하고 있고, 의미 있는 문자열 출력을 위해 toString() 메서드를 재정의 하고 있다.
다음 코드는 위와 동일한 코드를 생성하는 레코드 선언이다. class 키워드 대신에 record로 대체하고 클래스 이름뒤에 괄호를 작성해서 저장할 데이터의 종류를 변수로 선언하였다.
public record Person(String name, int age) {
}
이렇게 선언된 레코드 소스를 컴파일하면 변수의 타입과 이름을 이용해서 private final 필드가 자동 생성되고, 생성자 및 Getter 메서드가 자동으로 추가된다. 그리고 hashCode(), equals(), toString() 메서드를 재정의한 코드도 자동으로 추가된다.
예제 코드
Person.java
package ch11;
public record Person(String id, String name, int age) {
}
RecordExample.java
package ch11;
public class RecordExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p = new Person("winter", "눈송이", 25);
System.out.println(p.id());
System.out.println(p.name());
System.out.println(p.age());
System.out.println(p.toString());
System.out.println();
Person p1 = new Person("winter", "눈송이", 25);
Person p2 = new Person("winter", "눈송이", 25);
System.out.println("p1.hashCode(): " + p1.hashCode());
System.out.println("p2.hashCode(): " + p2.hashCode());
System.out.println("p1.equals(p2): " + p1.equals(p2));
}
}
출력 결과
winter
눈송이
25
Person[id=winter, name=눈송이, age=25]
p1.hashCode(): 306065155
p2.hashCode(): 306065155
p1.equals(p2): true
'Language > JAVA' 카테고리의 다른 글
| [JAVA] System 클래스 (0) | 2024.10.15 |
|---|---|
| [JAVA] 롬복 사용하기 (1) | 2024.10.15 |
| [JAVA] Object 클래스 (0) | 2024.10.15 |
| [JAVA] java.base 모듈 (1) | 2024.10.15 |
| [JAVA] 모듈 (2) | 2024.09.05 |