C# Chapter 9 프로퍼티
이 글은 한빛미디어의 이것이 C#이다를 보고 헷갈리는 부분 위주로 정리한 글입니다.
클래스의 멤버 변수의 은닉성을 지키기위해 Get, Set 메소드를 만들어 멤버 변수를 다루는 것은
정말 귀찮다.
이를 위해 편의성과 은닉성을 동시에 가질 수 있는 기능이 있다.
프로퍼티Permalink
프로퍼티는 다음과 같이 필드 하나를 만들고 그 필드를 감싸줄 프로퍼티를
선언한다.
class 클래스_이름
{
데이터_형식 필드_이름;
접근_한정자 데이터_형식 프로퍼티_이름
{
get { return 필드_이름; }
set { 필드_이름 = value; }
}
}
프로퍼티는 Get Set 메서드를 사용하는 것의 은닉성과
public으로 필드를 사용할때의 편리성의 섞은 것이다
은닉성은 일반적인 Get 메소드, Set 메서드를 사용하면 다음과 같지만.
class propertyClass
{
int num;
public int GetNum()
{
return num;
}
public void SetNum(int value)
{
num = value;
}
}
사용할 때는 다음의 public필드와 같다.
class propertyClass
{
public int num;
}
프로퍼티로는 간단하게 구현이된다.
class propertyClass
{
int m_num;
public int num
{
get { return m_num; }
set { m_num = value; }
}
}
static void Main(string[] args)
{
propertyClass p = new propertyClass();
p.num = 1; //사용은 public필드처럼 사용할 수 있다
Console.WriteLine(p.num);
}
여기서 value는 p.num = 1;
부분의 1과 같다.
=
을 통해 넣어주는 값이 자동으로 value로 들어가 set 기능이 사용된다.
또한 외부에서 읽기 전용으로 사용하고 싶다면 set을 그냥 빼버리면 된다.
class propertyClass
{
int m_num = 5;
public int num
{
get { return m_num; }
}
}
static void Main(string[] args)
{
propertyClass p = new propertyClass();
Console.WriteLine(p.num); // 값을 읽는것은 가능
p.num = 1; // 에러 발생
}
자동구현 프로퍼티Permalink
프로퍼티가 메소드처럼 작용하지않고 단순히 값을 읽고 쓰기만 하면
자동구현 프로퍼티로 편리하게 구현할 수 있다.
class propertyClass
{
public int num { get; set; }
}
프로퍼티와 생성자Permalink
프로퍼티를 초기화 하는것은
객체를 생성할때 생성자 뒤에 {}
안에서 초기화해주면 된다
클래스_이름 인스턴스 = new 클래스_이름()
{
프로퍼티1 = 값, // ;가 아니라 , 다
프로퍼티2 = 값,
프로퍼티3 = 값
}
초기화 전용 자동 구현 프로퍼티 C# 9.0Permalink
get만 가능한 프로퍼티는
생성자를 통한 초기화가 불가능하여 초기화를 위해서는
메소드를 추가로 만들어야 한다.
그를 해결해 주는것이 바로 init 접근자다.
init은 초기화만 가능하게 해주는 set과 같다.
class propertyClass
{
int m_b;
public int b
{
get { return m_b; }
init { m_b = value * 50; }
}
}
internal class Program
{
static void Main(string[] args)
{
propertyClass p = new propertyClass() {b = 50}; // 초기화는 가능
Console.WriteLine(p.b);
p.b = 5; // 에러 발생
}
}
프로퍼티 초기화를 강제하는 required 키워드Permalink
init이 초기화만 가능하도록 해준다면, required 키워드는 초기화가 필요한 프로퍼티를 실수로 초기화 하지 않는 실수를 방지할 수 있게 해줌
class propertyClass
{
public required int i{get; set;}
}
internal class Program
{
static void Main(string[] args)
{
propertyClass p = new propertyClass(); // 오류 발생
}
}
무명 형식Permalink
선언과 동시에 인스턴스를 할당
var myInstance = new {Name = "이름", Age = "20"};
// 중괄호 사이에 임의의 프로퍼티 이름을 적고 값을
// 할당하면 그대로 새 형식의 프로퍼티가 됨
Console.WriteLine(myInstance.Name);
Console.WriteLine(myInstance.Age);
무명 형식의 프로퍼티에 할당된 값은 변경불가능하다.
즉, 초기화 후 읽기만 가능하다.
인터페이스의 프로퍼티Permalink
인터페이스는 메소드뿐 아니라 프로퍼티와 인덱서도 가질 수 있다.
프로퍼티나 인덱서를 가진 인터페이스를 상속하는 클래스가 반드시 구현해야 하는 것은 같다.
당연하겠지만 인터페이스의 프로퍼티는 구현을 갖지 않음.
여기서 발생하는 문제가 인터페이스의 프로퍼티 선언은 자동 구현 프로퍼티 선언과 모습이
interface IPropertyInterface
{
int propertyField{ get; set;}
}
class propertyClass : IPropertyInterface
{
public int propertyField{ get; set; }
}
댓글남기기