진작에 한 번 개념을 잡고 넘어갔어야 했는데
그러질 않아서 오늘 호되게 혼났다
프로퍼티란?
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
1202 TIL - 재사용 스크롤 (0) | 2024.12.02 |
---|---|
1129 TIL - 스크롤 뷰 (1) | 2024.11.29 |
1119 TIL - 플랫포머 플레이어 이동 2 (0) | 2024.11.19 |
1118 TIL - 플랫포머 2D 캐릭터 이동하기 (0) | 2024.11.18 |
1112 TIL - 개인 프로젝트 진행 중 (0) | 2024.11.12 |