센로그
[C#] 프로퍼티(property) - get, set 본문
◆ 프로퍼티 (Property)
class의 private, protected 같은 보호수준의 멤버는 외부에서 접근할 수 없다.
그러나 외부에서 이 값에 접근해야 하는 경우가 있는데,
이 경우 프로그래머는 GetMember(), SetMember() 같은 메서드를 정의해 접근할 수 있도록 한다.
그런데! 클래스가 너무 많아지면, GetMember(), SetMember() 메서드도 엄청나게 많아질 것이고,
이런 멤버 접근 기능은 수많은 클래스들에서 요구하기 때문에 C#은 내부적으로 프로퍼티(Property)라는 문법을 제공한다.
◆ 프로퍼티 (Property) 사용 방법
class Character{
protected int hp;
public int HP{ // 멤버 변수 hp값을 get 및 set 할 수 있도록 해주는 프로퍼티
get{ return hp; }
set{ hp = value; }
}
}
위와 같이 HP라는 프로퍼티를 정의한다면, 외부에서는 다음과 같이 hp 값을 get 및 set 할 수 있다.
static void Main(string[] args){
Character char = new Character();
char.HP = 100; //set
int myCharHP = char.HP; //get
}
프로퍼티 내부에 get, set 둘 중 하나만 구현할 수도 있다.
그렇게 되면 외부에서 둘 중 하나의 기능(get 또는 set)에만 접근할 수 있도록 한다.
※ 이런 기능을 하는 get/set 문법을 각각 getter/setter 또는 접근자(accessor)/설정자(mutator) 라고 부름
◆ 프로퍼티 with 람다
람다식을 활용해 프로퍼티를 구현해줄 수도 있다.
위의 코드(hp를 Get, Set)를 람다식을 사용해 구현한 코드이다.
class Character{
protected int hp;
public int HP{ // 멤버 변수 hp값을 get 및 set 할 수 있도록 해주는 프로퍼티
{ get => hp; set => hp = value; }
}
}
람다식을 사용해 굉장히 간편하게 읽기전용 프로퍼티(Getter만 존재)를 만들수도 있다.
class Character{
protected int hp;
public int HP => hp; // 람다식을 활용한 읽기전용 프로퍼티
}
◆ 자동 구현 프로퍼티 (Auto-Implemented Property)
위와 같은 기능을 하는 get, set 기능을 자동으로 구현해주는 문법도 존재한다.
→ 직접 코드를 입력해도 되고,
클래스 내부에서 prop을 입력하고 Tab 키를 두번 누르면 아래와 같이 자동으로 Getter와 Setter가 구현된다.
class Character{
public int HP{ get; set; }
}
이 문법을 사용했을 경우에도 똑같이 아래 코드를 실행할 수 있다.
static void Main(string[] args){
Character char = new Character();
char.HP = 100; //set
int myCharHP = char.HP; //get
}
※ 단, 자동 구현 프로퍼티는 Setter 혼자 사용할 수는 없다. 항상 Getter을 가져와야 함!
※ 참고
일반 멤버 변수와는 다르게, 프로퍼티는 앞에 [SerializeField]를 붙여도 인스펙터에 표시되지 않는다.
자동 구현 프로퍼티도 마찬가지다. 그러나 자동 구현 프로퍼티의 경우 [field: SerializeField]를 붙이면 인스펙터에 표시할 수 있다.
예를들어 아래와 같은 경우 인스펙터에 표시할 수 있다.
public int HP{ get; set; }
public int HP{ get; private set; }
그러나, Getter 혹은 Setter을 직접 구현한 프로퍼티나, 읽기 전용 프로퍼티 같은 경우
[field: SerializeField]를 쓰더라도 인스펙터에 표시할 수 없다.
'게임 > Unity, C#' 카테고리의 다른 글
[Unity] Scriptable Object (스크립터블 오브젝트) (0) | 2023.06.30 |
---|---|
[Unity] 유니티 라이프사이클 (0) | 2023.06.30 |
[C#] Class vs Struct (0) | 2023.06.29 |
[Unity] Object Pool (0) | 2023.06.27 |
[Unity] Oculus VR raycast로 ui 버튼 클릭 및 하이라이트 (0) | 2022.12.13 |