본문 바로가기

Java/Java SE, EE

데이터 표현을 위한 Record 클래스

더보기

IntelliJ IDEA에서 Record 기능을 활성화 하려면 이 블로그의 문서:자바 프로젝트에서 Record 클래스를 인식하지 못하는 이슈를 참고합니다.

Record는 Java 16 (JEP 395)에서 최종적으로 릴리즈 되었으며 JDK 16 이상에서 정식 사용 할 수 있습니다.

Record란?

Record는 자바의 Enum과 같은 특별한 형태의 클래스입니다. 주로 일시적인 데이터를 저장하고 표현하기 위해서 사용합니다.

Record는 record 키워드로 선언합니다.

public record Fruit()
{

}

Record의 선언부에는 데이터가 표현하는 프로퍼티를 포함합니다.

프로퍼티는 데이터 타입 프로퍼티 이름으로 구성하며 생성자나 함수의 인자를 입력하는 방식과 동일합니다.

public record Fruit(String name, int price, String color)
{

}
코드 비고
Line 1 public | protected | private Record에 대한 접근자입니다.
record Record를 선언하는 키워드입니다.
Fruit Record의 이름입니다.
(String name, int price, String color) Rocord가 표현하는 프로퍼티입니다.

Record는 프로퍼티에 대한 Getter 메소드를 자동으로 생성합니다. 예를 들어 위 샘플 Record를 클래스로 구현하면 다음과 같습니다.

public class Fruit
{
	private String name;
	private int price;
	private String color;
	
	public Fruit(String name, int price, String color)
	{
		this.name = name;
		this.price = price;
		this.color = color;
	}
	
	public String name() { return name; }
	
	public int price() { return price; }
	
	public String color() { return color; }
}

Record를 사용하는 방법은 클래스와 동일합니다. 객체를 new 키워드로 인스턴싱하고 멤버 함수를 호출합니다.

객체를 생성할 때는 Record에 선언된 프로퍼티가 생성자로 전달됩니다.

Fruit fruit = new Fruit("Apple", 5, "Red");
String color = fruit.color();

Record의 구현과 표현

InteliiJ IDEA에서 Record를 생성하려면 Project | 패키지 우클릭 | New | Java Class에서 Record를 선택합니다.

Record 이름을 입력하면 기본적인 포멧의 Record가 구현됩니다.

모든 Record는 java.lang.Record 클래스를 상속 받습니다. 

따라서 다른 클래스를 상속하면 No extends clause allowed for record 오류가 발생합니다.

public record Fruit(String name, int price, String color) extends Food
{

}

대신 인터페이스를 구현하는 것은 가능합니다.

public record Fruit(String name, int price, String color) implements Food
{

}

Record의 생성자를 명시적으로 작성하여 프로퍼티의 Validation을 처리 할 수 있습니다.

생성자는 <접근자> <이름> { }으로 구성되며 코드 블록 내부에서 프로퍼티에 엑세스 할 수 있습니다.

public record Fruit(String name, int price, String color)
{
	public Fruit {
		if (0 > price)
			new IllegalArgumentException();
		
		if (null == name || 0 == name.length())
			new IllegalArgumentException();
		
		if (null == color || 0 == color.length())
			new IllegalArgumentException();
	}
}

Record는 클래스 내부 코드에서 멤버 변수와 멤버 함수를 선언 할 수 없습니다.

대신 static으로 지정된 멤버 변수와 멤버 함수는 허용합니다.

public record Fruit(String name, int price, String color)
{
	private static String World = "World!";
	
	public static void Hello() {
		System.out.println(World);
	}
}

Record는 데이터를 표현하기 위한 목적으로 사용되며 데이터를 표현는 가장 쉬운 방법은 JSON입니다.

프로퍼티를 JSON으로 Serialize하기 위해서 jackson.JsonPropery를 프로퍼티에 등록합니다.

public record Fruit(@JsonProperty("name") String name)
{
	
}

정리 및 복습

  • Record는 일시적인 데이터를 저장하고 표현하기 위해서 사용합니다.
  • 주로 DTO(Data Transform Object) 또는 Domain Model Class에서 사용하기에 적합합니다.
  • record 키워드로 선언하며 프로퍼티를 받는 생성자와 Getter가 자동으로 생성되어 코드 작성이 간결합니다.
  • java.lang.Record 클래스를 상속 받기 때문에 다른 클래스는 상속 할 수 없으며, 대신 인터페이스는 구현 할 수 있습니다.
  • static으로 지정된 멤버 변수와 멤버 함수는 허용되지만 일반 멤버 변수와 멤버 함수를 선언 할 수 없습니다.
  • 생성자를 명시적으로 작성하여 프로퍼티의 Validation을 처리 할 수 있습니다.
  • 프로퍼티를 JSON으로 Serialize하기 위해서 jackson.JsonPropery를 프로퍼티에 등록 할 수 있습니다.