삽질의 현장/- .NET

#054_닷넷(.NET)_.Net Framework 기본 - 익명메서드(Anonymous Method)

shovelman 2015. 11. 4. 11:18


안녕하세요 삽잡이입니다.


이번 시간에는 지난, 지지난 시간에 이어서 

delegate의 연장선인 익명 메서드에 대해서 알아보겠습니다.




익명 메서드란, 말 그대로 '이름 없는 메서드'입니다.

모든 메서드에는 이름이 있어야되지 않습니까? 

메서드의 이름을 통해 메서드를 호출할 수 있었기 때문입니다.


그런데, 이름 없이도 호출이 되는 경우가 있습니다.

이 때는 바로 '이벤트의 핸들러'일 때입니다.


왜 이벤트 핸들러일 경우 메서드에 이름이 없어도 될까요?

굳이 메서드로 만들고 핸들러로 연결 시키는 것이 아니라, 

이름이 없으면 행동만 있으면 되기 때문에

즉, 어떻게 할 것인지에 대해서 절차만 정의 되있으면 되기 때문입니다.


이벤트는 어떤 이벤트가 발생하면 메서드를 호출해줍니다.

그런데, 함수 지정할 필요 없이 이벤트가 발생하면 함수 이름이 아니라,

'이런 행동을 처리해줘!' 하며 행동을 서술한다는 것입니다.

즉, 직접 정의를 쓰는 것이지요.

이처럼 직접 정의만으로도 

진짜 함수를 만들어 이름을 쓰는 것과 효과가 같습니다.


그러면 지금부터 장, 단점에 대해서 알아보겠습니다.


단점부터 알아보죠..

이벤트 핸들어에 직접 행동을 써넣게 되면, 행동을 딱 한번만 쓸 수 있습니다.

다른 이벤트에 연결하려면 또 정의를 해야하는 번거로움이 있지요.


하지만, 이전에 

'A라는 이벤트가 발생하면 B 이벤트 핸들러를 호출해줘!' 라는 호출 방식이었을 경우

B 이벤트 핸들러에 대해서 어떠한 내용인지 찾아보고

이해해야하는 불편함이 있었습니다.

즉, 핸들러의 이름만으로는 호출하는데 어느정도 한계가 있었다 이겁니다.

하지만, 익명 메서드를 사용하게 되면 

어떻게 하고자하는지 눈에 보이는 즉, 명확성을 더욱 주게 되는 장점이 있습니다.


여담으로 말씀드리자면,

MS 계열에서는 Handler라고 부르는 것이 다른 곳에서는 Listener로 주로 불리게 됩니다.



delegate라는 키워드만을 쓸 뿐 함수 이름은 없습니다.

인수가 필요하면 인수를 지정할 수 있고, 또는 인수 없이도 만들 수 있게 됩니다.

이와 같이 익명 메서드를 구현하게 되면 컴파일러가 내부적으로 알아서 잘 처리를 해주게 됩니다.


익명 메서드의 장점에 대해서 더 알아보겠습니다.

가장 중요한 익명 메서드의 특징은 바로 '지역 변수에 접근할 수 있다'는 것입니다.



기존에 핸들러를 만들어 사용할 때에는

핸들러를 인수로 넘길 수는 있으나, 

지금 내가 가지고 있는 변수는 핸들러에 넘기고 싶다면 넘길 수 없었습니다.

내가 사용하고 있는 인자를 넘기기 위해서는

해당 함수가 호출할 때에 넘겨줘야하는데 

이벤트 핸들러에 대해서는 성격이 조금 다릅니다.


내가 사용하고 있는 변수를 함수의 인자로 넘기기 위해서는 함수를 호출해야합니다.

하지만, 이벤트 핸들러는 말그대로 메서드이지만 핸들러입니다.

일반 메서드가 아니라는 소리입니다.


핸들러는 이벤트가 발생했을 때 호출되는 메서드로써,

이벤트가 발생 했을 경우 호출되는 인자만을 가지고 있습니다.

즉, 상관 없는 인자들을 가지고 있지 않다는 소리입니다.

다른 인자를 넘겨주고 싶은데 핸들러는 기본적으로 이것이 안된다 이겁니다.



그런데 익명 메서드를 사용하게 되면

현재 내 코드 내에 정의되어있기 때문에 지역 변수에 접근이 가능해집니다.


다시 말씀드리지만, 핸들러는 불가능했었습니다.

하지만, 지역 변수를 익명 메서드 내에서 사용할 수 있습니다.


그런데...

이제 익명 메서드를 사용하지 않습니다.

왜냐! 익명 메서드를 더 쉽게 만들어 낸 람다가 나왔기 때문입니다.



힘빠지시지죠?

그런 의미로 다음 시간에 뵙겠습니다.


이상 삽잡이였습니다!