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 |