2008/C#2008. 7. 25. 08:57

2.2. System.Object의 활용

프레임워크에서 정의되는 모든 개체들의 최상위 클래스는 반드시 System.Object입니다. 심지어는 구체적인 형식을 알 수 없는 개체마저도 System.Object로 형변환 처리가 되는 것도 정당합니다. 이럴 경우 형식의 모호성이라는 문제점이 발생합니다. 즉, 전달받은 개체가 구체적으로 어떤 개체인지 알 길이 없을 수도 있으며 본래의 형식으로 복원하는 것이 불가능해질 수도 있다는 것입니다.

앞의 경우와는 달리 System.Object로의 형변환은 매우 극단적으로 추상화된 형변환이기 때문에 이러한 문제점이 발생하게 됩니다. 하지만 반드시 심각한 문제점인 것만은 아닙니다. 오히려 이것이 리플렉션이 왜 중요한지 알려주는 중요한 연습 문제가 되는 것입니다.

오늘 강좌에서는 언어 구문을 활용한 원시적인 리플렉션을 사용해 보도록 하겠습니다. 바로 is 연산자입니다. is 연산자의 문법 구조는 다음과 같습니다.

[생성된 개체명] is [확인하고자 하는 형식명];

is 연산자로 계산된 값은 System.Boolean 형식으로 반환됩니다. (즉, True 또는 False입니다.) is 연산자가 예외를 일으키지 않고 True 또는 False를 반환하려면 개체가 null이 아니어야 하고 확인하고자 하는 형식명이 컴파일러가 인식할 수 있는 형식 이름이어야 한다는 것, 그리고 생성된 개체가 해당 형식을 직접 구현했거나 해당 형식이 생성된 개체 형식보다는 추상 형식이어야 한다는 것입니다.

이것을 사용하여 예상할 수 있는 형식 몇가지를 검사해 보는 것이 가능합니다. 하지만 여기에는 몇 가지 한계가 있습니다.

  • 찾고자 하는 형식이 상속을 활용한다면 정확히 들어맞는 형식임을 보장할 수는 없게 된다.
  • 찾고자 하는 형식의 수가 많다면 굉장히 많은 수의 조건문이나 3항 연산자를 중첩 사용해야 한다.
  • 찾고자 하는 형식이 컴파일러가 인지할 수 있는 이름 목록 가운데 없으면 이 방법은 사용할 수 없다.

이런 문제점을 해결하기 위해서 몇가지 방법을 더 찾아야 하겠습니다.

오늘 강좌는 우선 여기까지 쓰도록 하겠습니다. 다음 강좌를 보시기 전까지 과제가 하나 있습니다. 과연 위에서 언급했던 문제점을 해결하기 위하여 어떤 방법을 어떻게 활용하여야 할지에 대해서 진지하게 고민해 보십시오. 다음 강좌에서 그 답을 속시원하게 알려드리도록 하겠습니다. ^^

* 지난번 문제에 관하여: is 연산자를 사용하는 방법으로 아주 원시적인 리플렉션이 가능하다고 말씀드린 적이 있었습니다. 하지만 이것만으로는 리플렉션의 전부를 살펴볼 수 없다고 말씀드린 적이 있었습니다. 그에 대한 해답은 앞으로 올라오는 강좌에서 적절한 내용을 활용하시는 것입니다.


Posted by penguindori