C#/.NET(29): Property
Property 란?
프로퍼티는 private 필드의 값을 읽고 쓰고 계산할 수 있게 하는 멤버이다.
프로퍼티의 간단한 정의를 처음 접했을 때, 세가지 질문이 들었다.
- 질문 1. 프로퍼티는 어떻게 선언하지?
- 질문 2. private 으로 정의했더라도 필요할 때, public 으로 바꿔주게끔 메소드를 추가하여 사용하면 되지 않을까?
- 질문 3. 프로퍼티에 사용되는 get, set 은 뭐지?
먼저, 프로퍼티를 이해하려면 필드를 이해해야한다. 아래 코드를 예시로 필드를 살펴보겠다.
필드란, 클래스 또는 구조체 안에서 선언된 모든 형식의 변수를 말한다.
using System;
namespace Property
{
class Person
{
private int _yearOfBirth; // <- 이것이 필드
public Person(int _yearOfBirth)
{
yearOfBirth = _yearOfBirth;
}
}
}
다음으로 위 예시 코드를 ‘프로퍼티’로 변경해보겠다.
프로퍼티는 아래 예시 코드에서 볼 수 있는 것처럼 프로퍼티로 만들고 싶은 필드명 뒤에 { get; set; } 을 붙여 선언할 수 있다.
using System;
namespace Property
{
class Person
{
private int _yearOfBirth; // <- 이것이 필드
public int yearOfBirth { get; set; } // <- 이것이 프로퍼티
public Person(int _yearOfBirth)
{
yearOfBirth = _yearOfBirth;
}
}
}
그렇다면, 프로퍼티는 왜 필요한 걸까?
정답은 캡슐화와 정보은닉에 있다. 앞서 캡슐화란 데이터와 그 데이터를 사용하는 메소드를 한곳으로 묶는 기법임을 살펴보았고, 정보 은닉이란 접근 제어자를 public > private 등으로 변경하여 유저에게 노출시키지 않는 방법이라 했다.
그런데, 생각해보면 캡슐화 기법과 정보 은닉을 위해, private을 사용하다가 반드시 해당 필드를 참조해야 되는 경우가 발생하면 어떻게 해야될까?
그런 경우 public으로 바꿔주는 메소드를 추가 선언하여 사용하면 되겠지만, 비효율적이고 대규모 프로젝트에서 수천, 수만 개에 달하는 멤버들을 일일히 찾아서 보고 사용하기에는 어려움이 있다.
이렇게 상황에 따라 변수에 선언된 접근 제어자를 변경하여 쉽게 사용할 수 있게 해주는 유용한 녀석이 바로 ‘프로퍼티’이다.
아래 예시코드로 설명하면, 클래스로 오브젝트를 생성하여 프로퍼티에 접근하려 한다면, get과 set에 의해 각각 private 필드로 return 하게 되어있다.

굉장히 단순한 구조이지만, 무척 유용하다. 아래는 프로퍼티를 사용하게 되는 3가지 경우에 대한 예시코드이다.
[외부에서 읽을 수도 있고, 쓸 수도 있는 private 필드]
using System;
namespace Property
{
// private 필드를 읽을수도 작성할 수도 있음
class Person
{
private int _yearOfBirth;
public int yearOfBirth
{
get
{
return _yearOfBirth;
}
set
{
_yearOfBirth = value;
}
}
public Person(int _yearOfBirth)
{
yearOfBirth = _yearOfBirth;
}
}
internal class Program
{
static void Main(string[] args)
{
var person = new Person(1987);
Console.WriteLine($"{person.yearOfBirth}"); // 읽을 수 있음
person.yearOfBirth = 2000; // 작성할 수 없음
}
}
}
[외부에서 읽을 수만 있고, 쓸 수 없는 public 필드]
using System;
namespace Property
{
// 읽을 수는 있지만, 작성할 수 없음
class Account
{
public int pw
{ get; private set; }
public Account(int _pw)
{ pw = _pw; }
}
internal class Program
{
static void Main(string[] args)
{
var account = new Account(3663);
Console.WriteLine($"{account.pw}"); // 읽을 수 있음
// account.pw = 1234; // 작성할 수 없음
}
}
}
정리
프로퍼티는 private 필드를 외부에서 쓰거나 읽게할 수 있는 멤버이다.
그리고 프로퍼티의 get, set을 이용하여 public 필드를 외부에서 읽게만 할 수도 있다.
더 다양한 가짓수로 프로퍼티 예시코드를 작성해보고 싶지만, 지금 단계에서는 확실히 사용되는 저 두가지 예시를 바짝 외우고 필요할 때 다시 깊이있게 봐야할 것 같다.
댓글남기기