[C#] 프로퍼티(Property) : get, set, 자동 구현

[C#] 프로퍼티(Property) : get, set, 자동 구현

개요

안녕하세요. 이번 글에서는 C#의 프로퍼티(Property)에 대해 알아보겠습니다. 프로퍼티는 필드(field)를 안전하게 읽고 쓰기 위한 통로입니다. 필드를 그냥 public으로 열면 외부에서 아무 값이나 넣을 수 있지만, 프로퍼티를 쓰면 값을 읽을 때(get)와 쓸 때(set) 동작을 제어할 수 있습니다.

필드를 그냥 public으로 열면 생기는 문제

먼저 필드를 직접 공개했을 때를 보겠습니다. 외부에서 값 검증 없이 아무 값이나 넣을 수 있습니다.

class Person
{
    public int Age;   // 그냥 공개된 필드
}

Person p = new Person();
p.Age = -5;   // 막을 방법이 없음 (음수 나이가 들어가 버림)

프로퍼티 기본 — get, set

프로퍼티는 내부의 private 필드를 두고, get(읽기)과 set(쓰기) 블록을 통해 접근하게 합니다. set 안의 value는 “넣으려는 값”을 가리키는 키워드입니다.

class Person
{
    private int age;          // 실제 데이터는 private 필드에

    public int Age
    {
        get { return age; }           // 읽을 때
        set
        {
            if (value < 0) value = 0; // 쓸 때 검증 (음수면 0으로)
            age = value;              // value = 넣으려는 값
        }
    }
}

Person p = new Person();
p.Age = -5;              // set 호출 → 검증되어 0으로
Console.WriteLine(p.Age); // get 호출 → 0

p.Age = -5;처럼 쓰면 set이, p.Age로 읽으면 get이 자동으로 호출됩니다. 겉보기엔 필드처럼 쓰지만 내부에서 검증·가공이 가능합니다.

자동 구현 프로퍼티

특별한 검증 없이 단순히 값만 담을 때는, 필드를 직접 선언하지 않고 자동 구현 프로퍼티(auto-property)로 짧게 쓸 수 있습니다. 컴파일러가 내부 필드를 알아서 만들어 줍니다.

class Person
{
    public int Age { get; set; }          // 자동 구현 프로퍼티
    public string Name { get; set; } = ""; // 기본값 지정도 가능
}

읽기 전용 / 접근 제한

get·set 각각에 접근 범위를 다르게 줄 수 있습니다. 외부에서는 읽기만 하고, 값 변경은 클래스 내부에서만 하도록 자주 씁니다.

class Account
{
    public int Balance { get; private set; } // 읽기는 public, 쓰기는 내부만

    public void Deposit(int amount)
    {
        Balance += amount;   // 내부에서는 set 가능
    }
}

Account a = new Account();
a.Deposit(1000);
// a.Balance = 9999;   // 에러: set이 private

{ get; }만 두거나 get; init;(C# 9)을 쓰면 생성 이후 변경을 더 강하게 막을 수도 있습니다.

표현식 본문 프로퍼티

계산해서 돌려주기만 하는 읽기 전용 프로퍼티는 =>로 짧게 쓸 수 있습니다.

class Rectangle
{
    public int Width { get; set; }
    public int Height { get; set; }

    public int Area => Width * Height;  // 읽기 전용, 계산해서 반환
}

정리

  • 프로퍼티는 필드를 안전하게 읽고(get)·쓰기(set) 위한 통로다.
  • set 안의 value는 넣으려는 값을 가리킨다 (검증·가공 가능).
  • 검증이 필요 없으면 자동 구현 프로퍼티({ get; set; })로 짧게.
  • 외부 읽기만 허용하려면 get; private set;.
  • 계산해서 반환만 하면 => 표현식 본문으로 간결하게.

필드를 그대로 열지 않고 프로퍼티로 감싸면, 겉보기는 필드처럼 쓰면서도 값 검증과 접근 제어를 할 수 있습니다. 이상으로 C# 프로퍼티에 대해 간단히 알아보았습니다.

참고