전체 코드
using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;
namespace CSharp
{
class Program
{
class Knight
{
protected int hp;
public int Hp
{
get; set;
} = 100;
static void Main(string args)
{
Knight knight = new Knight();
knight.Hp = 100;
int hp = knight.Hp;
}
}
}
}
🔔 프로퍼티란?
프로퍼티(Property)는 C#에서 은닉성(Encapsulation)을 지키면서,
객체의 멤버 변수(필드)에 안전하게 접근할 수 있도록 도와주는 기능이다.
보통은 Getter/Setter 메서드로 직접 필드 값을 읽거나 수정하는데,
C#에서는 이 과정을 프로퍼티로 더 간편하게 처리할 수 있다.
🕵️♂️ 은닉성(Encapsulation)이 왜 필요할까?
- 클래스 내부의 중요한 데이터를 외부에서 직접 변경하는 것을 막기 위해.
- 대신, 제한된 경로로만 값을 읽거나 수정하게 만들어서 데이터 무결성을 지킬 수 있다.
- 예) 체력이 0보다 작거나 100보다 큰 값은 허용하지 않도록 제어 가능.
🛠️ Getter / Setter 패턴 예제
class Knight
{
private int hp;
public int GetHp()
{
return hp;
}
public void SetHp(int value)
{
if (value < 0) value = 0;
hp = value;
}
}
문제점
- 매번
GetHp(), SetHp() 호출이 불편함.
- 코드가 장황해짐.
✨ 프로퍼티(Property)로 간편하게 변환
class Knight
{
private int hp;
public int Hp
{
get { return hp; }
set { hp = value; }
}
}
해설
Hp 프로퍼티를 통해 hp 필드에 접근.
get으로 읽고, set으로 수정.
- 내부적으로는 여전히
private hp 필드 사용.
✅ 프로퍼티 사용법 예제
class Program
{
static void Main(string[] args)
{
Knight knight = new Knight();
knight.Hp = 100;
int hp = knight.Hp;
}
}
💡 프로퍼티의 핵심 개념 정리
| 구분 | 설명 |
|---|
| 프로퍼티 | 멤버 변수처럼 보이지만 사실은 함수(get/set) |
| get | 값을 읽을 때 실행되는 함수 |
| set | 값을 저장할 때 실행되는 함수 |
| value | set에서 전달받는 값 (키워드) |
| 은닉성 | 데이터 보호를 위해 private 필드를 직접 접근 금지 |
🚨 get, set 중 하나만 구현 가능
읽기 전용 프로퍼티
public int Hp
{
get { return hp; }
}
쓰기 전용 프로퍼티
public int Hp
{
set { hp = value; }
}
🔒 접근 제한자 설정 가능
protected int Hp
{
get { return hp; }
private set { hp = value; }
}
🔥 자동 구현 프로퍼티 (Auto-Implemented Property)
기본형
public int Hp { get; set; }
hp 필드 직접 선언 필요 없음
- 컴파일러가 자동으로
private int hp 만들어줌
초기값 설정까지 가능
public int Hp { get; set; } = 100;
private int _hp = 100;
public int GetHp() { return _hp; }
public void SetHp(int value) { _hp = value; }
Getter/Setter vs 프로퍼티 비교
| 방식 | 코드 길이 | 유연성 | 디버깅 편의성 |
|---|
| Getter/Setter 메서드 | 길다 | 조건처리 쉬움 | 좋음 (호출스택 명확) |
| 프로퍼티 | 짧다 | 간단한 경우 적합 | 호출스택 디버깅 가능 |
| 자동 구현 프로퍼티 | 매우 짧다 | 추가 로직 불가 | 디버깅 어려움 |
⚠️ 주의점
| 상황 | 주의할 점 |
|---|
| 외부 공개 필드 | public 필드는 은닉성 깨짐 |
| 프로퍼티 조건 처리 | 자동 구현 프로퍼티는 조건처리 불가 |
| 내부 규칙 제어 | 필요하면 get/set 직접 구현해야 함 |
📦 종합 예제 - 다양한 프로퍼티 조합
class Knight
{
private int hp = 100;
public int MaxHp { get; } = 100;
public int Hp
{
get { return hp; }
set
{
if (value < 0) value = 0;
if (value > MaxHp) value = MaxHp;
hp = value;
}
}
public int Level { get; private set; } = 1;
public void LevelUp()
{
Level++;
}
}