확장 메서드
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 39번째.
확장 메서드를 사용하면 소스 코드를 수정하거나 파생 클래스를 생성하지 않고도 기존 타입에 새로운 메서드를 추가할 수 있습니다. 확장 메서드는 해당 타입의 기본 메서드인 것처럼 나타나므로 코드를 더 읽기 쉽고 직관적으로 만들어 줍니다.
확장 메서드를 만들려면 정적 클래스 내에 정적 메서드를 정의하고, 첫 번째 매개변수 앞에 this 키워드를 붙입니다:
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}이제 모든 문자열에서 이 메서드를 직접 호출할 수 있습니다:
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이 기법은 Where() 및 Select()와 같은 메서드가 IEnumerable의 확장 메서드인 LINQ에서 광범위하게 사용됩니다. 확장 메서드는 직접 제어할 수 없는 형식에 유틸리티 함수를 추가하여 코드를 깔끔하고 표현력 있게 유지하는 데 매우 유용합니다.
챌린지
쉬움정수(integer)에 대해 내장된 기능처럼 편리하게 사용할 수 있는 유용한 확장 메서드 세트를 만들어 보겠습니다. 모든 정수에서 직접 호출할 수 있는 확장 메서드를 포함하는 정적 클래스를 생성하여 코드를 더 표현력 있고 읽기 쉽게 만들 것입니다.
코드는 다음 두 개의 파일로 구성됩니다:
IntExtensions.cs:Utilities네임스페이스 안에IntExtensions라는 정적 클래스를 생성합니다. 이 클래스는int타입을 향상시키는 다음과 같은 확장 메서드들을 포함합니다:IsEven()- 숫자가 짝수이면true를, 그렇지 않으면false를 반환합니다.Square()- 숫자를 자신과 곱한 값을 반환합니다.IsInRange(int min, int max)- 숫자가 min과 max 사이(포함)에 있으면true를, 그렇지 않으면false를 반환합니다.
this키워드를 사용하여 확장하려는 타입을 지정해야 함을 기억하세요.Program.cs: 메인 파일에서 입력으로부터 정수를 읽고 세 가지 확장 메서드를 모두 시연합니다. 각 메서드를 마치 내장 메서드인 것처럼 정수에서 직접 호출한 다음 결과를 출력하세요.
세 개의 입력을 받게 됩니다:
- 테스트할 숫자 (정수)
- 범위 확인을 위한 최소값 (정수)
- 범위 확인을 위한 최대값 (정수)
출력은 다음 형식을 따릅니다:
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}예를 들어, 입력이 7, 5, 10인 경우 출력은 다음과 같아야 합니다:
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? Truenumber.IsEven() 및 number.Square()와 같이 얼마나 자연스럽게 코드를 작성할 수 있는지 확인해 보세요. 확장 메서드는 마치 처음부터 정수 타입의 일부였던 것처럼 느껴질 것입니다!
치트 시트
확장 메서드를 사용하면 소스 코드를 수정하지 않고도 기존 형식에 새로운 메서드를 추가할 수 있습니다. 확장 메서드는 정적 클래스 내에서 정적 메서드로 정의되어야 하며, 첫 번째 매개변수 앞에 this 키워드가 있어야 합니다.
기본 확장 메서드 구문:
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}사용법:
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3첫 번째 매개변수 앞의 this 키워드는 어떤 형식이 확장되는지를 나타냅니다. 컴파일러는 sentence.WordCount()를 StringExtensions.WordCount(sentence)로 변환합니다.
추가 매개변수가 있는 확장 메서드:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
bool result = "Hello".IsLongerThan(3); // true직접 해보기
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)를 호출하세요
// 다음 형식으로 출력하세요:
// Is {number} even? {True/False}
// Square of {number}: {result}
// Is {number} in range [{min}-{max}]? {True/False}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.