반응형
record 사용 예제
- C# 9.0에서 추가
- 값 중심의 불변성(Immurable) 객체
public record GiveItemRequest(int itemId, int itemCount);
C# 레코드(record) 타입 문법을 사용한 불변(Immutable) 데이터 모델을 정의한다.
간단히 말하자면 요청을 표현하는 데이터 전용 객체(DTO)를 아주 간결하게 표현한 것이다.
위에 코드를 풀어서 작성해 보자면, 이러한 형태가 된다.
public class GiveItemRequest
{
public int itemId { get; init; }
public int itemCount { get; init; }
public GiveItemRequest(int itemId, int itemCount) =>
(itemId, itemCount) = (itemId, itemCount);
// Equals, GetHashCode, ToString 등도 자동구현
}
record를 사용하면 다음과 같은 클래스를 자동으로 만들어준다.
record 선언 방식 비교 : 주 생성자 스타일 vs 속성 선언 스타일
record 타입을 선언하는 스타일에 대해서 알아보자. 위에 사용예제에서 선언된 방식은 주 생성자 스타일이다.
// 1. 주생성자(short-form) 방식
public record RewardInfo(int UserId, string RewardType, int Amount);
// 2. 프로퍼티 방식
public record RewardInfo
{
public int UserId { get; init; }
public string RewardType { get; init; }
public int Amount { get; init; }
}
항목 | 주생성자 스타일 | 속성 선언 스타일 |
코드 길이 | 매우 짧고 간결 | 길지만 명시적 |
JSON 직렬화/역직렬화 | 잘 됨 | 잘 됨 |
속성별 세부 설정 | 불편함 (거의 못 함) | 자유로움(가능) |
기본값 설정 | 어렵거나 추가 코드 필요 | 매우 쉬움 (init 바로 가능) |
추가 메서드 작성 | 불편하거나 중복 생김 | 자연스럽게 메서드 추가 가능 |
- 간단하게 선언할 때 > 주 생성자 스타일
- 세밀하게 제어하고 싶을 때 > 속성 선언 스타일
왜 record를 써야 할까?
- 불변성 : init 속성만 제공해 값 변경 불가 > 안전한 데이터 객체 생성
- 값 기반 비교 : Equals()와 == 가 내용을 기준으로 비교함
- ToString() 자동 생성 : 디버깅, 로깅에 유용
- 복사 편리 : with 키워드로 불변 객체 복사 쉽게 가능
- DTO에 최적화 : API 요청/응답 모델 등 "값을 담는 그릇"에 적합
언제 사용하나요?
- Web API 요청/응답 DTO
- Command / Query 객체 (CQRS 패턴)
- 메시지 큐 전송 객체
- 유닛 테스트용 입력값 모델
정리하자면
- record 키워드는 간결하고 안전한 값 중심의 데이터 모델을 정의하는 방식을 제공한다.
- 주로 요청 DTO, 커맨드 객체, 메시지 객체로 사용된다.
함께 읽으면 좋은 글
C# Record Explained - NDepend Blog
A C# record is a C# class with special syntax and behaviors generated by the compiler to make it better suited for data-centric scenarios.
blog.ndepend.com
'프로그래밍 > C#' 카테고리의 다른 글
C# get-only 속성에 대해서 알아보자 (0) | 2025.04.28 |
---|---|
C# 실무에서 사용하는 전역 JSON 옵션 설정 (0) | 2025.04.28 |
Entity Framework에서 [NotMapped] 속성 (0) | 2025.04.26 |
C# is 패턴 매칭(Pattern Matching)에 대해서 알아보자 (0) | 2025.04.26 |
JWT를 활용해서 C# 서버에서 사용자 인증 처리하기 (0) | 2025.04.23 |
댓글