값의 집합으로 이루어진 간단한 객체를 심플하게 개발하기위해 고안되었습니다.
immutable data를 다룰 class 구현에 최적화되어있습니다.
웹서비스 구현에서 많이 사용되는 DTO 개념에 적용하면 유용합니다.
생성자, accessors(getter), equals(), hashCode(), toString() 등 DTO 특성의 클래스를 개발할때 매번 개발자가 직접 구현해주어야 했던 반복적인 작업이 불필요하게 됩니다.
또한, "이 클래스는 data carrier 용도이다"를 명시적으로 나타낼 수 있으므로 코드에 대한 이해를 돕고 해당 클래스의 목적에 맞지 않는 구현을 하지 않도록 방지합니다.
public record BasicRecord(
int id,
String name,
int age
){}
public record BasicRecord(
int id,
String name,
int age
){
// type1
public BasicRecord(int id, String name, int age){
if(age<10){
throw new IllegalArgumentException("age는 10 이상이어야 합니다.");
}
this.id=id;
this.name=name;
this.age=age;
}
// type2
public BasicRecord{ // 생성자에 parameter 생략 가능
if(age<50){
throw new IllegalArgumentException("age는 50 이상이어야 합니다.");
}
name="kim";
}
}
final 클래스이므로 다른 클래스가 상속할 수 없습니다.
다른 클래스를 상속할 수도 없습니다.
자동생성 accessor 함수는 인스턴스 멤버 변수의 이름과 동일합니다.
Record 클래스의 접근제어자는 public, package-private 만 가능합니다.
Record 생성자의 접근제어자는 클래스의 접근제어자보다 제한된 수준이어서는 안됩니다.
public record BasicRecord(...){
BasicRecord(...){ // -> package-private
}
}
record BasicRecord(...){
public BasicRecord(...){
}
}
public record BasicRecord(...){
public BasicRecord(...){
}
}
// BasicRecord.java
public record BasicRecord(
int id,
String name,
int age
){
public BasicRecord{ // 생성자에 parameter 생략 가능
if(age<50){
throw new IllegalArgumentException("age는 50 이상이어야 합니다.");
}
age=10; // 인스턴스 변수에 할당됨.
}
}
// RecordTest.java
public final class RecordTest {
public static void main(String[] args){
BasicRecord basicRecord1 = new BasicRecord(1,"jerry",51);
System.out.println(basicRecord1);
BasicRecord basicRecord2 = new BasicRecord(2,"kim",30);
System.out.println(basicRecord2);
}
}
[output]
BasicRecord[id=1, name=jerry, age=10]
Exception in thread "main" java.lang.IllegalArgumentException: age는 50 이상이어야 합니다...
Process finished with exit code 1
// BasicRecord.java
public record BasicRecord(
int id,
String name,
int age
){
public BasicRecord{ // 생성자에 parameter 생략 가능
if(age<10){
throw new IllegalArgumentException("age는 10 이상이어야 합니다.");
}
}
}
// RecordTest.java
public final class RecordTest {
public static void main(String[] args){
BasicRecord basicRecord2 = new BasicRecord(2,"kim",30);
System.out.println(basicRecord2);
BasicRecord basicRecord3 =new BasicRecord(2,"kim",30);
System.out.println("name is "+ basicRecord2.name());
System.out.println("hashcode test : "+ basicRecord2.hashCode());
System.out.println("equals test :"+ basicRecord2.equals(basicRecord3));
}
}
[output]
BasicRecord[id=2, name=kim, age=30]
name is kim
hashcode test : 3293873
equals test :true
[참고]