Menu
Coddy logo textTech

확장 메서드

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();  // 3

this 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는 사용자가 제어하지 않는 형식에 유틸리티 함수를 추가할 때 강력하며, 코드를 깔끔하고 표현력 있게 유지해 줍니다.

challenge icon

챌린지

쉬움

정수에 편리한 기능을 추가하여 기본 제공 기능처럼 사용할 수 있는 유용한 extension methods 집합을 만들어 보겠습니다. 어떤 정수에서든 직접 호출할 수 있는 extension methods를 포함하는 static class를 만들어 코드를 더 표현력 있고 읽기 쉽게 작성합니다.

코드를 두 파일에 나누어 구성합니다.

  • IntExtensions.cs: Utilities namespace에 IntExtensions라는 static class를 만듭니다. 이 class에는 int 형식을 확장하는 extension methods가 포함됩니다.
    • IsEven() - number가 even이면 true, otherwise false를 Returns
    • Square() - number에 itself를 multiplied한 값을 Returns
    • IsInRange(int min, int max) - number가 min과 max 사이(inclusive)이면 true, otherwise false를 Returns
    extension methods는 static class 안의 static methods여야 하며, 확장할 형식을 지정하려면 first parameter에 this keyword를 사용해야 한다는 점을 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]? True

number.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}

    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C# 컴파일러