[Java] Record란?
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