IMCAT.DEV
로그인 가입
C# 고급 문법

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;

    6. 정리

  • C#의 최신 기능인 레코드 타입과 패턴 매칭은 코드의 가독성과 유지보수성을 높입니다.
  • 레코드는 불변성을 가지며, 데이터 전송에 유용합니다.
  • 패턴 매칭은 객체의 타입에 따라 유연하게 처리할 수 있는 방법입니다.
  • 다음에 학습하면 좋은 주제: 비동기 프로그래밍, LINQ, 고급 C# 디자인 패턴.