본문 바로가기
유니티 공부/C# 문법

C# 문법 - 확장 메서드(Extension Method)

by 코딩하는 돼징 2024. 1. 19.
반응형
class MyInt
{
    public static bool IsEven(int a)
    {
        return a % 2 == 0;
    }
}
class Program
{
    public static void Main()
    {
        int a = 124;
        bool b = Program2.IsEven(a);
    }
}

만약 IsEvent메서드가 int구조체에 소속된 메서드라면 아래와 같이 더 직관적으로 사용할 수 있을 것이다.

class Program
{
    public static void Main()
    {
        int a = 124;
        bool b = a.IsEven();
    }
}

int구조체가 어떻게 어떻게 정의되어있는지 한 번 확인해보자

이 구조체에 IsEven메서드를 추가하고 싶다. 새로운 메서드를 추가하는 가장 쉬운 방법은 구조체안에 그냥 메서드를 넣는 것이다. 하지만 Int32는 .Net FrameWork안에 있는 구조체이므로 개발자가 임의로 이를 수정할 수 없다.


메서드를 간접적으로 추가하는 방법

1. 파생클래스에 새로운 메서드 추가

상속을 통해 기존 클래스에 새로운 기능을 추가하여 메서드를 간접적으로 추가할 수 있다. 하지만 구조체에서는 상속을 지원하지 않아 사용이 불가능하다.

public class MyInt : IMyInterface
{
    private int value;

    public MyInt(int value)
    {
        this.value = value;
    }

    public bool IsEven()
    {
        return value % 2 == 0;
    }
}

public interface IMyInterface
{
    bool IsEven();
}

class Program
{
    public static void Main()
    {
        MyInt myInt = new MyInt(33);
        bool b = myInt.IsEven();
    }
}

MyInt클래스는 IMyInterface인터페이스를 구현하여 IsEvent메서드를 가진다. 이는 MyInt객체에서 IsEvent메서드를 호출할 수 있다. 하지만 이 방법은 구조체에서 직접 활용하는 것이 아니라 클래스를 이용하여 간접적으로 메서드를 추가하는 것이다.


2. 확장메서드

클래스나 구조체 둘 다 사용 가능

확장 메소드이기 만족해야하는 조건

1) 확장 메서드를 갖는 class는 static이어야 한다.

2) 확장 메서드는 static 메서드여야한다.

3) 확장 메서드의 파라미터는 반드시 this지시어야 한다.


01 구조체 확장 메서드 추가

public struct MyStruct
{
    public int Value { get; set; }

    public MyStruct(int value)
    {
        Value = value;
    }
}
public static class Program2
{
    public static bool IsEven(this MyStruct myStruct)
    {
        return myStruct.Value % 2 == 0;
    }
}

한번 확장 메서드를 호출해보자

class Program
{
    public static void Main()
    {
        MyStruct myStruct = new MyStruct(33);
        bool b = myStruct.IsEven();
    }
}

왜 확장메서드에는 파라미터가 존재하는데 이를 호출할때는 파라미터가 없어요?

확장 메서드의 첫번째 파라미터는 그 메서드를 호출한 객체를 의미한다.


02클래스에 확장 메서드 추가

public class MyClass
{
    public int Value { get; set; }

    public MyClass(int value)
    {
        Value = value;
    }
}
public static class Program2
{
    public static bool IsEven(this MyClass myClass)
    {
        return myClass.Value % 2 == 0;
    }
}

사용 예시

public static void Main()
{
    MyClass num = new MyClass(10);
    bool b = num.IsEvent();
}

 

 


03 sealed에 확장 메서드를 이용해 기능 추가

Calc가 sealed로 선언되어있어 파생클래스에 새로운 메서드를 추가할 수 없지만 확장 메서드를 통해 새로운 기능을 추가할 수 있다.

public sealed class Calc
{
    public int Add(int a, int b) { return a + b; }
    public int Substarct(int a, int b) { return a - b; }
}
public static class Program2
{
    // Calc클래스에 대한 확장 메서드
    public static int Modulo(this Calc c, int a, int b)
    {
        return a % b;
    }
}
public static void Main()
{
    Calc c = new Calc();
    int res = c.Modulo(5, 3);
}

04 특정 Interface에 구현되어있는 확장 메서드 사용

public static void Main()
{
    var animal = new List<string> { "dog", "cat", "pig" };
    var pNames = animal.Where(x => x.StartsWith("p"));
}

Where메서드는 IEnumerable을 확장한 메서드임을 확인할 수 있다.

반응형

댓글