ice rabbit programming

[C#] Property와 Indexer 본문

Development/C#

[C#] Property와 Indexer

판교토끼 2020. 5. 10. 21:13

Property

약 4개월간 C#을 써 보면서 여지껏 썼던 언어들과의 가장 큰 차이점이자 편리하다고 생각되는 것이 바로 이제 얘기할 Property(속성)이다.

클래스 내부의 변수는 Field(필드), 함수는 Method(메소드)라고 부르는데 C#에서는 Property가 추가로 존재한다.

C++이나 Java를 접해보았다면 접근 지정자에 대해서 많이 들어봤을 것이다. 객체 지향 언어에서는 캡슐화를 통한 정보 은닉을 중요시하기 때문에, 외부에서는 꼭 필요한 경우에만 접근 가능하게 하고, 그러한 접근 또한 직접적으로 변수에 접근이 아니라 get/set 등의 함수를 통해서 하도록 한다.

C#도 객체 지향 언어이기 때문에, 기본적으로 필드는 private으로 해두고 Property나 메소드를 이용해 접근한다. 즉, 변수이지만, 메소드 정의와 함께 있어 getter와 setter를 통해 접근한다. 이는 선언에서의 편리함을 가져온다.
사용할 때에도 object.getAge(); 가 아니라 object.Age;와 같이 변수처럼 사용할 수 있어 좀 더 코드를 직관적으로 작성하고 이해할 수 있다.

계속 말로만 하는 것보다 아래 코드를 보는 것이 이해가 빠를 것이다.

public class Example{
	private int _age; // Field
    public int Age { // Property
    	get {
        	if(_age>=0)
            	return _age;
        }
        set {
        	if(value>=0) // 들어오는 값이 value라고 약속되어 있다.
            	_age=value;
        }
    } 
}

이런 식으로, Back Field의 변수와 연결하여 사용할 수 있다. 위와 같이 선언하거나 호출할 경우 IL에서 뜯어보면 get_Age와 set_Age가 자동으로 생성되고(선언 시) 호출된다(호출 시). get과 set에 따로 접근지정자도 부여할 수 있으므로 권한 지정 및 닫기가 더 편리하고 중요하다고 할 수 있다. 또한 위 예시에서는 Back Field를 연결하였으나, Back Field에 값을 저장해야 할 필요가 없는 경우에는 없어도 Property만 독자적으로 만들 수 있다.

위는 getter와 setter 내부에서 유효성 검사 등 다른 동작을 했기 때문에 저렇게 작성된 것인데, 만약 단순히 get과 set의 역할만을 한다면 자동 속성(Automatic Property)을 사용할 수 있다.

public class Example2 {
	public int Age { get; private set; }
}

이러면 get, set의 동작을 하는 메소드를 자동으로 컴파일러가 생성한다. 위에서 말한 set에 따로 접근지정자를 부여하는 것은 위와 같이 써 주면 된다. 확장성이나 접근 제한의 면에서 public Field보다 좋다고 볼 수 있다. 단, Property에 set을 지정하지 않았더라도 객체의 생성자에서는 초기화시켜줄 수 있다. 그 외에는 set이 없다면 접근이 불가하다.

Indexer

사실 굉장히 자주 사용하는 위 Property와는 달리, 필자가 아직 경험이 부족해서 그런지 Indexer는 사용해본 적이 없고, 강의에서만 들었다.

객체를 배열처럼 사용할 수 있도록 해주는데, C++에서 [] 연산자 오버로딩과 비슷한 개념이다.

public string this[int idx] {
	get { return words[idx]; }
    set { words[idx] = value; }
}

클래스 내부에서 이렇게 생성해 주면, objectTemp[0] 을 호출하면 objectTemp 객체 내의 words[0]이 return된다. Property와 유사하게 get_Item과 set_Item 메소드가 자동으로 생성, 호출된다. 매개변수를 가지는 Property 라고도 볼 수 있다. 끝으로 여기서는 idx를 int 타입으로 했으나 꼭 정수이고 1개여야할 필요는 없다.

이처럼 Property과 유사한 점이 많아서 같은 글에 작성하였다.

기초라고 생각하는 C# 내용의 절반 정도를 정리한 것 같다. 남은 글도 열심히 써야겠다.

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

[C#] Generic  (0) 2020.05.24
[C#] Index와 Range  (0) 2020.05.17
[C#] 메소드  (0) 2020.05.04
[C#] 배열(Array)  (0) 2020.04.30
[C#] C#의 자료형3 - Casting과 Boxing  (0) 2020.04.18