Property
Property는 클래스나 구조체의 필드에 대한 접근을 제어하고, 캡슐화를 제공하는 멤버이다. 프로퍼티의 목적은 다음과 같다.
캡슐화: 필드의 접근을 제어하여 데이터의 무결성을 보호한다.
필드에 대한 접근 제어: 값을 읽거나 쓸 때 추가적인 로직을 수행할 수 있다.
직관적인 사용: 메서드처럼 보이지 않고 필드처럼 사용할 수 있다.
C#에서도 멤버에 대한 getter / setter 메소드를 만들어서 멤버에 대한 접근을 제어할 수 있다. 하지만 C#에서는 프로퍼티를 좀 더 지향하는 것 같다.
그 이유는 편해서 라고 생각한다.
우선 프로퍼티와 getter / setter 메소드의 차이점은 아래와 같다.
Property
1
2
3
4
5
6
7
8
9
public class Person
{
public string Name { get; set; } // 자동 구현 프로퍼티
}
// 사용 예시
Person person = new Person();
person.Name = "John";
Console.WriteLine(person.Name);
Getter / Setter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Person
{
private string name;
public string GetName()
{
return name;
}
public void SetName(string value)
{
name = value;
}
}
// 사용 예시
Person person = new Person();
person.SetName("John");
Console.WriteLine(person.GetName());
프로퍼티를 사용하면 getter와 setter 메서드를 정의하지 않아도 된다. 이로 인해 코드가 간결해지고, 읽기 쉽다.
프로퍼티는 필드 접근과 유사한 구문을 제공하면서도, 내부적으로는 getter와 setter 메서드를 통해 데이터 접근을 제어한다. 이를 통해 캡슐화와 정보 은닉을 보다 자연스럽게 구현할 수 있다.
getter와 setter 메서드와 달리, 필요에 따라 접근자를 생략하거나, 읽기 전용/쓰기 전용 프로퍼티를 쉽게 만들 수 있다.
프로퍼티는 유연하다. 초기에는 단순히 자동 구현 프로퍼티로 시작할 수 있으며, 이후 필요에 따라 getter와 setter에 로직을 추가할 수 있다.
init 접근자
프로퍼티의 데이터 오염을 방지하기 위해서는 생성자를 통해 필드를 초기화하고 get 접근자만 제공하면 된다.
1
2
3
4
5
6
7
8
9
public class Person
{
public Person(int _age) {
age = _age;
}
int age;
public int Age {get { return age;}}
}
init 접근자를 통해 생성자를 통해 초기화하는 과정을 생략할 수 있다. init 접근자를 사용하면 단 한번 값을 지정할 수 있고, 그 이후는 값을 읽는 것만 가능하다.
1
2
3
4
public class Person
{
public int Age {get; init;}
}
초기화를 강제하는 한정자로는 required 가 있다. required 한정자로 수식된 프로퍼티는 객체를 생성할 때 초기화를 해주면 된다.
1
2
3
4
5
6
7
8
9
10
11
public class Person
{
public required int Age {get; set;}
}
class MainApp {
static void Main(string[] args)
{
Person person = new Person() {Age = 20};
}
}