Chapter 9-3. 기타문법 : Property(프로퍼티)
카테고리: C Sharp
태그: C Sharp Programming
인프런에 있는 Rookiss님의 강의 Part1: C# 기초 프로그래밍 입문 를 듣고 정리한 필기입니다. 😀
👩🏼 프로퍼티
외부에서 값을 바꾸면 그 값을 누가 언제 바꿨는지 알기가 쉽지 않다. 따라서 외부에서 write되지 않기를 원하는 멤버 변수는 protected
, private
으로 접근을 제한하고 setter, getter 같은 접근 함수를 public
으로 만들어서 이들에 대해 간접 접근한다. (이런 경우 디버깅시 호출 스택을 통해 어디서 누가 호출했는지 쉽게 알 수 있다.)
프로퍼티는 은닉성과 관련이 있으며 Getter, Setter 접근 함수와 같은 기능을 좀 더 편하게 사용하기 위한 기능이다.
그래서 사용법도 함수와 비슷하다!
class Knight
{
protected int hp;
// ✔ 프로퍼티!
public int Hp
{
get { return hp; }
set { hp = value; }
}
}
class Program
{
static void Main(string[] args)
{
Knight knight = new Knight();
knight.Hp = 100; // Set (value에 100이 들어간다)
int hp = knight.Hp; // Get
}
}
- 이것이 프로퍼티의 정의다.
set
에서value
는 Write 하려는 새로운 값을 뜻한다.public int Hp { get { return hp; } set { hp = value; } }
Knight
클래스의 멤버 프로퍼티Hp
값을 가져올 땐 자동으로get { return hp; }
가 호출된다.int hp = knight.Hp; // Hp 프로퍼티의 get 호출
Knight
클래스의 멤버 프로퍼티Hp
값을 Write 할 땐 자동으로set { hp = value; }
가 호출된다.knight.Hp = 100; // Set (value에 100이 들어간다)
이처럼 Getter, Setter 접근 함수와 같은 기능을 이렇게 프로퍼티 하나로 간단하게 구현할 수 있다. 외부에서 사용될 수 없는 protected
제한자인 멤버 변수 hp
는 Hp
프로퍼티의 get
, set
을 통해 간접 접근할 수 있게 된다.
public int Hp
{
get { return hp; }
}
위와 같이 get
, set
中 하나만 정의해도 무방하다. 위와 같은 경우에 set
은 정의하지 않았기 때문에 knight.Hp = 100;
은 불가능하다.(컴파일 에러) knight.Hp
를 리턴받는 것만 가능하다.
private int Hp
{
get { return hp; }
}
프로퍼티도 멤버이기 때문에 접근 제한자를 붙일 수 있다. 프로퍼티를 private
로 제한하면 동일한 클래스 내부에서만 프로퍼티 사용이 가능하다.
자동 구현 프로퍼티
class Knight
{
public int Hp
{
get; set;
}
}
프로퍼티를 위와 같이 구현하면 멤버 변수를 직접 만들어 줄 필요가 없다. 컴파일러가 private
한 멤버 변수까지 자동으로 생성시켜주기 때문이다. 간단하게 get;
set;
만 해주면 자동 완성 프로퍼티다. 이렇게 정말 기본적인 Get
, Set
작업만을 할 때 사용 가능하다. 뭔가 더 사용자 지정 코드를 작성할 경우에는 자동 완성 프로퍼티를 사용할 수 없다. get
과 set
에 {}
중괄호를 넣어 사용자 지정 코드를 구현하는 순간 더 이상 자동 완성 프로퍼티가 아니며 컴파일러는 자동으로 멤버 변수를 만들어 주지 않는다.
private int _hp;
public int GetHp() { return _hp; }
public void SetHp(int value) { _hp = value; }
자동 구현 프로퍼티는 위 코드 3 줄을 축약한 것과 동일하다. (멤버 변수 선언까지도 필요 없음. 자동으로 만들어주어서!)
class Knight
{
public int Hp { get; set; } = 100;
}
더 나아가 이렇게 초기화도 가능하다. 아래 코드 3 줄과 같다.
private int _hp = 100;
public int GetHp() { return _hp; }
public void SetHp(int value) { _hp = value; }
get, set 접근 지정자 다르게
protected int HP
{
get { return hp; } // get 할 때는 HP 따라 protected. 이렇게 안써주면 프로퍼티 접근 지정자 따라간다.
private set { hp = value; } // set 할 때는 private
}
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기