Record 클래스와 명시적 타이핑 #17
Replies: 3 comments
-
1. 명시적 타이핑(Nominal Typing)이란 무엇인가요?필드가 모두 같은 두 클래스(A.class, B.class)가 있다고 가정하겠습니다! 이렇게 타입의 이름으로 두 타입이 같은지 아닌지를 판단하는 방식을 명시적 타이핑이라고 합니다. 반대 용어로는 구조적 타이핑이 있는데요, 2. 자바 Record 클래스는 무엇인가요?record는 불변 클래스입니다. 코드아래 두 코드는 같은 역할을 합니다 record는
3. 자바 Record는 구조적 타이핑이 아닌 명시적 타이핑을 어떻게 따르나요?마찬가지로 같은 컴포넌트의 record 클래스도 같은 타입으로 취급해 사용할 수 없습니다. (equals 메서드를 사용해 비교했을 때에도 false가 나옵니다) Record도 단순히 데이터 저장하는 값 객체라고 생각하기보단, 이름을 가진 데이터 묶음으로 생각하면 될 것 같아요. |
Beta Was this translation helpful? Give feedback.
-
|
명시적 타이핑(Nominal Typing)은 자바는 기본적으로 “어떤 필드와 메서드를 가지고 있는가”보다, 예를 들어 Record 클래스도 이 철학을 유지합니다. 하지만 구조가 같은 Record끼리 자동으로 호환되지는 않습니다. 그래서 Record의 핵심은 단순히 보일러플레이트를 줄이는 것을 넘어, 명시적 타이핑이란 무엇인가?명시적 타이핑, 즉 Nominal Typing은 타입의 구조가 같더라도 이름이 다르면 서로 다른 타입으로 보는 방식입니다. 예를 들어 아래 두 클래스는 구조가 같습니다. public class Member {
private final String name;
private final int age;
}
public class Guest {
private final String name;
private final int age;
}둘 다 하지만 자바에서는 Member member = new Member("moca", 20);
Guest guest = member; // 컴파일 에러즉, 자바는 “필드 구조가 같은가?”보다 타입 이름이 무엇인가?, **명시적으로 어떤 타입으로 선언되었는가?**를 중요하게 봅니다. 그래서 저는 자바의 타입 시스템을 이렇게 이해했습니다.
구조적 타이핑과의 차이구조적 타이핑은 이름보다 구조를 기준으로 타입 호환성을 판단하는 방식입니다. 즉, 어떤 객체가 필요한 필드나 메서드를 가지고 있다면 같은 타입처럼 사용할 수 있다는 관점입니다. 반면 명시적 타이핑은 구조가 같아도 이름이 다르면 다른 타입으로 봅니다.
자바는 명시적 타이핑을 따르기 때문에, 구조가 우연히 같다는 이유만으로 서로 다른 의미의 객체가 섞이는 것을 막을 수 있습니다. 예를 들어 하나는 예약 요청이고, 다른 하나는 회원 생성 요청입니다. 구조만 보고 같은 타입처럼 다루면 의미가 섞일 수 있습니다. Record 클래스는 무엇인가?Record는 데이터를 담는 클래스를 간결하게 선언하기 위해 도입된 자바 문법이라고 생각합니다. 기존에는 단순히 데이터를 담는 클래스를 만들기 위해 많은 반복 코드가 필요했습니다. public class MemberResponse {
private final String name;
private final int age;
public MemberResponse(String name, int age) {
this.name = name;
this.age = age;
}
public String name() {
return name;
}
public int age() {
return age;
}
// equals, hashCode, toString ...
}Record를 사용하면 아래처럼 줄일 수 있습니다. public record MemberResponse(String name, int age) {
}이 선언만으로 자바는 자동으로 아래 요소들을 만들어줍니다. - private final 필드
- 모든 필드를 받는 생성자
- 각 필드에 접근하는 accessor
- equals()
- hashCode()
- toString()즉, Record는 “이 클래스는 데이터를 담는 목적이 강하다”는 의도를 언어 차원에서 표현하는 방법이라고 볼 수 있습니다. Record는 어떻게 명시적 타이핑을 따르는가?Record는 구조적 타이핑을 도입한 기능이 아닙니다. 예를 들어 아래 두 Record는 구조가 완전히 같습니다. public record MemberResponse(String name, int age) {
}
public record GuestResponse(String name, int age) {
}둘 다 하지만 자바에서는 두 타입을 서로 호환하지 않습니다. MemberResponse member = new MemberResponse("moca", 20);
GuestResponse guest = member; // 컴파일 에러구조가 같아도 이름이 다르기 때문입니다. 즉, Record도 일반 클래스와 마찬가지로 타입 이름을 기준으로 구분됩니다. 그래서 Record는 “같은 필드를 가지면 같은 타입이다”가 아니라, Record의 도입 배경을 명시적 타이핑 관점에서 보면Record가 등장한 이유를 단순히 “코드를 짧게 쓰기 위해서”로만 보면 조금 아쉬운 것 같습니다. 물론 Record는 보일러플레이트를 줄여줍니다. 하지만 더 중요한 점은, 데이터 중심 타입을 명확한 이름으로 선언할 수 있게 해준다는 점이라고 생각합니다. 예를 들어 아래 두 요청은 구조가 같을 수 있습니다. public record ReservationRequest(String name, Long timeId) {
}
public record WaitingRequest(String name, Long timeId) {
}두 Record는 같은 필드를 가지지만 의미는 다릅니다. 하나는 예약 요청이고, 다른 하나는 대기 요청입니다. 자바는 이 둘을 구조가 같다고 같은 타입으로 취급하지 않습니다. 각각 다른 이름을 가진 타입으로 구분합니다. 이 덕분에 개발자는 데이터 구조뿐 아니라 도메인 의미를 타입 이름으로 표현할 수 있습니다. Record를 사용할 때 얻는 장점Record를 사용하면 데이터 전달용 객체를 간결하게 만들 수 있습니다. 특히 DTO, 응답 객체, 값 묶음처럼 불변 데이터 컨테이너가 필요한 경우에 잘 어울립니다. public record ReservationResponse(
Long id,
String name,
String date,
String time
) {
}이렇게 작성하면 코드가 짧아지고, 이 객체가 주로 데이터를 담기 위한 객체라는 의도가 드러납니다. 또 필드가 기본적으로
다만 Record는 도메인 행위가 풍부한 객체보다는, 주로 데이터를 표현하는 객체에 더 잘 맞는다고 생각합니다. Record 사용 시 주의할 점Record는 편리하지만 모든 클래스의 대체재는 아니라고 생각합니다. Record는 상속을 받을 수 없고, 필드가 final이며, 주 생성자에 정의한 컴포넌트가 객체의 상태를 이룹니다. 따라서 상태 변화가 많거나 복잡한 생명주기를 가지는 객체에는 어울리지 않을 수 있습니다. 또 Record를 DTO에 사용할 때는 적합한 경우가 많지만, 도메인 객체에 사용할 때는 고민이 필요합니다. 도메인 객체가 단순 데이터 묶음이 아니라 행위와 불변식을 풍부하게 가져야 한다면, 일반 클래스로 표현하는 편이 더 자연스러울 수 있습니다. 즉, Record는 “짧으니까 무조건 사용한다”보다, 정리정리하면 저는 이렇게 이해했습니다.
결론적으로 Record는 자바에 구조적 타이핑을 도입한 기능이 아닙니다. Record는 명시적 타이핑이라는 자바의 철학을 유지하면서, 데이터 중심 클래스를 더 간결하게 작성할 수 있게 해주는 기능이라고 생각합니다. 즉, Record의 핵심은 단순히 보일러플레이트를 줄이는 것이 아니라, |
Beta Was this translation helpful? Give feedback.
-
명시적 타이핑이란 무엇인가?명시적 타이핑이란 타입의 이름을 기준으로 타입의 동일성이나 호환성을 판단하는 타입시스템을 의미합니다. 쉽게 말해서 서로 다른 이름의 클래스는 서로 다른 타입으로 간주하는 것을 의미합니다. 명시적 타이핑의 반대 사례인 구조적 튜플을 예로 들어 설명하면, val course = ("BE", "10")과 같이 데이터를 표현하면, 타입 안정성이 보장되지 않을 뿐더러 코드의 가독성을 떨어뜨리는 단점이 있습니다. 자바의 중요한 철학 중 하나인 "이름은 중요한 역할을 한다"를 위반하는 사례로 실제로 자바에서도 지원하지 않는 문법입니다. 즉, 명시적 타이핑은 자바 철학의 기본이 되는 시스템이며, 자바 언어 개발자들은 지금까지 이 명시적 타이핑을 기본 철학으로 기능을 도입해왔습니다. 그 중 하나가 바로 Record 클래스로 명시적 타이핑이 적용된, 명명된 형태의 튜플이라고 이해할 수 있습니다. 자바 Record 클래스는 무엇인가요?Record 클래스는 데이터를 더 손쉽게 표현하기 위해 등장한 기능입니다. 기존의 비즈니스 로직이 담긴 엔티티 중심의 설계에서 데이터를 모델링하기 위한 용도로 클래스 사용이 변화되면서, 데이터를 손쉽게 표현할 기능이 필요했습니다. 이를 위해 일반 클래스와 별도로 Record클래스를 도입해 데이터를 쉽게 표현할 수 있도록 제공하였습니다. 데이터는 상태만 가지면 될 뿐 행위를 가질 필요가 없었고, 외부로 이동하고 움직이는 과정이 많다보니 가변일 필요도 없었습니다. 따라서 Record는 이름을 가진 타입으로 데이터를 표현할 수 있게 제공하였고, 데이터 접근 혹은 구분시에 필요한 보일러 플레이트 코드도 함께 제공하고 있습니다. 자바 Record는 구조적 타이핑이 아닌 명시적 타이핑을 어떻게 따르나요?결국 Record도 자바의 클래스의 일종이며 타입입니다. 따라서 명시적 타이핑을 따르며 클래스 명을 기준으로 타입이 결정됩니다. Record는 일반 클래스와는 다르게 내부적으로 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
자바는 명시적 타이핑(Nominal Typing)을 바탕으로 신규 기능을 추가한 적이 많습니다. Record 클래스도 마찬가지인데요, 이 철학을 이해하고 Record 클래스의 도입 배경을 학습해봅시다.
발제 의도: Record 클래스 등장 배경 속의 자바 철학(명시적 타이핑)을 이해해보자.질문
Beta Was this translation helpful? Give feedback.
All reactions