개요
안녕하세요. 이번 글에서는 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# 프로퍼티에 대해 간단히 알아보았습니다.