학습
C# C#의 최신 기능 탐색
C# C#의 최신 기능 탐색 — 고급
C#의 최신 기능 탐색
1. 도입 (왜 배워야 하는가)
C#은 지속적으로 발전하며, 최신 기능을 활용하는 것은 개발자로서의 경쟁력을 높이는 데 매우 중요합니다. 새로운 기능들은 코드의 가독성을 높이고, 생산성을 향상시키며, 성능을 개선하는 데 기여합니다. 만약 최신 기능을 모르고 구식 방법만 사용한다면, 코드가 복잡해지고 유지보수 비용이 증가하며, 팀원들과의 협업에서 어려움을 겪을 수 있습니다. 따라서 최신 기능을 배우는 것은 실무에서 바로 활용할 수 있는 능력을 키우는 데 필수적입니다.
2. 핵심 개념 설명
C#의 최신 기능 중 주요 몇 가지를 살펴보겠습니다.
2-1. 레코드 타입 (Record Types)
레코드는 불변성을 갖는 데이터 구조체로, 주로 데이터 전송 객체(DTO)로 사용됩니다. 레코드는 클래스보다 더 간결하게 데이터를 정의할 수 있습니다.
비유: 레코드는 ‘신청서’와 같습니다. 신청서 양식에는 필드가 정해져 있고, 그 필드의 내용은 신청 후 변경되지 않습니다.
| 개념 | 설명 |
|---|---|
| 레코드 | 불변성을 가진 데이터 구조체 |
| 클래스 | 상태와 행위를 모두 포함하는 객체 |
2-2. 패턴 매칭 (Pattern Matching)
패턴 매칭은 객체의 타입을 검사하고, 그 타입에 따라 행동을 결정하는 데 사용됩니다. 이는 switch 문과 함께 사용할 수 있어 코드의 가독성을 높입니다.
비유: 패턴 매칭은 ‘상황에 맞는 행동 선택’과 같습니다. 예를 들어, 날씨에 따라 우산을 가져갈지, 선글라스를 가져갈지를 결정하는 것과 비슷합니다.
3. 기본 코드 예제
레코드 타입 예제
public record Person(string Name, int Age);
var person = new Person("Alice", 30);
// person.Name = "Bob"; // 오류: 레코드는 불변입니다.
Console.WriteLine(person); // 실행 결과: Person { Name = Alice, Age = 30 }
public record Person(string Name, int Age);:Person이라는 레코드를 정의합니다.var person = new Person("Alice", 30);:Person객체를 생성합니다.Console.WriteLine(person);: 생성된 객체를 출력합니다.
패턴 매칭 예제
object obj = "Hello, World!";
switch (obj)
{
case string str:
Console.WriteLine($"문자열: {str}"); // 실행 결과: 문자열: Hello, World!
break;
case int number:
Console.WriteLine($"정수: {number}");
break;
default:
Console.WriteLine("알 수 없는 타입");
break;
}
object obj = "Hello, World!"; : 객체 obj를 문자열로 초기화합니다.switch (obj) : obj의 타입에 따라 분기합니다.case string str: : obj가 문자열이면 해당 블록을 실행합니다.4. 실전 활용 예제
쇼핑몰에서 장바구니 구현
장바구니에 상품 정보를 저장하기 위해 레코드를 사용할 수 있습니다.
public record Product(string Name, decimal Price);
public class ShoppingCart
{
private List<Product> products = new List<Product>();
public void AddProduct(Product product)
{
products.Add(product);
}
public void ShowCart()
{
foreach (var product in products)
{
Console.WriteLine($"{product.Name}: {product.Price:C}");
}
}
}
// 사용 예
var cart = new ShoppingCart();
cart.AddProduct(new Product("책", 12.99m));
cart.AddProduct(new Product("펜", 1.99m));
cart.ShowCart(); // 실행 결과: 책: $12.99, 펜: $1.99
Product 레코드를 통해 상품 정보를 정의합니다.ShoppingCart 클래스에서 상품을 추가하고 출력합니다.패턴 매칭으로 처리하기
public void HandleInput(object input)
{
switch (input)
{
case string str:
Console.WriteLine($"문자열 처리: {str}");
break;
case int number:
Console.WriteLine($"정수 처리: {number}");
break;
default:
Console.WriteLine("알 수 없는 입력");
break;
}
}
// 사용 예
HandleInput("안녕하세요"); // 실행 결과: 문자열 처리: 안녕하세요
HandleInput(42); // 실행 결과: 정수 처리: 42
5. 흔한 실수와 주의사항
실수 1: 레코드의 불변성 간과하기
잘못된 코드:
person.Name = "Bob"; // 오류 발생
올바른 코드:
var person = person with { Name = "Bob" }; // 새로운 레코드 생성
실수 2: 패턴 매칭의 기본 타입 처리 미비
잘못된 코드:
switch (obj)
{
case string: // 오류: 타입을 지정하지 않음
break;
}
올바른 코드:
case string str: // 타입을 지정해야 함
break;