상세 컨텐츠

본문 제목

1120 TIL - 프로퍼티

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 11. 20. 22:53

본문

진작에 한 번 개념을 잡고 넘어갔어야 했는데

그러질 않아서 오늘 호되게 혼났다

 

프로퍼티란?

 

C#에서 Getter와 Setter라고 생각하면 편한데

 

예를 들어 private int healthPoint라는 변수가 있다고 생각하자.

 

한정자를 private으로 만들었기 때문에 코딩을 하다가

이 값이 외부에서 필요해도 가져올 수가 없다.

 

그럴 때 사용하는게 Getter와 Setter인데

 

private int _healthPoint;

public int Gethealth()
{
    return _healthPoint;
}

public void Sethealth(int value)
{
    _healthPoint = value;
}

이렇게 쓰인다.

 

healthPoint는 그대로 프라이빗이지만

퍼블릭 함수를 통해 값을 변경하거나 가져올 수 있다.

 

프로퍼티도 비슷하다.

 

다음 스크립트를 보자.

private int _healthPoint;

public int HealthPoint
{
    get { return _healthPoint; }
    set { _healthPoint = value; }
}

_healthPoint는 private한정자여서 접근 할 수 없지만

HealthPoint는 public한정자이고

외부에서 HealthPoint에 접근하면 _healthPoint를 반환해준다.

 

또한 외부에서 HealthPoint의 값을 변경한다면 그 값(value)을 _healthPoint에 넣어준다.

 

또한 get만 작성을 한다면 해당 속성을 읽기전용이 된다.

 

그리고 또 get과 set에는 한정자를 붙일 수 있는데

 

return값보다 한정된 한정자를 사용하여야 한다.

 

public으로 선언한 변수는 반드시 public보다 한정된 한정자를 사용하여야 하고

설령 변수가 public이더라도 프로퍼티의 한정자가 public일 수는 없다.

그냥 한정자를 입력하지 않으면 자동으로 public으로 처리된다.

 

마지막으로 개인적인 생각으로는 가장 중요한 사항인데

get에서 직접 본인의 값을 변경하면 안된다.

 

무슨 소리냐면

public int HealthPoint
{
    get { return HealthPoint += 10; }
    set { HealthPoint = value; }
}

위와 같이 코드를 작성하고 실행하면

즉시 스택 오버플로우와 조우가 가능하다.

 

왜냐하면

 

다른 곳에서 HealthPoint를 호출 ->

HealthPoint = HealthPoint + 10 ->

어? 값이 변경됐네? set 호출 ->

HealthPoint = HealthPoint + 10 ->

아직 부른거 처리 안됐네? HealthPoint를 호출 ->

HealthPoint = HealthPoint + 10 ->

어? 값이 변경됐네? set 호출 ->

HealthPoint = HealthPoint + 10 ->

아직 부른거 처리 안됐네? HealthPoint를 호출 ->

의 무한 반복이기 때문이다.

 

오늘 이것 때문에 많이 당했다.

 

그러면 어떻게 사용해야 하는가?

 

첫 예시처럼 본인의 값을 변경하는게 아닌

다른 변수의 값을 변경하고 불러온다면

해당 값에 프로퍼티가 없으면 정상 작동한다.

 

public int Hp;
private int maxHp = 100;
public int MaxHp { get { return maxHp + AddMaxHp; } }
public int Mp;
private int maxMp = 100;
public int MaxMp { get { return maxMp + AddMaxMp; } }

예를 들면 이렇다.

 

maxHP = 100으로 초기화 해주고

따로 MaxHp라는 변수를 만들어서 get을 통해 값을 더해준다.

 

TTE

관련글 더보기