개발/C#

C# 프로퍼티

bohlee 2025. 2. 12. 18:16

 

이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.


C++ 에서는 객체의 private 필드에 접근하기 위해 Getter와 Setter를 사용합니다. private으로 캡슐화를 통해 접근을 제한하고 정해진 Getter와 Setter를 통해 데이터의 유효성을 검사하여 코드의 안정성을 높이는 것 입니다. 그리고 C#에는 프로퍼티가 있습니다.

 

기본 Property

C#의 프로퍼티는 Getter/Setter와 같이 객체의 필드의 접근하기 위한 방법을 제공해주는 멤버입니다. 아래에는 프로퍼티를 사용하지 않은 Getter/Setter를 가지고 있는 클래스 입니다.

class MyClass
{
    private string name;

    public string GetName()
    {
    	return name;
    }
    
    public void SetName(string NewName)
    {
    	name = NewName;
    }
}

위 예시를 프로퍼티로 사용하여 나타내면 아래와 같습니다.

class MyClass
{
    private string name;
    
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

위 예시의 Name이 프로퍼티이며 set 접근자 안의 value 키워드는 암묵적인 매개변수로 예약되어 사용됩니다. 위의 프로퍼티는 아래의 예시와 같이 필드처럼 사용할 수 있습니다.

MyClass obj = new MyClass();
obj.Name = "Bob"
Console.WriteLine(obj.Name); // print: "Bob"

생성자 함께 사용할 수도 있습니다.

MyClass obj = new MyClass() { Name = "Bob" };
Console.WriteLine(obj.Name); // print: "Bob"

또한 프로퍼티는 get, set을 모두 사용하는 것이 필수 적인지 않기 때문에 get만을 사용하여 읽기전용으로 작성할 수도 있습니다.

class MyClass
{
    private string name;
    
    public string Name
    {
        get { return name; }
    }
}

 

자동 구현 프로퍼티

필드를 작성할 필요 없이 프로퍼티만 작성하여, 필드를 컴파일러가 자동으로 생성하여 관리할 수 있게하는 기능입니다. 위 예시를 자동 구현 프로퍼티로 변환하면 아래와 같습니다.

class MyClass
{
    public string Name { get; set; }
}

또한 선언과 동시에 초기화도 가능합니다.

class MyClass
{
    public string Name { get; set; } = "Bob";
}

 

초기화 프로퍼티

C#9.0 전에는 프로퍼티에 get 접근자만 선언한 읽기전용 프로퍼티로 데이터 오염을 방지하였습니다. 이 후에는 init 키워드를 사용하여 초기화 전용 자동 구현 프로퍼티를 사용함으로 더욱 가독성 있는 코드를 작성할 수 있게 되었습니다.  init으로 선언된 프로퍼티는 초기화 이후 set이 금지됩니다.

class MyClass
{
    private string	name;
    private int		id;
    
    public MyClass(string Name, int Id)
    {
    	name = Name;
        id = Id;
    }
    
    public string	Name	{ get{return name;} }
    public int		Id	{ get{return id;} }
}

 

위 읽기전용 프로퍼티 코드를 init 키워드를 사용하면 아래와 같이 변환할 수 있습니다.

class MyClass
{
    public string	Name	{ get; init; }
    public int		Id	{ get; init; }
}

개발자가 초기화 후에 set 프로퍼티에 접근하게 되면 컴파일러는 오류를 발생시킵니다.

MyClass obj = new MyClass() { Name = "Bob", Id = 1 };
obj.Name = "Alice"; //Error
CS8852 Init-only property or indexer 'MyClass.Name' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor.