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#에서 어떤 혁신이 있을지 기대가 됩니다!