<개인공부>/[C#]

[C#] 확장 메서드 (Extension Method) 설명과 예제

BlockDMask 2022. 10. 15. 08:00
반응형

안녕하세요. BlockDMask입니다.
오늘은 C#의 신기한 기능 중에 하나인 확장 메서드 기능에 대해서 알아보려고 합니다.

<목차>
1. 확장 메서드란?
2. C# 확장 메서드 예제

 

1. C# Extendion Method?

1-1) 확장 메서드 설명

확장 메서드는 기존 클래스의 기능을 확장하는 기법입니다. (상속과 다름)
좀 풀어서 이야기하면
클래스의 외부에서 클래스의 메서드처럼 사용할 수 있는, 새로운 메서드를 만들 수 있는 기능입니다.

ex) int 클래스가 있다면 int 클래스에 없는 메서드를 우리가 직접 외부에서 만들어서,
마치 기존에 int 클래스에 있던 기능인 것처럼 메서드를 만들 수 있게 되는 것입니다.

물론 이미 만들어져 있는 int 클래스 이외에도 우리 프로그래머가 만들어 놓은 사용자 정의 클래스에서도
새롭게 확장 메서드를 만들 수 있습니다.

확장 메서드를 생성하는 방법은 아래 세 가지를 기억하면 됩니다.
(1) static class
(2) static method
(3) 첫 번째 매개변수 this 키워드

확장 클래스를 선언할 때 static으로 선언을 해주고
확장 메서드를 만들 때도 static으로 선언을 해줍니다.
마지막으로 확장 메서드의 첫 번째 매개변수는 this 키워드를 사용한 후 확장하고자 하는 클래스 타입을 적어 줍니다.

위 예시를 보면 int 클래스를 확장한다고 했을 때 2번째 예제처럼 적어주시면 됩니다.
예시를 보면 이제 int 클래스의 다른 메서드들처럼 
확장 메서드도 인스턴스.함수이름() 이런식으로 사용이 가능한 것을 볼 수 있습니다.

이게 진짜 사용이 간편하고 신기한 기능인 것 같습니다.

 

1-2) 그럼 확장 메서드를 왜(WHY?), 언제 써야 할까요?

제가 생각했을 때는 아래와 같은 상황에 쓰라고 만들어 준 것 같습니다.

(1) C# 혹은 외부 (dll)에 이미 정의되어있는 클래스들에 새로운 기능이 있는 메서드를 추가해야 할 때
ex) int 클래스에 새로운 메서드를 추가하고 싶다거나, string 클래스에 새로운 메서드를 추가하고 싶을 때

(2) 메서드를 새롭게 만들려 하는 클래스가 이미 상속 등으로 인해 영향을 받는 클래스가 많을 때
확장 메서드로 만든 함수는 자식 클래스에서 것은 재정의 할 수 없기 때문입니다.
ex) 클래스 내부에 메서드를 하나 추가하게 되면, 해당 클래스를 상속받는 메서들이 overriding 등의 문제가 생길 수 있으므로

(3) 오히려 영향을 주고 싶은 클래스가 많을 때
System.Collection.Generic.IEnumerable<T> 에 확장 메서드를 만들어 버리게 되면
IEnumerable<T>을 상속받는 모든 컬렉션에서 해당 확장 메서드를 사용할 수 있게 됩니다.

 

1-3) C#에서는 그럼 확장 메서드를 어디에서 쓰고 있나요? 

C#의 LINQ에서 확장 메서드를 사용하고 있습니다.

기존에 int에는 OrderBy라는 메서드가 없습니다. 
하지만 우리가 LINQ 네임스페이스를 임포트 하는 순간, int 에는 OrderBy라는 메서드가 생겨나게 됩니다.
(사용할 수 있게 됨)

반응형

 

 

2. C# 확장 메서드 예제 코드

2-1. 기존 C# 클래스에 확장 메서드 추가하기

extension method 1

string 클래스에 대문자만 반환해주는 메서드를 새롭게 만들어서 사용해 보았습니다.
함수 자체는 예시를 위한 거니 확장 메서드를 어떻게 사용하는지에 대해서 보시면 될 것 같습니다.

이렇게 확장 메서드를 사용하면 해당 클래스의 인스턴스로 바로 함수를 호출할 수 있습니다.

 

2-2. 사용자 정의 클래스에 확장 메서드 추가하기

extension method 2

이렇게 사용자가 만든 클래스에도 확장 메서드를 사용할 수 있습니다. 간단하죠?

 

2-3. 확장 메서드와 내부 인스턴스 메서드의 우선순위

이제 마지막 예제로 확장 메서드와 내부 인스턴스 메서드의 우선순위에 대해서 알아보려고 합니다.
확장 메서드는 내부 인스턴스 메서드에 비해서 우선순위가 낮습니다.
즉, 같은 메서드 이름과 함수 시그니처(매개변수)를 사용한다면 확장 메서드가 가려진다는 이야기입니다.

extension method vs instance method

결과에서 보신 바와 같이 확장 메서드보다는 이미 클래스 내부에 있는 메서드가 우선순위가 더 높습니다.
그래서 예제 결과를 보면 확장 메서드가 호출되지 않고, 내부 인스턴스 메서드가 호출되는 것을 볼 수 있습니다.

 

감사합니다. 이상으로 오늘은 C#의 신기한 기능 확장 메서드에 대해서 알아보았습니다.
참고 문서 : https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

반응형