클래스 내에는 여러 필드(멤버 변수)들이 존재한다.
외부에서 클래스에 접근할 때, 이 필드에 직접 접근하여 읽기/쓰기를 하도록 하는 것은 좋지 않다.
이때, 외부에서 필드에 간접 접근할 수 있도록 Property를 제공한다.
class Person
{
private string _name;
public string Name
{
get { return _name; } //getter
set { _name = value; } //setter
}
}
class Program
{
static void Main()
{
Person person = new Person();
person.Name = "John"; // call setter
Console.WriteLine(person.Name); // call getter
}
}
앞서 말했던 표현을 빌려서 말해보면,
Person의 _name 필드에 외부에서 직접 접근하는 것은 좋지 않으므로,
외부에서 접근할 때에는 Name property를 통해 간접적으로 접근한다.
setter 내의 value는 setter를 호출할 때 전달되는 값을 나타낸다.
위 코드에서는 John이 value이다.
property를 잘 이용하면 외부에서 접근할 때 데이터 변경에 대해 제한을 추가할 수 있다.
class Person
{
public int _age;
public int Age
{
get { return _age; }
set
{
if (value < 0)
_age = 0;
else
_age = value;
}
}
}
setter를 살짝 수정해서 age가 0 이하의 값이 되지 않도록 제한할 수 있다.
property를 명시적으로 정의하는 번거로움을 줄이기 위해 C#에서는 자동 구현 property를 제공한다.
class Person
{
public string Name {get; set;}
}
위 코드를 사용하면 컴파일러는 내부적으로 밑의 코드로 처리한다.
class Person
{
private string _name;
public string Name
{
get { return _name; } //getter
set { _name = value; } //setter
}
}
set 대신 private set을 사용함으로써
외부에서 직접적으로 데이터를 변경하는 것을 막으면서도
class 내부에서는 값을 설정할 수 있도록 만들 수 있다.
class Person
{
public string Name {get; private set;}
public Person(string name)
{
Name = name
}
public void changeName(string name)
{
Name = name
}
}
class Program
{
static void Main()
{
Person person = new Person("Alice");
person.changeName("Abigail"); // change name
person.Name = "Haley"; // Error
}
}
위 코드의 경우 changeName method는 class 내부에 정의되어 changeName을 이용해 Name 필드를 변경할 수 있지만
외부에서 Name 필드에 대한 직접적인 접근은 오류를 일으킨다.
저도 개발하면서 배우는 중이라 내용에 문제가 있을 수 있어요!
혹시라도 잘못된 내용이 있다면 말해주세요.
확인 후 고치도록 하겠습니다.
읽어주셔서 감사합니다.