Language/Java

[Java] Record란?

Hyeri.dev 2023. 8. 9. 17:26

Record란?

- Java 14 버전에 추가된 것으로 데이터 저장과 관련된 작업을 더 쉽게 처리할 수 있도록 도와주는 새로운 데이터 타입을 말한다.

- Record는 Class를 정의하는 더 간단하고 명확한 방법을 제공하여 데이터 객체를 생성하고 관리하는데 도움을 준다.

- 불필요한 중복 코드를 줄여 가독성 및 유지 보수성이 높다.

public record Example(String a, int b) {
	//  Record body (생략 가능)
}

Record의 특징

1. 불변성

- Record 객체가 생성된 후에는 내부의 데이터가 변경될 수 없다. 

public (final) record Example(String a, int b) {
	//  Record body (생략 가능)
}

- record를 선언할 때, final 키워드를 추가할 수 있지만 암묵적으로 불변성을 가지기 때문에 생략 가능하다.

- 인스턴스 메서드, 정적 메서드 및 변수는 생성할 수 있으나 인스턴스 변수는 생성할 수 없다.

- 동기화 없이 데이터의 유효성을 보장한다.

💡변경이 불가능하기 때문에 Setter를 생성하는 것은 의미가 없다. 따라서 Record에서는 Setter 메서드를 제공하지 않는다.

2. final 클래스

- Record는 암묵적으로 final 클래스이며, final 키워드는 생략한다.

public (final) record Example(String a, int b) {}

- 각 필드는 private final 필드로 정의된다.

3. 상속 불가

- Record는 기본적으로 Record Class를 상속받고 있다. Java에서는 다중 상속이 불가능하므로 다른 클래스의 자식클래스가 될 수 없다.

- 'implements' 키워드를 사용하여 인터페이스 구현은 가능하다.

Record와 Class의 차이

Record와 Class의 차이를 예시 코드를 한눈에 보면 차이를 확연하게 알 수 있다.

Class 코드

public class EmployeeClass {
	// 필드 변수
    private final String name;
    private final int employeeNumber;
   
   // 생성자
    public EmployeeClass (String name, int employNumber) {
    	this.name = name;
        this.name = empolyNumber
  }
  
  // Getter
  public String getName() {
  	return name;
  }
  
  public int getEmployeeNumber() {
  	return employeeNumber;
  }
  
  // toString()
  @Override
  public String toString() {
  	// return문 생략
  }
  
  // hashCode() 
  @Override
  public int hashCode() {
  	// return문 생략
  }
  
  // equals()
  @Override
  public boolean equals(final Object o) {
  	// return문 생략
  }
}

Record  코드

public record EmployeeRecord (String name, int employeeNumber) {}

Class에 구현한 기본 생성자, Getter, toString(), hashCode(), equals()는 Record를 사용하면 개발자가 별도로 구현할 필요가 없이 자동으로 생성된다. 특히 toString(), hashCode(), equals() 의 메서드들은 개발자가 구현할 때, 실수하기 쉽기 때문에 record를 사용하면 사소한 실수를 덜 수 있다는 장점을 가진다. 

💡 Getter 사용법
Class : EmployeeClass.getName()
Record : EmployeeRecord.name()

물론 필요에 따라 개발자가 해당 메서드들과 생성자를 직접 구현할 수도 있다.

 

컴팩트 생성자 (Compact Constructor)

- Record에만 적용되는 것으로, 기본 생성자를 재정의하는 또 다른 방법을 말한다. 

- 매개변수 및 할당 구문을 제거한 생성자

// 표준 생성자
public EmployeeRecord (String name, int empolyeeNumber) {
	// 이것저것 조건
    this.name = name;
    this.employeeNumber = employeeNumber;
}

// 컴팩트 생성자
public EmployeeRecord {
	// 이것저것 조건
}

두 생성자는 같은 기능을 한다.

- 인스턴스 필드를 초기화하지 않아도 컴팩트 생성자의 마지막에 초기화 구문이 자동으로 삽입된다.

- 표준 생성자와 달리 컴팩트 생성자 내부에서는 인스턴스 필드에 접근할 수 없다.

- 컴팩트 생성자는 Record의 장점 중 하나로, 코드를 간결하게 유지하는 데 도움이 된다.

- 컴포넌트로 넘어온 객체를 불변으로 만들거나, 불변식을 만족하는지 검사하는 등의 작업을 하기에 적합하다.

 

Reference.

https://blog.hexabrain.net/399

https://www.baeldung.com/java-record-keyword

https://youtu.be/gJ9DYC-jswo