반응형
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을 확장한 메서드임을 확인할 수 있다.
반응형
'유니티 공부 > C# 문법' 카테고리의 다른 글
C# - Set과 HashSet(Add,Remove,Contains,IntersectWith,UnionWith) (0) | 2024.02.20 |
---|---|
C# - Windows Forms 프로젝트 사용해보기 (0) | 2024.01.20 |
C# - await와 async (0) | 2024.01.19 |
C# - Thread vs Task 클래스 + EAP/APM/TAP (0) | 2024.01.19 |
C# 문법 - 인스턴스 생성을 위한 new 키워드 (0) | 2023.12.14 |
댓글