Record 클래스

작성완료 여부

작성 완료

래퍼런스

https://mangkyu.tistory.com/445

개발 트렌드의 변화

순수한 데이터가 더 중요해지는 시대가 되면서, 자바도 비즈니스 엔티티와 처리를 모델링하기 위해 클래스를 사용하는 것에서 데이터를 모델링하기 위해 클래스를 사용하도록 변화 중이다. 자바 언어 개발자 역시 이런 트렌드에 발맞춰 여러 시도를 하고 있는데 해당 프로젝트가 바로 프로젝트 엠버 이다. 해당 프로젝트는 개발 생산성을 높이기 위한 다양한 기능을 도입하고 있으며, 그 중 하나가 바로 Record 클래스이다.

Record 클래스와 특징

Record 클래스는 데이터 모델링을 간소화하고, 불변 객체를 쉽게 생성할 수 있도록 설계되었다. 다라서 주로 데이터 전송 객체(DTO)나 값 객체(VO)를 표현하는데 사용한다.

Record는 아래 특징을 갖는다.

Record 클래스의 도입 배경

Record 클래스는 데이터 교환과 관련된 작업의 개선을 위해 등장한 개념이다. 자바 언어 개발자들이 데이터 교환을 위해 언어의 개선 작업을 위해 고려했던 다른 선택지를 함께 알아보자.

구조적 튜플(Structural Tuple)

val course = ("BE", "10")

구조적 튜플은 여러 값을 하나의 객체로 묶는 방법으로 자바 언어에서 제공하지 않는 기능이다. 타입 안정성을 보장하지 못하고 코드의 가독성을 떨어뜨리는 단점이 있다.

자바 언어 개발자들은 튜플의 명명(nominal)된 형태인 Record 클래스를 설계하였고 도입하였다. 이 선택의 이면에는 자바 언어의 설계 철학이 담겨 있는데, 이와 배경 지식인 명시적 타이핑(Nominal Typing)에 대해 알아보자.

자바의 명시적 타이핑 개발 철학

명시적 타이핑(Nominal Typing)이란, 타입의 이름을 기준으로 타입의 동일성이나 호환성을 판단하는 타입 시스템이다.

따라서 명시적 타이핑 언어에서 객체의 타입은 해당 클래스의 이름에 의해 결정되며 객체의 타입이 클래스의 구조나 속성에 의존하지 않는다. 쉽게 말해 서로 다른 이름의 클래스는 서로 다른 타입으로 간주된다.

자바의 핵심 철학 중 하나는 이름은 중요하다이다. 자바는 클래스의 이름을 바탕으로 타입을 결정하였고, 이를 통해 코드의 가독성을 높이고, 타입 안정성을 보장하였다. 이 철학에 따르면 앞서 살펴본 구조적 튜플은 자바에 적합하지 않다.

일반 클래스가 아닌 별도의 Record를 도입한 이유

기본적으로 자바의 일반 클래스는 상태와 동작을 모두 포함할 수 있으며, 상태가 가변적일 수 있다. 하지만 데이터를 모델링하기 위한 목적에서는 동작을 포함할 이유가 없었고, 외부로 값을 주고 받는 과정에서 주로 사용될 목적이었기 때문에 가변일 필요도 없었다.

결론적으로 단순히 데이터를 표현하기 위한 객체가 필요했기에 이를 위해 Record 클래스를 도입했다. 자바 철학에 맞게 명시적 타이핑을 지원하는 Record 클래스를 도입하여 데이터 모델링을 간소화하였고, 타입 안정성도 확보할 수 있었다.

Record의 확장

Record 클래스는 내부적으로 java.lang.Record 클래스를 암시적으로 상속받는 final 클래스이기 때문에 다른 클래스를 상속 받거나 다른 클래스가 상속하는 것이 불가능하다. 따라서 확장이 필요한 경우, 다른 인터페이스를 implements하여 구현하는 것만 가능하다.