본문 바로가기
Programming/C#

[C#] 확장 메소드 (Extension Methods)

by SpiralMoon 2019. 11. 21.
반응형

확장 메소드 (Extension Methods)

C#에서 이미 만들어진 클래스에 메소드를 추가하는 방법에 대하여 알아보자.

확장 메소드란?

프로그래밍을 하다보면 이미 만들어진 클래스에 새로운 메소드를 추가해야 할 때가 생긴다.

직접 만든 클래스라면 메소드를 추가하여 수정이 가능하지만, 남이 만든 클래스(라이브러리, C# 기본 제공 클래스 등)는 소스코드를 수정할 수 없다.

 

대표적인 대안으로 부모클래스를 상속하여 자식클래스에서 메소드를 추가해 확장하는 방법이 있는데, 이는 메소드가 추가될 뿐인데 상속을 유발하기 때문에 프로그램 설계상 가장 좋은 방법은 아니다.

 

C#은 상속을 하지 않고도 이미 만들어진 클래스에 새로운 메소드를 추가 확장할 수 있는 방법을 제공하며, 이를 확장 메소드(Extension method) 기법이라고 한다.

적용

/// <summary>
/// 계산기 클래스
/// </summary>
public class Calculator
{
    public Calculator()
    {

    }

    public int Plus(int a, int b)
    {
        return a + b;
    }

    public int Minus(int a, int b)
    {
        return a - b;
    }
}

위 소스코드처럼 더하기, 빼기 메소드가 있는 어떤 Calculator 클래스가 주어졌다고 가정해보자.

 

VS2019에서 보여지는 화면

Calculator의 인스턴스는 Plus 메소드와 Minus 메소드만 사용할 수 있다.

계산기인데 더하기와 빼기 밖에 없는 것이다. 여기에 확장 메소드 기법을 사용하여 곱하기와 나누기 기능을 추가로 넣어보도록 하자.

 

/// <summary>
/// 확장 메소드들을 정의할 정적 클래스
/// </summary>
public static class Extension
{
    public static int Times(this Calculator calculator, int a, int b)
    {
        return a * b;
    }

    public static int Divide(this Calculator calculator, int a, int b)
    {
        return a / b;
    }
}

확장 메소드 기법을 사용하기 위해서는 아래 규칙을 순서대로 지켜야 한다.

 

1. 확장 메소드들을 정의할 클래스를 static으로 선언한다.

2. 정의한 클래스 내부에 확장하고 싶은 메소드를 static으로 선언한다.

3. 첫 번째 파라미터로 메소드가 포함되어질 클래스를 this 포인터와 같이 적어준다.

4. 그 뒤로는 메소드가 요구할 나머지 파라미터들을 순서대로 적어준다.

 

위 작업을 모두 끝냈다면 성공적으로 기존 클래스에 메소드를 확장했다고 할 수 있다.

 

메소드를 확장한 모습

확장한 후 다시 Calculator의 인스턴스를 사용하는 화면이다. Plus, Minus만 있던 아까와 달리 새로 확장한 Times, Divide 메소드까지 사용할 수 있게 되었다.

 

(※ 확장을 했는데도 보이지 않는다면 소스파일에 Extension 클래스의 네임스페이스를 using으로 포함시켜보자)

 

실행결과

실행해보면 잘 동작한다.

반응형

댓글