💡 개요
오늘은 자바의 record 타입에 대해 정리해 보자.
📕 record
자바 record 란, 자바 16 버전에 새롭게 출시된 타입으로, 불변 객체를 쉽게 만들기 위해 사용되는 타입이다.
아래 코드는 record 를 사용하지 않고 Member 클래스를 구현한 것이다.
public class Member() {
private String name;
private int age;
private Address address;
public Member() {}
public Member(String name, int age, Address address) {...}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddress(Address address) {
this.address = address;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Address getAddress() {
return address;
}
@Override
public boolean equals(Object o) {...}
@Override
public int hashCode() {...}
@Override
public String toString() {...}
...
}
보다시피 생성자, setter/getter, 동치성 관련 메서드, toString() 등 수많은 메서드가 작성되어 있다.
위의 Member 클래스를 record 타입을 사용해 변경하면 다음과 같다.
public record Member(String name, int age, Address address) {}
보다시피 단 한 줄로 구현할 수 있다.
그 이유는 record 타입은 자동으로 기본 생성자, getter, 동치성 메서드, toString() 등을 생성하기 때문이다.
하지만 getter 와 같이 표현 방식이 다른 메서드도 있다.
class | record |
getName() | name() |
getAge() | age() |
getAddress() | address() |
또한 record 에서 기본적으로 제공해주는 메서드에 setter 는 없다.
그 이유는 record 타입은 오로지 불변 객체를 위해 사용되는 것이기 때문이다.
그렇기 때문에 record 타입에 있는 모든 멤버 변수는 final 키워드를 사용한다고 생각하면 된다. (하지만 코드 상에선 생략됨)
public record Member(final String name, final int age, final Address address) {}
🚀 record를 사용하기 적절한 상황
위의 설명을 봤듯이 record 의 주 사용 목적은 불변 객체를 다루기 위함이다.
또한, record 는 자동으로 객체 관리에 필요한 생성자, equals(), hashCode(), toString() 을 제공해 주기 때문에 일반 클래스보다 유지보수가 훨씬 용이하다.
그렇기 때문에 record 는 주로 데이터를 전달할 목적으로만 사용되는 VO와 DTO에 주로 사용한다.
다만, VO나 DTO인데도, 데이터의 변경이 필요하다면 아예 새롭게 객체를 생성해야 한다.
아래 코드는 김철수라는 회원의 이름을 김길동으로 변경하는 것인데, 기존의 class 타입을 사용한다면 setter 나 다른 구현 메서드를 사용해 name 필드만 손쉽게 변경하겠지만, record 는 아예 새로운 객체를 생성해야 한다. (이것은 불변 객체의 특징이기도 하다.)
Member member = new Member("김철수", 20, new Address(...));
member = new Member("김길동", 20, new Address(...));
만약 특정 변수만을 변경하기 위해 새로운 객체를 생성하는 과정이 싫다면 일반 class 를 사용하는 게 더 적절할 수 있다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.02.15 - Security Context (0) | 2025.02.15 |
---|---|
[개발 일기] 2025.02.14 - 우선순위 큐 (0) | 2025.02.14 |
[개발 일기] 2025.02.12 - 스티키 세션 (1) | 2025.02.12 |
[개발 일기] 2025.02.11 - SockJS (0) | 2025.02.11 |
[개발 일기] 2025.02.10 - 디미터의 법칙 (1) | 2025.02.10 |