[객체지향] 2.C# 최신 문법과 기능 활용, C# 9.0 이후부터 도입된 최신 문법 (예 기록 타입, init 접근자)

C#은 지속적으로 발전해온 프로그래밍 언어로서, 매 버전마다 새로운 문법과 기능들이 추가되어 개발자들에게 더 나은 프로그래밍 경험을 제공합니다. C# 9.0은 특히 몇 가지 중요한 문법적 변화와 기능들을 도입하였고, 이는 개발자들이 코드를 더욱 간결하고 가독성 높게 작성할 수 있도록 도와줍니다.

1. 기록 타입 (Record Types)

C# 9.0에서 가장 주목받는 기능 중 하나는 기록 타입입니다. 기록 타입은 데이터를 불변으로 다루기 위해 설계되었으며, 주로 데이터 전송 객체(DTO)나 비즈니스 로직에서 널리 사용됩니다. 기본적인 차별점은 객체 간의 비교를 보다 쉽게 해 준다는 것입니다.

기록 타입의 정의

public record Person(string Name, int Age);

위와 같이 기록 타입을 정의하면, 자동으로 Equals, GetHashCode, ToString 메서드가 생성됩니다.

기록 타입의 사용 예


var person1 = new Person("Alice", 30);
var person2 = new Person("Alice", 30);
Console.WriteLine(person1 == person2); // True
    

이 예제에서 보듯이, 같은 값을 가진 두 기록 타입 인스턴스는 동일한 것으로 간주됩니다. 그리고 기록 타입은 불변성을 보장하므로, 값을 변경할 수 없습니다.

2. init 접근자

C# 9.0은 init 접근자를 도입하여 객체 초기화에 관한 수정 사항을 제공합니다. 기존의 set 접근자는 객체의 상태를 변경할 수 있었지만, init 접근자는 객체 생성 시에만 속성을 설정할 수 있게 합니다.

init 접근자의 예

public class Person
{
    public string Name { get; init; }
    public int Age { get; init; }
}

아래와 같이 사용할 수 있습니다:


var person = new Person { Name = "Bob", Age = 25 };
// person.Age = 26; // 컴파일 오류
    

위의 예제에서 Age 속성에 대한 변경 시도는 컴파일 오류를 발생시킵니다. 이는 객체 지향 프로그래밍에서 불변 객체의 개념을 지키는 데 큰 도움이 됩니다.

3. 반기능 (Target-typed new expressions)

C# 9.0에서 추가된 반기능을 활용하면, 객체를 생성할 때 타입을 생략할 수 있습니다. 이는 코드의 간결함을 높이며, 가독성을 향상시킵니다.

예제

List<int> list = new(); // C# 9.0의 반기능 사용
    

위와 같이 사용하면, 일반적인 new List<int>() 대신 타입을 생략할 수 있습니다.

4. 상수 (Static Abstract Members in Interfaces)

C# 9.0은 인터페이스에 정적 멤버를 선언할 수 있는 기능을 추가하였습니다. 이 기능을 통해 인터페이스에서 상수를 정의하여 다양한 구현에서 이를 사용할 수 있습니다.

예제

public interface IShape
{
    static abstract double Area();
}

public class Circle : IShape
{
    public static double Area() => Math.PI * radius * radius;
}
    

이와 같은 방식으로 상수 또는 상수성을 가진 메서드를 정의할 수 있습니다.

5. 간편한 패턴 매칭 (Enhanced Pattern Matching)

C# 9.0에서는 패턴 매칭 기능이 강화되어 더 많은 조건을 명시적으로 표현할 수 있습니다. 특히, is 키워드를 활용한 패턴 매칭에서 개선된 기능들을 활용할 수 있습니다.

예제


if (obj is int number)
{
    Console.WriteLine($"The number is: {number}");
}
    

위 예제는 객체가 int 타입인 경우에만 조건이 만족하며, 만족할 경우 해당 값을 number로 사용할 수 있습니다.

결론

C# 9.0 이후로 도입된 이러한 다양한 문법과 기능들은 개발자들이 더 안전하고 효율적인 코드를 작성할 수 있도록 돕습니다. 기록 타입과 init 접근자, 반기능, 그리고 강화된 패턴 매칭 등은 특히 높은 가독성과 유지보수성을 제공하므로, 적극적으로 활용하는 것이 좋습니다. 앞으로의 C#에서 어떤 혁신이 있을지 기대가 됩니다!