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)를 효과적으로 구현할 수 있는 핵심 개념