확장 메서드
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 39번째.
Extension 메서드를 사용하면 소스 코드를 수정하거나 파생 클래스를 만들지 않고도 기존 형식에 새 메서드를 추가할 수 있습니다. Extension 메서드는 해당 형식의 네이티브 메서드인 것처럼 표시되므로 코드를 더 읽기 쉽고 직관적으로 만들 수 있습니다.
확장 메서드를 만들려면 정적 클래스에 정적 메서드를 정의하고, 첫 번째 매개 변수 앞에 this 키워드를 추가합니다.
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}이제 어떤 문자열에서도 이 method를 직접 호출할 수 있습니다:
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3this string str 매개 변수는 이 메서드가 string 형식을 확장한다는 것을 컴파일러에 알려 줍니다. sentence.WordCount()를 호출하면 컴파일러는 내부적으로 이를 StringExtensions.WordCount(sentence)로 변환합니다.
확장 메서드는 추가 매개 변수도 받을 수 있습니다:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
// 사용법
bool result = "Hello".IsLongerThan(3); // true이 기법은 LINQ에서 광범위하게 사용되며, Where()와 Select() 같은 methods는 IEnumerable의 extension methods입니다. Extension methods는 사용자가 제어하지 않는 형식에 유틸리티 함수를 추가할 때 강력하며, 코드를 깔끔하고 표현력 있게 유지해 줍니다.
챌린지
쉬움정수에 편리한 기능을 추가하여 기본 제공 기능처럼 사용할 수 있는 유용한 extension methods 집합을 만들어 보겠습니다. 어떤 정수에서든 직접 호출할 수 있는 extension methods를 포함하는 static class를 만들어 코드를 더 표현력 있고 읽기 쉽게 작성합니다.
코드를 두 파일에 나누어 구성합니다.
IntExtensions.cs:Utilitiesnamespace에IntExtensions라는 static class를 만듭니다. 이 class에는int형식을 확장하는 extension methods가 포함됩니다.IsEven()- number가 even이면true, otherwisefalse를 ReturnsSquare()- number에 itself를 multiplied한 값을 ReturnsIsInRange(int min, int max)- number가 min과 max 사이(inclusive)이면true, otherwisefalse를 Returns
thiskeyword를 사용해야 한다는 점을 Remember하세요.Program.cs: main 파일에서 입력으로부터 정수를 Read하고 세 extension methods를 모두 시연합니다. 각 method를 기본 제공 method인 것처럼 정수에서 직접 Call한 다음 results를 Print합니다.
세 개의 inputs를 받습니다.
- 테스트할 number (정수)
- range 확인을 위한 최소값 (정수)
- range 확인을 위한 최대값 (정수)
다음 format으로 출력을 Print하세요.
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}예를 들어 inputs가 7, 5, 10이면 출력은 다음과 같아야 합니다.
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? Truenumber.IsEven()과 number.Square()를 얼마나 자연스럽게 작성할 수 있는지 확인해 보세요. extension methods가 마치 처음부터 integer type의 일부였던 것처럼 느껴집니다!
직접 해보기
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// 입력 읽기
int number = Convert.ToInt32(Console.ReadLine());
int min = Convert.ToInt32(Console.ReadLine());
int max = Convert.ToInt32(Console.ReadLine());
// TODO: 'number'에 확장 메서드를 사용하고 결과를 출력하세요
// number.IsEven(), number.Square(), number.IsInRange(min, max)를 호출하세요
// 다음 형식으로 출력하세요:
// {number}가 짝수인가요? {True/False}
// {number}의 제곱: {result}
// {number}가 [{min}-{max}] 범위에 있나요? {True/False}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C# 컴파일러