본문 바로가기
연구하기/Computer Engineering

.NET 의 델리게이트(delegate) 와 형 (type)

by 썰렁황제 2006. 1. 25.
** 델리게이트의 개념

델리게이트에 대해 간단히 요약하면, 공간적 입장으로 해석하고 있는 기존 OOP 개념을 보완하기 위해 나온 새로운 개념이라고 볼 수 있다.

현재 .NET 환경에서 내가 이해하고 있는 델리게이트의 개념은 다음과 같다.

1) 개념상으로는 개체의 동작을 추상화한 '형(Type)' 이다.

   델리게이트에 각종 비동기 호출을 위한 패턴이 정의된 점을 보면 마이크로소프트가 델리게이트를 어떤 개념으로 해석했는지를 잘 보여준다.

2) 형태상으로는 메소드의 형식을 추상화한 '형' 이다.

  .NET Framework 상에서는 메소드의 형식 중 중요한 두 가지인 인자(Argument) 와 반환값(Return value) 으로 델리게이트를 정의할 수 있다.


  멀티태스크의 입장에서 델리게이트의 개념은 매우 중요하다. 왜냐하면 순수하게 개체 자체만으로는 작업의 처리라는 흐름을 표현할 방법이 마땅치 않기 때문이다. 하나의 개체는 기본적으로 여러 개의 스레드가 거쳐갈 수 있으며, 그렇기 때문에 개체의 입장에서는 그 개체가 하나의 스레드만을 접근하도록 제한하지 않는 이상 그 자신만으로는 스레드를 제어할 수 없다.
  사실 작업 처리 흐름을 실질적으로 기술하고 있는 것은 우리가 대부분의 명령을 코딩하는 영역이 어디인지를 생각해 본다면 간단히 알 수 있다. 그렇다. 바로 메소드이다. 문제는 자바와 같은 언어에서 정의하고 있는 클래스와 인터페이스의 형식만으로는 이러한 메소드들에 대한 동적인 접근을 지원하지 않는다는 점이다. 물론 런타임 중에도 언제든지 형식에 대한 접근을 지원하는 Reflection 기능이 있지만, 이것은 Framework 가 지원하는 것이지 형식 자체가 지원하는 것은 아니다.
  델리게이트는 바로 이러한 상황에 놓인 메소드를 동적으로 접근할 수 있도록 추상화하는 역할을 한다. 따라서 이제 우리는 비로소 작업의 처리를 표현할 수 있는 수단을 가지게 되었다.


** .NET 에서 델리게이트의 활용

  .NET 은 델리게이트의 이러한 특성을 활용하여 델리게이트 내에 비동기 작업 등의 멀티스레드 작업을 위한 메소드들을 마련해 두고 있다. BeginInvoke 및 EndInvoke 와 같은 메소드가 아주 대표적인 것이라고 볼 수 있다. 이 부분을 보면 마이크로소프트가 델리게이트에 대해 어떠한 개념을 가지고 있는지 알 수 있다.

 
** 자바에서 델리게이트 개념의 구현

  자바는 Reflection 을 통하여 런타임 중에도 형식 요소에 대해 얼마든지 접근할 수 있도록 하고 있으며, 이 때문에 동적으로 메소드에 접근하는 것이 가능하다. 따라서 이를 잘 이용해 기반 프레임워크에 델리게이트의 개념을 클래스로 구현해 둔다면, 이를 이용하여 이후 코딩시에 델리게이트 개념을 충분히 활용할 수 있다.
  다만 interface 나 class 와 같은 공식적인 형태으로 지원해 주는 것은 아니기 때문에, .NET 의 BeginInvoke, EndInvoke 메소드 등에서 보여주는 정확한 인자 형식이나 정확한 반환 형식을 코딩 중에 활용할 수는 없다. 아마 대부분은 Object 형으로 인자를 넘겨주고 반환값으로도 Object 형을 받아 이를 캐스팅 해 사용하는 방식이 될 것이다.

 
** .NET 에서 형 (Type) 의 개념

  여기서 알 수 있는 것은, .NET 에서 형(type) 을 어떤 개념으로 정의하고 있는지에 대한 것이다.
  사실 처음에 .NET 에서 모든 형식을 추상화시킨 type 의 개념은, 단지 개체 지향 구조를 그대로 이전 형식에 대해 대입할 수 없기 때문에 만들어 낸 궁여지책이라는 생각을 했다. 하지만 델리게이트 개념이 들어가자 이야기가 달라지게 되었다.
   사실 interface 와 class 는 기본적으로 둘 다 어떠한 개체를 표현하기 위한 수단으로 제공되기 때문에 하나의 공통개념으로 처리할 수 있다. interface 는 클래스가 가진 개체의 표현 한계, 즉 어떠한 개체를 완벽하게 클래스로 추상화하는 것은 불가능하다는 점을 극복하기 위한 표현 요소이기 때문이다. (이에 대해서는 나중에 다시 언급하기로 하자)
  하지만 델리게이트는 개체가 아니라 메소드를 표현하는 수단이기 때문에 interface 나 class 와는 같은 범주에 묶을 수가 없다. 시공간으로 말한다면, 델리게이트는 시간에 해당하는 요소이고, 클래스나 인터페이스는 공간에 해당하는 요소이기 때문이다.
  따라서 이러한 형식을 하나로 묶기 위하여 새로이 만들어낸 존재가 바로 Type 이다. 시공간을 '차원' 이라는 하나의 개념으로 묶기 위한 요소라고 보면 된다.
  이러한 관점에서 본다면 struct 역시 class 와는 다른 입장으로 정의되었다고 볼 수 있다. 이에 대해서는 다음에 struct 의 개념에 대해 이야기할 때 다시 한 번 언급해 보도록 하려 한다.
 

반응형