본문 바로가기

.NET/C#

[C#] 속성(Property)이란 무엇인가?

속성(Property)은 C#에서 제공하는 특수한 메서드로, 비공개 멤버에 대한 접근이나 설정 방법을 안전하게 클래스 외부로 제공하기 위한 기술이다. 쉽게 말해서 접근자와 설정자인데, java를 배워본 사람이라면 알겠지만 흔히 private 멤버를 클래스의 외부에서 가져오거나 설정하기 위해 get(), set() 메서드를 만드는 바로 그것이다.

 

일반적으로 private 멤버는 클래스 외부에서는 접근할 수 없다. 그런데 만약 클래스 외부에서 값을 가져오거나 혹은 설정해야 할 일이 있을 경우 이런 방법으로 코드를 작성할 수 있다.

class MyClass
{
	private int myMember;
    
    public int GetMyMember()
    {
    	return myMember;
    }
    public void SetMyMember(int value)
    {
    	myMember = value;
    }
}

위와 같은 작성 방법을 C#에서 읽기 쉽고 작성하기 간결하도록 아래와 같은 방식으로 제공한다.

class MyClass
{
	private int myMember;
    
    public int MyMember { get; set; }
}

 

이렇게 메서드를 사용해서 비공개 멤버로 접근이 가능하도록 할 수 있을 뿐만 아니라, 값을 지정하거나 가져오는 작업을 메서드 내부에서 처리하기 때문에 다른 필요한 추가 작업을 함께 수행하도록 작성할 수도 있다.

이해하기 쉬운 예시로 WinForm의 Timer가 있는데, Timer의 Enabled 속성은 타이머가 동작 중일 때 true이고, 동작중이 아닐 때 false이다. Timer.Start() 메서드로 타이머를 실행시키면 Timer.Enabled는 true가 되며, Timer.Stop() 메서드로 타이머를 멈추면 Timer.Enabled는 false가 된다. 그러나 주목할 점은 Timer.Enabled 속성의 값을 직접 바꾸는 것으로도 타이머를 실행시키거나 정지시킬 수 있다는 것이다. 

class Timer
{
	public bool Enabled 
    {
    	get => _enabled;
        set
        {
        	if(value) Start();
            else Stop();
        }
    }
    
    private bool _enabled;
    
    public void Start()
    {
    	// Script for starting timer..
        
        _enabled = true;
    }
    public void Stop()
    {
    	// Script for stop timer..
        
        _enabled = false;
    }
}

내부적으로는 위와 같은 방식으로 동작할 것이다.

Enabled 속성에서 접근자 get은  _enabled라는 비공개 멤버 변수의 값을 반환하고, set은 지정하려는 값에 따라 Start() 또는 Stop()을 호출한다. Start()와 Stop() 메서드에서는 타이머를 실행시키거나 정지시킨 후 타이머의 상태를 _enabled에 갱신한다.

위와 같은 속성의 동작 방식은 주로 WinForm에서 사용자 정의 컨트롤 등을 만들 때 매우 효율적으로 사용되는데, 실제로 윈폼 디자이너를 편집할 때 속성 편집 창에서 BackColor, ForeColor 등의 속성 값을 변경하면 변경된 사항이 컨트롤에 즉시 적용되는 것을 확인할 수 있다. 

 

class MyList
{
    private List<int> _list;
	
    // Count는 List에 속한 요소의 개수를 나타내는 값이므로 읽기만 가능하고 쓰기는 불가능하다.
    public int Count => _list.Count;
    public int this[int index] => _list[index];
	
    public MyList()
    {
        _list = new List<int>();
    }
}

이 코드에서 MyList의 속성 Count는 멤버 변수 _list의 Count를 반환한다. 현재 리스트에 속한 요소 수를 클래스 외부에서 읽을 수 있도록 만들어둔 속성으로, 항상 실제 요소 수를 나타낼 필요가 있기에 접근자 get만 정의하고 set은 정의하지 않았음을 알 수 있다. 이런 식으로 어떤 값의 읽기/쓰기를 제한적으로 클래스 외부로 제공하기 위한 용도로 사용할 수도 있다.

'.NET > C#' 카테고리의 다른 글

[C#] try~catch~finally 구문 사용법  (0) 2021.09.27
[C#] ref 형식 파라미터 사용법  (0) 2021.09.21
[C#] out 형식 파라미터 사용법  (0) 2021.08.15
[C#] ThreadPool 사용법  (0) 2021.08.12
[C#] FileInfo 클래스로 파일 정보 확인  (0) 2021.08.03