확장 메서드(Extension Methods)는 기존 클래스에 새로운 메서드를 추가할 수 있는 기능이다.
이 기능을 통해, 원래의 클래스를 수정하지 않고도 그 클래스에 메서드를 추가할 수 있다. 주로 기존 클래스가 제공하는 기능에 추가적인 메서드를 제공할 때 유용하다.확장 메서드의 특징
- 기존 클래스 수정 없이 기능 추가: 원래 클래스의 코드를 수정하지 않고 새로운 기능을 추가할 수 있다.
this키워드 사용: 확장하려는 타입을 첫 번째 파라미터로 받고, 그 파라미터 앞에this키워드를 붙여서 확장할 메서드를 정의한다.static메서드: 확장 메서드는 항상static메서드여야 한다. 그래서 메서드를 정의할 때static으로 선언해야 한다.확장 메서드 사용 예시
예시 1:
string클래스에ToFirstUpper확장 메서드 추가목표:
string클래스에 대해 첫 번째 문자를 대문자로 바꾸는 메서드를 추가하기.
기존의string클래스는ToUpper와 같은 메서드는 있지만, 첫 번째 문자만 대문자로 바꾸는 기능은 없다.확장 메서드 정의
public static class StringExtensions { // string 클래스에 대해 첫 글자만 대문자로 바꾸는 확장 메서드 정의 public static string ToFirstUpper(this string str) { if (string.IsNullOrEmpty(str)) return str; // 비어 있거나 null일 경우 그냥 반환 return char.ToUpper(str[0]) + str.Substring(1); // 첫 글자를 대문자로 변경 후 나머지 문자열 추가 } }
this string str:string타입을 확장하려고this를 사용해서str을 첫 번째 파라미터로 받는다.- 이 메서드는
string클래스에 새로운 메서드를 추가한 것처럼 사용할 수 있게 한다.확장 메서드 사용
class Program { static void Main() { string myString = "hello"; string result = myString.ToFirstUpper(); // 확장 메서드 호출 Console.WriteLine(result); // 출력: "Hello" } }
myString.ToFirstUpper(): 기존string클래스에는 없던ToFirstUpper()메서드를 호출하여 첫 번째 문자를 대문자로 변경한 결과를 출력한다.확장 메서드가 가능한 이유
- 정적 클래스와 메서드: 확장 메서드는 정적 클래스에 정적 메서드로 정의된다. 이 메서드는
this키워드를 통해 메서드 호출 대상 객체(여기서는string)를 첫 번째 매개변수로 받는다.- 암묵적인 호출: 확장 메서드는 실제로는 호출하는 클래스에서
this키워드를 사용하여 해당 타입을 확장한 것이므로, 확장된 메서드를 호출할 때 마치 원래 메서드처럼 사용할 수 있다. 즉,myString.ToFirstUpper()처럼 호출되지만, 내부적으로는StringExtensions.ToFirstUpper(myString)처럼 동작한다.예시 2:
int타입에IsEven확장 메서드 추가
int타입에 대해 짝수인지 확인하는IsEven메서드를 확장하는 예제.확장 메서드 정의
public static class IntExtensions { public static bool IsEven(this int number) { return number % 2 == 0; // 짝수이면 true 반환 } }
this int number:int타입을 확장하려면this int를 사용하여 해당int값에 메서드를 추가한다.확장 메서드 사용
class Program { static void Main() { int myNumber = 4; bool isEven = myNumber.IsEven(); // 확장 메서드 호출 Console.WriteLine(isEven); // 출력: True } }
myNumber.IsEven():int클래스에 없는IsEven()메서드를 호출하여 짝수인지 여부를 확인할 수 있다.확장 메서드가 왜 유용한가?
- 기존 클래스에 새로운 기능 추가: 기존 클래스를 수정할 수 없거나, 수정할 필요 없이 새로운 기능을 간단히 추가할 수 있다.
- 클린 코드: 확장 메서드를 사용하면 기능을 잘 분리할 수 있어, 코드가 깔끔하고 읽기 쉬워진다.
- 메서드 체이닝: 확장 메서드를 체이닝 형태로 사용할 수 있어 읽기 쉬운 코드를 작성할 수 있다.
예시 3: 메서드 체이닝
확장 메서드를 체이닝하여 사용할 수 있다. 예를 들어, 여러 문자열을 연속으로 처리하는 경우:
public static class StringExtensions { public static string ToFirstUpper(this string str) { if (string.IsNullOrEmpty(str)) return str; return char.ToUpper(str[0]) + str.Substring(1); } public static string ToExclamation(this string str) { return str + "!"; } }
ToFirstUpper()와ToExclamation()두 개의 확장 메서드를 결합하여 사용할 수 있다.class Program { static void Main() { string myString = "hello"; string result = myString.ToFirstUpper().ToExclamation(); // 체이닝 Console.WriteLine(result); // 출력: "Hello!" } }결론
확장 메서드는 기존 클래스에 새로운 메서드를 추가하는 기능으로, 정적 클래스에
this키워드를 사용하여 구현한다. 이를 통해 원래 클래스를 수정하지 않고도 새로운 기능을 손쉽게 추가할 수 있다. 다양한 타입에 대한 확장 메서드를 정의하고 사용하면 코드 재사용성과 가독성을 높이는 데 유용하다.