참고자료
인프런 - Rookis, [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 강의
어느 곳에서든 접근을 막기 위해서 접근 제한자를 통해 보안 수준을 설정하였다. 클래스에서 사용되는 변수는 일반적으로 private, protected로 선언하여 외부에서의 접근을 막은 후, public으로 getter 함수와 setter 함수를 만들어 외부 접근을 허용했다. 이렇게 하는 이유는 다음과 같다.
- breakpoint를 잡은 후 어디서 접근해 해당 변수를 수정한지 확인하는 것이 용이하기 때문
- 코드 수정시 하나하나 다 확인 후 수정할 필요 없이 한 번의 수정으로 모두 적용 가능하기 때문 (즉, 유지 보수에 용이함)
=> ex) 무적이 아닐때만 hp 수정 가능하게 하도록 변경을 원했다고 가정하자. (변수 자체에 접근했다면 이 부분 모두 수정 필요, 함수 호출 방식이면 함수 한 번만 수정하면 됨)
// Main 함수
Knight knight = new Knight();
knight.SetHp(100);
// class 선언
class Knight
{
protected int hp;
public int GetHp() {return hp;} // Getter, Get 함수
public void SetHp(int hp) {this.hp = hp;}// Setter, Set함수
}
변수가 많아짐에 따라 자연스레 get, set 함수의 수도 늘어날 것이다. c#에서는 더 편리한 기능을 제공하고 있는데 그것이 바로 프로퍼티이다! 다음과 같이 get, set 함수를 프로퍼티를 정의하여 넣어서 관리할 수 있다.
// Main 함수
Knight knight = new Knight();
knight.Hp = 100; // value가 넣어주는 값으로 들어가게 됨
int hp = knight.Hp; // 꺼낼 때는 get이 실행됨
// class 선언
class Knight
{
protected int hp;
public int Hp
{
get {return hp;}
set {this.hp = value;} // default: value
}
}
만약, get과 set 중 하나만 사용을 허용하고 싶은 경우도 있다. 그런 경우 둘 중 하나만 선언하면 자동으로 해당 기능만 사용을 허용해준다.
class Knight
{
protected int hp;
public int Hp
{
get {return hp;}
}
}
또는, get은 외부에 노출시키고, set은 내부에서만 사용하는 방법도 있다.
class Knight
{
protected int hp;
public int Hp
{
get {return hp;}
private set {hp = value;}
}
}
마지막으로, 자동 구현 프로퍼티에 다루고자한다.
대부분 사용되는 형식은 변수 선언 -> get -> set 형식이다. 따라서, 이를 더 줄일 수 있는 기능을 제공하고 있다. 이는 필드가 많아져도 대부분 한줄으로 코딩을 가능하게 해준다는 장점을 가지고 있다.
class Mage
{
public int Hp {get; set;}
// 해당 문법을 내포하고 있는 것!
private int _hp; // 컴파일러가 겹치지 않는 변수 이름 만들어서 get, set함수 만들어줌
public int GetHp(){return _hp;}
public void SetHp(int value){_hp=value;}
}
단순히 get; set;의 작성으로도 앞선 방식과 동일한 기능을 제공한다. 하단에 적은 코드를 내부적으로 알아서 구현해주는 것인데, 컴파일러가 겹치지 않는 변수 이름을 만들어 get, set 함수를 자동으로 생성해준다. 추가로, c# 7.0 이후로는 get, set 선언과 동시에 바로 초기화도 가능한 문법을 제공하고 있다.
public int Hp {get; set; } = 100;
정리하면, 프로퍼티는 함수이긴 하지만 사용시 public 변수를 접근하고 수정하는 것과 같이 접근이 가능하다. 사용성도 편리하고 은닉성도 챙길 수 있다는 점에서 굉장히 유용하다!