C#

C# 프로퍼티

상상모음 2025. 3. 12. 15:00

프로퍼티

개념클래스의private 필드를 형식적으로 다루는 일종의 메소드

값을 지정하는 set -접근자와 값을 참조하는 get-접근자로 구성

프로퍼티 정의 형태 

[property-modifiers] returnType PropertyName {
	get {
    	// get-accessor body
    }
    set {
    	// set-accessor body
    }
}
  • 프로퍼티는 필드(변수)의 값을 안전하게 읽고 수정할 수 있도록 하는 방법입니다.
  • get 접근자로 값을 읽고, set 접근자로 값을 설정할 수 있습니다.
  • 캡슐화(Encapsulation) 개념을 적용하여 필드를 직접 수정하는 것을 방지합니다.

 필드(Field) vs. 프로퍼티(Property)

  • 필드(Field): 클래스 내부에서 데이터를 저장하는 변수
  • 프로퍼티(Property): 필드를 감싸서 값을 설정(set)하거나 반환(get)할 수 있도록 한 구조

2. 기본 프로퍼티 사용법

class Person
{
    private string name;  // private 필드

    // 프로퍼티
    public string Name
    {
        get { return name; }   // 값 반환 (Getter)
        set { name = value; }  // 값 설정 (Setter)
    }
}

// 사용 예제
Person p = new Person();
p.Name = "홍길동";  // set 호출
Console.WriteLine(p.Name);  // get 호출 → 홍길동

설명

  • private string name; → private 필드를 직접 접근하지 못하도록 숨김
  • public string Name → 프로퍼티를 통해 필드 name 값을 읽고 변경
  • value 키워드 → set 블록에서 전달받은 값을 나타냄

3. 자동 구현 프로퍼티 (Auto-Implemented Property)

 필드를 선언할 필요 없이 간결하게 프로퍼티를 작성 가능

class Person
{
    public string Name { get; set; }  // 자동 구현 프로퍼티
}

// 사용 예제
Person p = new Person();
p.Name = "이순신";
Console.WriteLine(p.Name);  // 이순신

자동 구현 프로퍼티는 C#이 내부적으로 필드를 자동 생성하여 관리합니다.


4. 읽기 전용(Read-Only) 프로퍼티

 get만 제공하면 읽기 전용 프로퍼티가 됩니다. (set이 없음)

class Person
{
    public string Name { get; } = "홍길동";  // 초기화 후 변경 불가
}

// 사용 예제
Person p = new Person();
Console.WriteLine(p.Name);  // 홍길동
// p.Name = "이순신";  // ❌ 오류! (읽기 전용)

읽기 전용 프로퍼티는 값을 수정할 수 없음 (즉, set이 없기 때문)


5. 쓰기 전용(Write-Only) 프로퍼티

 set만 제공하면 쓰기 전용 프로퍼티가 됩니다. (get이 없음)

class Secret
{
    private string password;

    public string Password
    {
        set { password = value; }  // 값 설정만 가능 (쓰기 전용)
    }
}

// 사용 예제
Secret s = new Secret();
s.Password = "1234";  // set 호출 (저장 가능)
// Console.WriteLine(s.Password);  // ❌ 오류! (읽기 불가)

쓰기 전용 프로퍼티는 값을 읽을 수 없음 (즉, get이 없기 때문)


6. 프로퍼티에 로직 추가하기

 get 또는 set 블록에 로직을 추가할 수도 있습니다.

class BankAccount
{
    private double balance;

    public double Balance
    {
        get { return balance; }  // 계좌 잔액 반환
        set
        {
            if (value >= 0)  // 음수 금액 방지
                balance = value;
            else
                Console.WriteLine("잔액은 음수가 될 수 없습니다.");
        }
    }
}

// 사용 예제
BankAccount account = new BankAccount();
account.Balance = 1000;  // 정상 설정
Console.WriteLine(account.Balance);  // 1000
account.Balance = -500;  // ❌ 잔액은 음수가 될 수 없습니다.

프로퍼티를 활용하면 데이터를 안전하게 다룰 수 있음!


7. C# 7.0 이후의 Expression-bodied Property

 => 표현식을 사용하여 간결하게 get과 set을 구현 가능

class Person
{
    private string name = "홍길동";

    public string Name => name;  // 간결한 get 구현 (읽기 전용)
}

단순한 프로퍼티의 경우 코드를 더욱 깔끔하게 작성 가능


8. init 접근자 (C# 9.0+)

 init을 사용하면 생성자에서만 값을 설정 가능 (불변성 유지)

class Person
{
    public string Name { get; init; }  // init 접근자 사용
}

// 사용 예제
Person p = new Person { Name = "홍길동" };
Console.WriteLine(p.Name);  // 홍길동
// p.Name = "이순신";  // ❌ 오류! (init으로 인해 변경 불가)

객체 생성 후 변경할 수 없도록 안전한 데이터를 만들 때 유용


9. private set으로 값 보호

 set을 private으로 설정하면, 클래스 내부에서만 값을 변경 가능

class Car
{
    public string Model { get; private set; }

    public Car(string model)
    {
        Model = model;  // 생성자에서만 값 설정 가능
    }
}

// 사용 예제
Car myCar = new Car("Tesla");
// myCar.Model = "BMW";  // ❌ 오류! (private set)
Console.WriteLine(myCar.Model);  // Tesla

외부에서는 get만 가능하고, 내부(생성자)에서만 값을 설정할 수 있음


정리

프로퍼티 유형 설명
기본 프로퍼티 get과 set을 활용하여 필드 값 보호
자동 구현 프로퍼티 필드 선언 없이 간결한 프로퍼티 작성 가능
읽기 전용 프로퍼티 get만 제공하여 값을 수정할 수 없음
쓰기 전용 프로퍼티 set만 제공하여 값을 읽을 수 없음
로직 포함 프로퍼티 get 또는 set에 추가 로직 적용 가능
Expression-bodied Property => 표현식으로 간결한 구현 가능
init 프로퍼티 (C# 9+) 생성 후 변경 불가 (set 대신 init 사용)
private set 프로퍼티 클래스 내부에서만 값 변경 가능

프로퍼티를 활용하면 데이터를 안전하게 보호하면서 객체의 상태를 다룰 수 있다.
객체 지향 프로그래밍(OOP)에서 캡슐화(Encapsulation)를 효과적으로 구현할 수 있는 핵심 개념