개요
프로퍼티는 C#에서 매우 중요한 개념으로, 클래스의 필드(변수)에 대한 접근을 제어하고 캡슐화를 유지하는 데 핵심적인 역할을 합니다. 주로 클래스, 구조체, 인터페이스에서 사용할 수 있데, 마치 클래스의 똑똑한 변수와 같습니다. 단순히 데이터를 저장하는 필드와 달리, 데이터를 읽거나 쓸 때 추가적인 로직을 실행할 수 있습니다. 이를 통해 데이터의 유효성을 검사하거나, 다른 작업을 수행하는 등 다양한 기능을 구현할 수 있습니다.
프로퍼티(Property)의 구성 요소
프로퍼티는 크게 두 부분으로 구성됩니다.
- get 접근자(Accessor): 프로퍼티의 값을 읽을 때 실행되는 코드 블록입니다.
- set 접근자(Accessor): 프로퍼티에 값을 쓸 때 실행되는 코드 블록입니다.
모든 프로퍼티가 get과 set 접근자를 모두 가져야 하는 것은 아닙니다. 읽기 전용 프로퍼티는 get 접근자만 가지고, 쓰기 전용 프로퍼티는 set 접근자만 가질 수 있습니다.
프로퍼티의 형태
접근 제한자 자료형 프로퍼티 이름
{
get
{
// 값을 반환하는 코드
return 필드;
}
set
{
// 값을 설정하는 코드
필드 = value;
}
}
- 접근 제한자: public, private, protected, internal 등의 접근 제한자를 사용하여 프로퍼티의 접근 범위를 제어합니다.
- 자료형: 프로퍼티가 가지는 데이터의 형식을 지정합니다.
- 프로퍼티 이름: 프로퍼티의 이름을 지정합니다. 일반적으로 필드 이름의 첫 글자를 대문자로 표기하는 것이 관례입니다.
- value: set 접근자 내에서 프로퍼티에 할당된 값을 나타내는 암시적 매개변수입니다.
사용 예시
public class Person
{
private string name; // 필드
public string Name // 프로퍼티
{
get
{
return name;
}
set
{
if (!string.IsNullOrEmpty(value)) // 이름 유효성 검사
{
name = value;
}
else
{
Console.WriteLine("이름은 비어 있을 수 없습니다.");
}
}
}
private int age;
public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
else
{
Console.WriteLine("나이는 0 이상이어야 합니다.");
}
}
}
//읽기 전용 프로퍼티
public string Introduction{
get { return $"제 이름은 {Name}이고, 나이는 {Age}입니다."; }
}
}
public class Example
{
public static void Main(string[] args)
{
Person person = new Person();
person.Name = "홍길동"; // set 접근자 호출
person.Age = 30;
Console.WriteLine(person.Name); // get 접근자 호출
Console.WriteLine(person.Age);
Console.WriteLine(person.Introduction);
person.Name = ""; // 유효성 검사 작동
person.Age = -5; // 유효성 검사 작동
}
}
자동 구현 프로퍼티 (Auto-Implemented Properties)
C# 3.0부터는 자동 구현 프로퍼티라는 기능을 제공하여, 간단한 프로퍼티를 더 간결하게 선언할 수 있습니다.
public string Name { get; set; }
public int Age { get; set; }
위와 같이 선언하면 컴파일러가 자동으로 private 필드를 생성하고 get과 set 접근자를 구현해줍니다. 추가적인 로직이 필요하지 않은 간단한 프로퍼티에 유용하게 사용됩니다.
프로퍼티와 메서드의 차이
프로퍼티는 마치 필드처럼 사용되지만, 실제로는 메서드(get과 set 접근자)를 통해 구현됩니다. 이러한 차이점 때문에 프로퍼티는 다음과 같은 장점을 가집니다.
- 캡슐화: 필드를 private으로 선언하고 프로퍼티를 통해 접근을 제어함으로써 데이터의 무결성을 유지할 수 있습니다.
- 유연성: get과 set 접근자 내에 추가적인 로직을 구현하여 데이터 접근 방식을 유연하게 변경할 수 있습니다.
- 데이터 바인딩: WPF, WinForms 등의 UI 프레임워크에서 데이터 바인딩을 지원합니다.