본문 바로가기
프로그래밍/C#

C# record에 대해서 알아보자

by bantomak 2025. 4. 26.
반응형

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는 불변이기 때문에 값을 수정할 수 없다.

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

댓글