Search

이것이 C#이다: 9장 - 프로퍼티 (2/2)

서론

C# 프로퍼티의 기본 개념을 이해했다면, 이제 더 깊이 들어가 볼 차례입니다. 이번 포스트에서는 C# 9.0에서 새롭게 도입된 기능들과 함께, 프로퍼티의 고급 활용 방법을 살펴보겠습니다.

본론

1. required 키워드로 프로퍼티 초기화 강제하기

C# 11에서 도입된 required 키워드는 객체 생성 시 특정 프로퍼티의 초기화를 강제합니다. 이는 객체의 유효성을 보장하는 강력한 도구입니다.
public class Person { public required string Name { get; init; } public required int Age { get; init; } } // 사용 var person = new Person { Name = "Alice", Age = 30 }; // OK // var invalidPerson = new Person(); // 컴파일 에러! Name과 Age가 초기화되지 않음
C#
복사
required 키워드를 사용하면, 객체 생성 시 반드시 해당 프로퍼티를 초기화해야 합니다. 이는 특히 init 접근자와 함께 사용될 때 더욱 유용합니다.

2. 레코드(Record)로 불변 객체 만들기

C# 9.0에서 도입된 레코드는 불변 객체를 쉽게 만들 수 있게 해줍니다. 레코드는 값 기반 의미 체계를 가진 참조 형식입니다.
public record Person(string Name, int Age); // 사용 var person1 = new Person("Bob", 25); var person2 = person1 with { Age = 26 }; // 새로운 객체 생성
C#
복사
레코드는 자동으로 Equals, GetHashCode, ToString 메서드를 구현합니다. 또한 with 표현식을 사용해 불변 객체의 일부 프로퍼티만 변경한 새 객체를 쉽게 만들 수 있습니다.

3. 무명 형식(Anonymous Type)과 프로퍼티

무명 형식은 이름 없는 클래스를 즉석에서 만들어 사용할 수 있게 해줍니다. 주로 LINQ 쿼리에서 투영 결과를 담는 데 사용됩니다.
var anonymousPerson = new { Name = "Charlie", Age = 35 }; Console.WriteLine($"{anonymousPerson.Name} is {anonymousPerson.Age} years old.");
C#
복사
무명 형식의 프로퍼티는 읽기 전용이며, 한 번 초기화되면 변경할 수 없습니다.

4. 인터페이스의 프로퍼티

인터페이스에도 프로퍼티를 선언할 수 있습니다. 이는 클래스가 특정 프로퍼티를 반드시 구현하도록 강제하는 데 유용합니다.
public interface IPerson { string Name { get; set; } int Age { get; } } public class Employee : IPerson { public string Name { get; set; } public int Age { get; private set; } }
C#
복사
인터페이스의 프로퍼티를 구현할 때, 접근자의 가시성을 더 개방적으로 변경할 수 있습니다. 예를 들어, 읽기 전용 프로퍼티를 읽기-쓰기 프로퍼티로 구현할 수 있습니다.

5. 추상 클래스의 프로퍼티

추상 클래스에서는 일반 프로퍼티와 추상 프로퍼티를 모두 정의할 수 있습니다. 추상 프로퍼티는 파생 클래스에서 반드시 구현해야 합니다.
public abstract class Animal { public abstract string Species { get; } // 추상 프로퍼티 public int Age { get; set; } // 일반 프로퍼티 } public class Dog : Animal { public override string Species => "Canine"; // 추상 프로퍼티 구현 }
C#
복사
추상 프로퍼티는 인터페이스의 프로퍼티와 유사하지만, 추상 클래스에서는 일부 구현을 제공할 수 있다는 점이 다릅니다.

결론

프로퍼티를 학습하면서, C#이 얼마나 개발자 친화적인 언어인지 다시 한 번 느꼈습니다. 필드에 대한 접근을 제어하면서도, 마치 필드를 직접 다루는 것처럼 간결한 문법을 제공하는 프로퍼티는 정말 강력한 도구입니다. 프로퍼티에 대해 학습하면서, C#의 철학이 '개발자의 생산성'에 얼마나 초점을 맞추고 있는지 깨달았습니다.

참고 자료

박상현, "이것이 C#이다", 한빛미디어, 2023