언어 자료구조 알고리즘/C# 언어 문법

12. 속성(Property)

언제나휴일 2009. 8. 19. 05:47
반응형

속성(Property)

 

다루는 내용

 

 - 속성

 - 액세스 수준이 서로 다른 속성

 - 접근자 내부 구현을 생략하는 간단한 속성

 

속성은 필드 값을 읽고 쓰거나 계산하기 위한 메커니즘을 제공되는 멤버이다. 이를 통해 데이터의 안정성과 유연성을 높일 수 있으며 사용자로 하여금 멤버처럼 쉽게 액세스를 가능하게 해 준다. 

 

 Look & Feel & Think       

 

 AboutProperty 클래스의 예를 보면 멤버 필드로 iq를 갖고 있고 상수 max_iq와 min_iq가 정의되어 있다.  그리고 public 메소드로 Study가 있는데 여기에서 속성을 이용하여 값을 읽기 및 변경을 하고 있다.

 

이와 같은 구조를 통해 특정 멤버 필드에 직접 접근하여 값을 변경하지 않음으로 인해 값의 신뢰성을 높일 수가 있다.  Study에서 이를 행해도 되지 않느냐고 생각할 수도 있지만 iq멤버 필드에 값을 변경하는 행위가 많다면 그 모든 행위에 신뢰성 있는 코드를 작업해야 하며 이는 작성도 불편하고 잘못 작성된 곳이 있을 때 이를 찾기도 힘들어 유지보수에도 악영향을 미칠 것임에 틀림이 없다.

 

실용주의 프로그래머와 같은 책들을 보면 직교성에 대한 언급을 빠트리지 않는다.  즉, 좋은 프로그램이 되기 위해서는 하나의 정의는 여러 곳에서 정의를 하지 말며 논리적으로 분리되어서는 안 될 논리를 둘 이상으로 쪼개지 말라는 것이다.

 

이런 측면에서 볼 때 속성을 잘 사용을 하면 직교성있는 코드를 작성하는 데 큰 도움이 될 수 있을 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이러한 속성은 실제로는 특별한 접근자라는 특별한 메소드로 코드 구현 과정을 숨긴 채 값을 가져오고 설정하는 방식을 공개적으로 노출할 수 있다. 

 Look & Feel & Think       

 

il코드를 dump를 할 수 있는 ildasm.exe 유틸을 통해 실제 속성이 어떻게 정의되어 있는지 확인해 볼 수가 있다.

 

ildasm 유틸을 통해 실행 이미지를 열어보면 Iq속성의 get 접근자는 int get_Iq()의 모습을 하고 있고 set 접근자 void set_Iq(int value)의 모습을 하고 있다는 것을 쉽게 인지할 수 있다.  즉, 속성을 정의를 하면 이를 컴파일 전개 과정에서 접근자 메소드로 변형이 되는 것이다.

 

속성은 경우에 따라서는 get 접근자와 set 접근자의 액세스 수준을 다르게 할 수 있으며 set메소드를 구현하지 않고 읽기 전용 속성으로 정의할 수도 있다.  또한, 사용자 지정 접근자 코드가 필요로 하지 않는 경우에는 구현을 생략하고 추가할 접근자만 명시함으로써 컴파일러가 내부적으로 전용 익명 필드를 만들게 할 수도 있다.

 Look & Feel & Think  

 

 아래의 예는 get 접근자의 액세스 수준은 public하게 하고 set 접근자의 액세스 수준은 private하게 서로 액세스 수준을 다르게 설정을 한 예이다.

 

 

다음과 같이 속성의 구현이 필요없을 경우에는 접근자를 선언만을 하여도 된다.  단, 이와 같은 경우에는 get 접근자와 set 접근자 모두를 선언해야 하며 읽기 전용의 속성을 원한다면 set 접근자의 액세스 수준을 private로 지정하는 방법을 통해 외부에 대해서는 읽기 전용의 속성으로 정의할 수 있다.

 

 

반응형

'언어 자료구조 알고리즘 > C# 언어 문법' 카테고리의 다른 글

17. 인터페이스(Interface)  (0) 2009.08.19
16. 다형성  (0) 2009.08.19
15. 상속  (0) 2009.08.19
14.정적 클래스 및 정적 멤버  (0) 2009.08.19
13.메소드  (0) 2009.08.19
11.Class  (0) 2009.08.19
10.Casting  (0) 2009.08.19
9.String  (0) 2009.08.19
8. Object  (0) 2009.08.19
7. 배열  (0) 2009.08.19