삽질의 현장/- .NET

#061_닷넷(.NET)_.Net Framework 기본 - 확장 메서드

shovelman 2015. 11. 5. 19:53


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


이번 시간에는 확장 메서드에 대해서 알아보려고합니다.


확장 메서드는 중요한 문법입니다.

물론, 어느 하나 중요하지 않는 문법이 없겠지만요. 허허...


이 확장 메서드라는 녀석 덕분에 C# 코드의 기능이 더욱 범용화되고 유연해졌습니다.

학장 메서드란, 내 것이 아닌 남의 것의 메서드를 내 것처럼 사용하는 것입니다.



예를 들어, 원래 Sap이라는 녀석에는 '삽질'이라는 메서드가 없지만,

다른 녀석에게 있는 '삽질'이라는 메서드를 나의 메서드처럼 동작하도록 하는 메서드를 뜻합니다.

즉, 남의 메서드를 나의 객체의 메서드인듯 동작하도록 하는 메서드를 

확장 메서드라고한다는 것입니다.


이 확장 메서드란 언제 유용할까요?

확장 메서드에는 몇 가지의 장점이 있습니다.



원래 처음 개발할 때 

먹고, 자고, 달리는 기능만이 필요한 'Sap'이라는 클래스가 있다고 해봅시다.

라이브러리로 다 만들고 개발이 끝난 상태에서

갑자기 '삽질'이라는 기능을 추가하라는 오더가 내려졌다면...


이미 완성한 코드 다 뜯어 고치고, 컴파일 하고, 어셈블리 재배포하고...

오우 X...

그래서 '삽질'이라는 기능을 내 것인냥 사용할 수 있도록 '확장 메서드'를 사용하면 됩니다.



만약, object 형식이 확장 메서드를 갖게 되면 

그 말은 모든 객체들이 해당 메서드를 갖게 되는 것입니다.


더 큰 장점은

인터페이스를 갖도록 한다면, 

그 인터페이스를 구현하는 모든 형식들은 그 확장 메서드를 갖게 되는 것입니다.



사실... 우리는 알게 모르게 확장 메서드를 사용하고 있었습니다.



보라색 박스가 보이십니까...

저렇게 화살표 형식이 들어있는 메서드들이 모두 다 '확장 메서드'입니다.

화살표가 없는 메서드들을 찾아볼 수 없군요...

참고로 화살표가 없는 단지 그냥 보라색 박스의 메서드는 

인스턴스 메서드로 자신의 메서드를 뜻합니다.


아무튼... 난 구현도 안했는데 뭔 확장 메서드...?

바로, 부모 형식이 확장 메서드를 갖고 있기 때문에 모두 확장 메서드들을 갖게 되는 것입니다.


이처럼 확장 메서드를 사용할 경우 개발할 때 보다 수월해집니다.

공통적인 기능을 뽑고, 해당 기능들을 인터페이스로 만들게 된다면,

각각의 클래스마다 정의할 필요 없이 가져다 사용하게 되면 되기 때문입니다.



이제 우리는 확장 메서드가 무엇인지 파악했습니다.

그러면 확장 메서드는 어떻게 만들어지는 것일까요?


확장 메서드를 만들기 위해서는 세가지의 작업이 필요합니다.


우선, 정적 클래스를 만들어야합니다.

그 다음, 정적 클래스 내에 정적 메서드를 만들어내야합니다.

여기서 주의해야할 점은 인스턴스 메서드는 안된다는 것입니다.

그리고, 마지막으로 매개 변수 첫번째 인수는 'this' 키워드를 가져야합니다.


그런데 왠 뜬금없는 this...

지금까지 우리가 경험해본 this는 이번 것까지 합하여 총 세가지의 경우에 사용합니다.


우선, 자기 자신을 가리킬 때... 즉, 내 것이라는 것을 명확하게 할 때 사용합니다.

그리고 인덱서에서 사용했었습니다... this[int idx] 기억하시나요?



마지막으로 지금 배운 확장 메서드를 사용할 때 사용한다는 것입니다.

this 뒤에 있는 형식은 정의되어 있는 메서드를 확장 메서드로 가지겠다는 것을 알려줍니다.


확장 메서드에는 this 키워드가 사용된 매개 변수만이 오는 것이 아닙니다.

단지, 맨 첫번째 인자가 this 파라메터여야 한다는 약속만 지키면 됩니다.



예를 들어서 Point 객체에 Add()라는 메서드가 없는데

확장메서드로 갖는 경우를 생각해보겠습니다.

기존의 값에 +10을 한다면?



return 타입이 Point인 확장 메서드를 만들면 됩니다.

매개변수인 this Point는 확장 메서드의 주인을 말하는 것이되고,

다음 파라메터인 int는 확장 메서드에 사용되는 매개변수가 되는 것이죠.

즉, 인수를 지정해 줄 수 있다는 사실을 말씀드리고 싶었습니다.



확장 메서드에서는 또한 '선택적 인수'가 가능합니다. 또한, 오버로딩도 가능하지요.

중요한것은 첫번째 인수만은 절대로 건드려서는 안된다는 것입니다.


우선 선택적 인수부터 살펴보도록 하겠습니다.



인수를 지정함으로써 

선택적으로 매개변수에 의해 실행하는 코드가 달라질 수 있음을 확인할 수 있습니다.


오버로딩 또한 가능합니다.




확장 메서드는 선택적 인수, 오버로딩 둘 다 가능합니다.

일반 메서드와 똑같지만,

확장 메서드로 갖고자하는 형식을 this 키워드와 같이쓴다는 차이가 있습니다.


명시적으로 호출할 수 있는 확장 메서드는

사실, '클래스 명 + 메서드'를 사용하여 호출하게 됩니다.

컴파일러가 서로간에 약속을 했기 때문에 간단하게 호출이 가능했던 것입니다.


this를 빼면 어떻게 될까요?

this를 뺴면 일반적으로 정적 메서드를 만든 꼴이 됩니다.

즉, 확장 메서드가 아니기 때문에 축약해서 사용할 수가 없게 됩니다.

확장 메서드를 쓰는 방법은 첫번째 인수로 this를 넘기기 때문에 가능해집니다.


이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!