전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;

namespace CSharp
{

    class Program
    {
        // 프로퍼티
        // 객체지향의 은닉성과 관련이 있음

        class Knight
        {
            // public 대신 protected or private으로 만드는게 좋음
            //public int hp;
            protected int hp;
            // 변수 사용을 위한 함수 get set 함수 생성

            // Getter get 함수 
            //public int GetHp() { return hp; }

            // Setter Set 함수
            //public void SetHp(int hp) { /*조건if();*/ this.hp = hp; }

            //위의 과정을 편하게 사용하기 위한 Property 문법이 존재함
            public int Hp
            {
                // 더 줄여서 표현 간으
                //get { return hp; }
                //private /*protected*/set { hp = value; } // 내부에서는 사용가능하지만 외부에서는 사용 불가
                get; set;

            } = 100; // 바로 초기화 가능 
            // 프로퍼티는 함수지만 변수처럼 필드를 접근하는 느낌으로 편하게 사용할 수 있다.


            static void Main(string args)
            {
                Knight knight = new Knight();
                //knight.hp = 100;    // 건드리면 안되는데
                //knight.hp = 40;     // 건드림

                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;     // set 호출
        int hp = knight.Hp;  // get 호출
    }
}

💡 프로퍼티의 핵심 개념 정리

구분설명
프로퍼티멤버 변수처럼 보이지만 사실은 함수(get/set)
get값을 읽을 때 실행되는 함수
set값을 저장할 때 실행되는 함수
valueset에서 전달받는 값 (키워드)
은닉성데이터 보호를 위해 private 필드를 직접 접근 금지

🚨 get, set 중 하나만 구현 가능

읽기 전용 프로퍼티

public int Hp
{
    get { return hp; }  // 읽기만 가능
}

쓰기 전용 프로퍼티

public int Hp
{
    set { hp = value; }  // 쓰기만 가능
}

🔒 접근 제한자 설정 가능

protected int Hp
{
    get { return hp; }    // protected 읽기
    private set { hp = value; } // private 쓰기
}

🔥 자동 구현 프로퍼티 (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++;
    }
}

profile
李家네_공부방

0개의 댓글