Delphi [델파이 문법 시리즈] #4. 익명메소드 - 활용법(마지막)
2012.04.10 19:38
본 내용은 "델파이 프로그래밍 언어" 도서의 일부분을 정리한 것입니다. 보다 자세한 내용은 해당 도서를 통해 확인할 수 있습니다. "델파이 프로그래밍 언어"(342쪽, 구입안내): http://tech.devgear.co.kr/devgearbook/2431 그 외 데브기어 도서들은 다음 링크를 통해서 확인할 수 있습니다: www.devgear.co.kr/book |
익명 메소드의 유용성
익명 메소드는 호출 가능한 어떤 것에 대한 단순한 포인터 이상을 제공합니다. 익명 메소드 는 몇가지 장점을 제공합니다.
- 변수 값들을 연결(bind)할 수 있습니다.
- 메소드를 정의하고 사용하는 편리한 방법입니다.
- 코드를 파라미터화하는 것이 쉽습니다.
변수의 바인드
익명 메소드는 코드 블록에 그 코드와 변수가 정의된 환경에 대한 변수 연결(binding)을 제공하며, 심지어 그 환경이 유효범위 내에 있지 않은 경우에도 마찬가지입니다. 함수나 프로 시저에 대한 포인터는 이런 역할을 할 수 없습니다.
예를 들어, 위의 코드 예제에서 adder := MakeAdder(20); 문장은 변수의 값 20로의 바 인딩을 캡슐화하는 변수 adder를 만듭니다.
몇몇 다른 언어들에서는 이런 코드 구성을 클로저(closure)라고 부릅니다. 역사적으로, adder := MakeAdder(20);와 같은 표현식을 계산하는 것은 닫힌 영역(closure)을 만들어냈다는 데 에서 착안한 것입니다. 클로저는 함수 내에서 참조되고 그 외부에서 선언되는 모든 변수들의 바인딩에 대한 참조를 가지는 객체를 나타내며, 변수들의 값을 캡쳐함으로써 닫히게 됩니다.
사용의 편리함
다음의 예제는 단순한 메소드 몇 개를 갖는 일반적인 클래스와 그 메소드들을 호출하는 것 을 보여줍니다.
위 코드를 익명 메소드를 사용하여 동일한 메소드를 정의하고 호출하는 코드와 비교해봅시다.
익명 메소드를 사용하는 이번 코드가 얼마나 간단해지고 짧아졌는지 살펴보시기 바랍니다. 이 방법은 다른 곳에서는 전혀 사용되지 않을 클래스를 생성하는 오버헤드와 수고 없이 이 런 메소드들을 명확하고 간단하게 정의하려 할 때 이상적입니다. 이 코드는 더 이해하기 쉽 기도 합니다.
코드를 파라미터로 사용
익명 메소드는 값 뿐만 아니라 함수와 구조를 코드로 파라미터화하는 코드를 작성하기 쉽게
해줍니다.
멀티 스레딩은 익명 메소드를 활용하기에 좋은 애플리케이션입니다. 어떤 코드를 병렬로 실
행하려 하는 경우 다음과 같은 병렬 순환(parallel-for) 함수가 필요할 수 있습니다.
ParallelFor 프로시저는 여러 스레드들에서 한 프로시저를 반복합니다. 이 프로시저가 스레드 혹은 스레드 풀을 이용하여 적절하고 효율적으로 구현되었다면, 간단히 멀티 프로세서 의이점을활용할수있게됩니다.
이 코드를 익명 메소드를 사용하지 않고 구현하려면 얼마나 복잡한 코드가 될지 생각해보십 시오. 아마도 가상 추상 메소드를 가진“작업”클래스와 ExpensiveCalculation을 위한 구 체화 자손 클래스, 그리고 모든 작업들을 큐에 추가하는 작업까지... 자연스럽고 통합된 코 드는 아닐 것입니다.
여기서, 병렬 순환(parallel-for) 알고리즘은 코드로 파라미터화된 추상화 구현입니다. 과거 에는 이런 패턴을 구현하는 일반적인 방법은 하나 이상의 추상(abstract) 메소드를 갖는 가 상(virtual) 기반 클래스를 이용하는 방법이었습니다. TThread 클래스와 그 추상 Execute 메소드를 생각해보십시오. 하지만, 익명 메소드는 이런 패턴을 알고리즘과 데이터 구조를 코드로 파라미터화하여 훨씬 쉽게 해줍니다.