본문 바로가기
개발💻/C#

익명 타입 vs record 실전 선택 가이드

by Sports Entrepreneur 2025. 4. 20.

1. 개념 비교

익명 타입 (Anonymous Type)

익명 타입은 이름 없는 클래스를 컴파일러가 자동 생성하여 사용할 수 있게 해주는 문법이다.
주로 LINQ 쿼리 안에서 일시적인 데이터를 묶어 처리할 때 사용된다.

  • 속성은 get만 존재하는 읽기 전용 (불변)
  • var 키워드를 통해 타입 추론 필수
  • 객체 외부에서 타입 사용 불가 (매개변수, 반환값 등)
 
var temp = new { Name = "Alice", Age = 30 };
Console.WriteLine(temp.Name);

record

record는 C# 9.0에서 도입된 불변 참조형 타입이다.
불변 객체를 간결하게 선언할 수 있으며, with 키워드를 통해 일부 값을 수정한 복사본을 쉽게 생성할 수 있다.

  • 클래스처럼 메서드, 인터페이스, 상속 가능
  • Equals, ToString, GetHashCode 자동 구현
  • init 접근자를 통해 생성 이후 속성 변경 방지
public record User(string Name, int Age);

var user1 = new User("Alice", 30);
var user2 = user1 with { Name = "Bob" };

2. 실무 사용 예시 및 차이

예시 1. LINQ 내부 데이터 가공

var products = new[]
{
    new { Name = "Laptop", Price = 1200 },
    new { Name = "Tablet", Price = 700 }
};

var discounted = products
    .Where(p => p.Price > 1000)
    .Select(p => new { p.Name, DiscountedPrice = p.Price * 0.9 });

foreach (var item in discounted)
{
    Console.WriteLine($"{item.Name}: {item.DiscountedPrice}");
}


익명 타입 장점:

  • 빠르게 필드를 정의할 수 있음
  • 별도 클래스 없이 일시적인 데이터 처리 가능
  • 불필요한 클래스 남발 방지

제한점:

  • 타입 이름이 없어 반환 불가
  • 로직 추가 불가

임시적인 가공 결과에 적합


예시 2. API 응답 모델, 테스트 DTO

 
public record ProductDto(string Name, double Price);

[HttpGet("/api/product")]
public IActionResult GetProduct()
{
    return Ok(new ProductDto("Monitor", 250.0));
}

record 장점:

  • 명확한 타입 정의로 유지보수 용이
  • 직렬화 및 역직렬화 시 안정적 (JSON 변환 가능)
  • 구조화된 데이터 모델에 적합

ViewModel, DTO, Entity, 테스트 데이터 등에 적합


3. 실무 기준 선택 요약

상확 익명 타입 record
LINQ Select 후 결과 가공 ✅ 적합 ❌ 불필요하게 무거움
콘솔 출력용 로그 데이터 ✅ 빠름 ❌ 과도한 선언 필요
컨트롤러 API 응답 반환 ❌ 불가 ✅ 직렬화 가능
메서드 인자/반환값으로 사용 ❌ 불가 ✅ 명시적 타입 사용 가능
테스트용 불변 객체 ❌ 재사용 불가 ✅ 비교 및 with 사용 용이
여러 파일에 걸쳐 재사용 ❌ 불가 ✅ 클래스로 관리 가능
유효성 검사, 메서드 포함 ❌ 불가 ✅ 메서드 정의 가능
유지보수 고려 ❌ 리팩토링 어려움 ✅ 구조화 가능

4. 비교 정리 표


항목 익명 타입 record
타입 이름 없음 있음
선언 방식 new { } record, record class/struct
속성 수정 불가 (읽기 전용) 가능 (with 이용)
재사용 불가 (로컬 범위) 가능 (전역 정의)
메서드 정의 불가 가능
상속/인터페이스 불가 가능
JSON 직렬화 미지원 또는 불안정 안정적
pattern matching 제한적 지원 (deconstruct)

5. 결론

목적 추천
일회성 데이터 가공 익명 타입
구조화된 데이터 모델링 record
복사, 비교, 직렬화 record
단순 로그용 객체 익명 타입
외부로 전달하는 객체 record

현업에서는 간결하고 반복되지 않는 데이터 처리에는 익명 타입을,
명확한 책임이 있는 구조화된 데이터 모델에는 record를 사용하는 것이 일반적이다.

코드 유지보수성과 테스트 전략까지 고려한다면 대부분의 경우 record 사용이 장기적으로 유리하다.

'개발💻 > C#' 카테고리의 다른 글

[C#] C#와 AI 기술  (0) 2025.02.09
[C#] Span<T> vs Memory<T>  (0) 2025.01.18
[C#] Dynamic 타입: 유연성과 주의점  (0) 2024.11.30
[C#] 구조체와 클래스의 차이  (0) 2024.10.06
[C#] readonly와 const의 차이  (0) 2024.10.05