스프링부트 3.0으로 올라가면서 자바(Java) 17이 기본이 되었다. 그러면서 자연스럽게 자주 보이는 키워드가 record 키워드인 것 같다. DTO를 만드는 과정에서 class 대신 사용이 가능하다.
이번 포스팅에서는 Record 에 대해서 알아보자.
Records (JEP 359) 란 무엇인가
JEP 359는 "Records"라는 기능을 도입하는 것을 목표로 한 Java Enhancement Proposal이다. JEP는 Java 개발 프로세스에서 새로운 기능, 개선 사항 또는 변경 사항을 제안하는 문서이다. JEP 359는 Java 14에서 도입되었으며, 이를 통해 개발자는 불변(immutable) 데이터 컨테이너를 간결하게 정의할 수 있는 새로운 형식인 "record"를 사용할 수 있다.
record는 클래스와 유사한 데이터 타입이지만, 몇 가지 제한과 기본 동작을 갖추고 있다. record를 사용하면 데이터를 저장하고 액세스 하는 메서드, equals(), hashCode(), toString() 및 기타 메서드를 자동으로 생성할 수 있다. record는 주로 데이터 전달 객체(Data Transfer Object)로 사용되며, 데이터의 불변성을 보장하고 간결한 코드 작성을 돕는다.
아래는 record의 예시이다.
record Person(String name, int age) {
// 생성자, 접근자(getter) 메서드 등을 자동으로 생성한다.
}
위의 예시에서 Person은 불변 데이터 컨테이너로서 name과 age라는 두 개의 필드를 가지고 있다. record를 정의할 때 생성자, 접근자 메서드(getter), equals(), hashCode(), toString() 등의 메서드를 명시적으로 작성하지 않아도 자동으로 생성된다.
또한, record는 다른 클래스를 상속할 수 없지만 인터페이스를 구현할 수 있다. record의 필드는 final로 취급되어 값을 변경할 수 없다. 필드에 대한 액세스 메서드는 자동으로 생성되므로, 필드에 직접 액세스 하지 않고 메서드를 통해 데이터에 접근하는 것이 권장된다.
record는 Java의 데이터 클래스를 간결하게 작성하고 유지 보수하기 쉽게 만들어 준다. 코드의 가독성을 높이고 버그를 줄이는 데 도움을 주는 기능이다.
상속을 사용할 수 없는 record. 상속이 필요하다면?
record는 다른 클래스를 상속할 수 없지만, 인터페이스를 구현하는 것은 가능하다. record는 자동으로 equals(), hashCode(), toString()과 같은 메서드를 생성하기 때문에 이러한 기능을 제공하는 인터페이스를 구현하는 것이 허용된다.
인터페이스를 구현하기 위해 record를 작성하는 방법은 일반 클래스와 유사하다. 다음은 record가 인터페이스를 구현하는 예시이다.
interface Printable {
void print();
}
record Person(String name, int age) implements Printable {
// 생성자, 접근자(getter) 메서드 등을 자동으로 생성한다.
@Override
public void print() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
위의 예시에서 Person record는 Printable 인터페이스를 구현한다. Printable 인터페이스는 print() 메서드를 가지고 있으며, Person record에서 이를 구현하고 있다. 이렇게 하면 Person record는 Printable 인터페이스의 메서드를 사용할 수 있다.
상속을 통해 다른 클래스의 기능을 확장하려는 경우에는 record 대신 클래스를 사용해야 한다. record는 간단한 데이터 컨테이너를 정의하는 데 적합한 기능이므로, 상속과 같은 확장을 위해서는 일반적인 클래스를 사용하는 것이 좋다.
record를 사용하면 좋은 예
record는 주로 데이터 전달 객체(Data Transfer Object)로 사용될 때 가장 유용하다. 아래는 record를 사용하는 몇 가지 예시이다.
record User(String username, String email) {
// 생성자, 접근자(getter) 메서드 등을 자동으로 생성한다.
}
User user = new User("ironman", "ironman@marvel.com");
- 데이터 저장 및 전달: record는 데이터를 저장하고 전달하는 데 사용될 수 있다. 예를 들어, 사용자 정보, 주문 정보, 센서 데이터 등을 담는 간단한 데이터 컨테이너로 사용할 수 있다.
- 변성 보장: record는 필드를 final로 선언하고 값을 변경할 수 없도록 함으로써 데이터의 불변성을 보장한다. 이는 데이터의 일관성과 안정성을 유지하는 데 도움이 된다.
- 코드의 가독성 개선: record는 자동으로 생성되는 메서드를 통해 equals(), hashCode(), toString() 등의 기능을 제공하므로, 코드의 가독성을 향상시킨다. 이는 디버깅이나 로깅과 같은 상황에서 유용하다.
- 패턴 매칭 (Pattern Matching): record는 패턴 매칭 기능과 함께 사용될 수 있다. 패턴 매칭은 Java 14부터 도입된 기능으로, 코드의 가독성을 향상시키고 복잡한 분기문을 간결하게 작성할 수 있게 해 준다.
record는 간단하고 불변성이 필요한 데이터 컨테이너를 정의하는 데 효과적이다. 데이터 전달 객체, DTO, JSON 직렬화, 데이터베이스 매핑 등 다양한 상황에서 사용될 수 있다. 그러나 상속이나 기능 확장이 필요한 경우에는 일반적인 클래스를 사용하는 것이 더 적합할 수 있다.
'쿤즈 Dev > Java' 카테고리의 다른 글
[Java] Hello, world 출력하기 (0) | 2023.07.28 |
---|---|
[Java] Java를 시작하기 전 알고 가야할 몇 가지 정보 (0) | 2023.07.27 |
[Java] LocalDateTime 값을 String 포멧으로 변환하는 방법 (0) | 2022.03.16 |
[Java] Primitive(원시) 자료형과 Wrapper 클래스 (0) | 2021.10.08 |
[Java] 데이터 타입 사용해서 화면에 출력하기 (0) | 2021.09.14 |
댓글