센로그

[C#] 프로퍼티(property) - get, set 본문

게임/Unity, C#

[C#] 프로퍼티(property) - get, set

seeyoun 2023. 6. 29. 11:52

◆ 프로퍼티 (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]를 쓰더라도 인스펙터에 표시할 수 없다.

이런 오류메세지 뜸!

Comments