푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 배우기
C# 배우기

다른 카테고리

C# 확장 메서드 사용 및 메서드 이해하기

Tim Corey
28분 27초

C# 프로그래밍에서 메서드는 재사용 가능한 코드를 캡슐화하고 특정 작업을 수행하는 필수적인 구성 요소입니다. 매개변수를 받을 수 있고, 값을 반환할 수 있으며, 다양한 입력을 처리하도록 오버로딩될 수 있습니다. 좀 더 고급 개념인 확장 메서드를 사용하면 개발자는 자신이 제어하지 않는 유형을 포함하여 기존 유형에 기능을 추가할 수 있습니다.

Tim Corey'C#에서 확장 메서드를 만드는 방법 ' 동영상은 훌륭한 자료입니다. 이 가이드에서는 팀이 다루는 여러 주제를 살펴보겠습니다.

  1. 메서드 정의 및 호출
  2. 메서드 매개변수 및 인수
  3. 메서드 반환 값
  4. 메서드 오버로딩
  5. 확장 메서드 구현

메서드 정의 및 호출

정의된 인스턴스 메서드

C#에서 메서드는 클래스 내부에 정의됩니다. 메서드 정의의 일반적인 구문에는 접근 제어자, 반환 형식, 메서드 이름 및 매개변수가 포함됩니다.

public class SampleClass
{
    public void SampleMethod()
    {
        // Method implementation  
    }
}
public class SampleClass
{
    public void SampleMethod()
    {
        // Method implementation  
    }
}

팀 코리의 예시(4:05)에서 그는 확장 메서드를 만들기 위해 정적 클래스 내에 메서드를 정의합니다. 정의된 메서드는 PrintToConsole이다. 정의에는 메서드를 정의하는 방법을 실제 예제와 함께 명확하게 설명하는 모든 일반적인 구문이 포함되어 있습니다.

public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}
public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}

메서드 호출

'메서드 호출'은 프로그램에게 코드의 다른 곳에 정의된 특정 메서드를 실행하여 미리 정의된 작업을 수행하도록 지시하는 것입니다. 메서드는 클래스 인스턴스를 사용하여 호출하거나, 정적 메서드인 경우 직접 호출할 수 있습니다. 확장 메서드는 마치 확장 대상 형식의 일부인 것처럼 보입니다. 영상 6분 18초에서 Tim은 미리 정의된 메서드처럼 기본 데이터 형식을 사용하여 확장 메서드를 호출하는 방법을 보여줍니다.

string demo = "This is a demo";
demo.PrintToConsole(); // Extension method call
string demo = "This is a demo";
demo.PrintToConsole(); // Extension method call

메서드 매개변수 및 인수

매개변수

매개변수는 메서드 정의에 지정되며 메서드에 전달되는 값의 자리 표시자 역할을 합니다. 여기서 WriteLine 메서드가 호출된 후, message가 매개변수인 것을 볼 수 있습니다.

public void DisplayMessage(string message)
{
    Console.WriteLine(message);
}
public void DisplayMessage(string message)
{
    Console.WriteLine(message);
}

다시, Tim Corey가 4:05에 준 확장 메서드 예제에서 message는 매개변수입니다:

public static void PrintToConsole(this string message)
{
    Console.WriteLine(message);
}
public static void PrintToConsole(this string message)
{
    Console.WriteLine(message);
}

논거

인수는 메서드가 호출될 때 메서드에 전달되는 실제 값입니다.

DisplayMessage("Hello, World!"); // "Hello, World!" is the argument
DisplayMessage("Hello, World!"); // "Hello, World!" is the argument

Tim Corey가 6:20에 문자열 유형과 함께 점 문법을 사용하여 메서드를 호출할 때, 문자열 값은 실제로 PrintToConsole 메서드에 값으로 전달됩니다:

string demo = "This is a demo";
demo.PrintToConsole(); // "This is a demo" is the argument
string demo = "This is a demo";
demo.PrintToConsole(); // "This is a demo" is the argument

메서드 반환 값

메서드는 return 문을 사용하여 값을 반환할 수 있습니다. 반환 타입은 메서드 시그니처에 명시되어 있습니다.

public int Add(int a, int b)
{
    return a + b;
}
public int Add(int a, int b)
{
    return a + b;
}

팀 코리의 영상에 나오는 확장 메서드는 값을 반환하지 않지만(void 반환 타입), 값을 반환하는 확장 메서드를 만들 수도 있습니다. Tim의 예제에서 반환 형식은 void입니다. 즉, 해당 메서드는 아무 값도 반환하지 않습니다. 다음 예시는 값을 반환하는 방법을 보여줍니다.

public static int WordCount(this string str)
{
    return str.Split(' ').Length;
}
public static int WordCount(this string str)
{
    return str.Split(' ').Length;
}

메서드 오버로딩 (11:15)

메서드 오버로딩을 사용하면 여러 메서드가 동일한 이름을 갖지만 매개변수는 서로 다르게 지정할 수 있습니다. 이는 유연하고 직관적인 API를 만드는 데 유용할 수 있습니다.

public void Display(string message)
{
    Console.WriteLine(message);
}

public void Display(int number)
{
    Console.WriteLine(number);
}
public void Display(string message)
{
    Console.WriteLine(message);
}

public void Display(int number)
{
    Console.WriteLine(number);
}

팀 코리는 11분 24초에 다양한 로깅 시나리오에 맞춰 여러 메서드를 만드는 것에 대해 간략하게 언급하는데, 이는 더 넓은 의미에서 메서드 오버로딩의 한 예로 볼 수 있습니다. 로그 메서드는 매개변수가 하나인 메서드와 매개변수가 두 개인 메서드, 이렇게 두 가지로 존재합니다. 11시 39분에 나오는 두 번째 로그 메서드는 로그 메서드의 오버로드된 버전으로, 동일한 이름으로 여러 기능을 제공합니다.

Implementing Extension Methods in C

확장 방법이란 무엇인가요? (3:13)

확장 메서드를 사용하면 기존 형식을 수정하거나 다시 컴파일할 필요 없이 새 메서드를 추가할 수 있습니다. 확장 메서드는 인스턴스 메서드처럼 불리지만, 정적 메서드로 정의됩니다.

확장 메서드 생성

이전 섹션인 '메서드 정의 및 호출'에서 Tim Corey가 별도의 정적 클래스에 확장 메서드를 만들고 그 안에 정적 메서드를 정의하여 확장 메서드로 사용하는 방법을 살펴보았습니다. 팀 코리가 강조하는 몇 가지 핵심 사항은 다음과 같습니다.

  1. 반드시 별도의 public static 클래스를 정의하거나, Tim이 말했듯이 "클래스를 static으로 표시해야 합니다. 그렇지 않으면 작동하지 않습니다."
  2. 확장 메서드를 더 많이 만들 때는 유형별로 그룹화하세요(3:43).
  3. 첫 번째 매개변수가 this 키워드로 접두사로 지정된 정적 메서드를 정의하여 확장할 유형을 지정합니다 (4:58)
public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}
public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}

확장 메서드 호출(6:18)

다음으로 Tim은 이 문자열 변수에 대해 확장 메서드를 호출하는 방법을 보여줍니다.

demo.PrintToConsole();
demo.PrintToConsole();

당신이 demo를 입력하고 Print을 타이핑하기 시작하면, IntelliSense는 PrintToConsole 메서드를 제안합니다. 이것은 string 유형에 추가된 새로운 메서드입니다.

메서드 호출 작동 방식 (6:30)

Tim이 demo.PrintToConsole()를 호출할 수 있는 이유를 설명합니다:

  • 데모는 문자열 유형: 변수 demostring 유형입니다.
  • 확장된 문자열 유형: string 유형은 새로운 메서드 PrintToConsole으로 확장되었습니다.

매개변수 이해하기 (6:41)

매개변수가 PrintToConsole 메서드로 전달되지 않는 것처럼 보일지라도, Tim은 암시적 매개변수 전달을 지적합니다 - 문자열 demo는 확장 메서드의 첫 번째 매개변수로 전달됩니다.

Tim은 확장 메서드의 호출 시 매개변수가 정의 시보다 하나 적다는 점을 강조합니다. 이는 첫 번째 매개변수(확장될 유형)가 암시적으로 지정되기 때문입니다.

확장 메서드 시그니처

여기서, this string message는 메서드가 string 유형을 확장하는 것을 의미하며, message는 암시적 매개변수입니다:

public static void PrintToConsole(this string message)
public static void PrintToConsole(this string message)

코드 실행 (7:08)

마지막으로, 메서드 PrintToConsole가 호출되면, 그것은 문자열을 콘솔에 출력합니다:

Console.WriteLine(message);
Console.WriteLine(message);

따라서, demo.PrintToConsole()을 호출하면 콘솔에 "This is a demo"가 출력됩니다.

타사 클래스에 대한 확장 메서드 사용

타사 클래스 확장 (10:59)

팀 코리는 확장 메서드가 직접 수정할 수 없는 타사 클래스를 포함하여 모든 유형을 확장할 수 있다고 설명합니다. 예를 들어, 11:09에 SimpleLogger 클래스를 살펴보겠습니다.

여기서 Tim은 (11:09) 메시지를 콘솔에 기록하는 가상의 서드 파티 클래스 SimpleLogger을 사용합니다. 해당 클래스에는 두 가지 메서드가 있습니다.

public class SimpleLogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }

    public void Log(string message, string messageType)
    {
        Console.WriteLine($"{messageType}: {message}");
    }
}
public class SimpleLogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }

    public void Log(string message, string messageType)
    {
        Console.WriteLine($"{messageType}: {message}");
    }
}

이러한 방법은 메시지 유형이 단순 문자열이므로 일관성이 떨어질 수 있어 이상적이지 않습니다. 팀은 클래스 개선을 위해 확장 메서드를 만들 것을 제안합니다.

일관된 메시지 유형 구현

확장 메서드를 사용하면 항상 동일한 메시지 유형과 형식을 사용하므로 코드의 일관성을 유지할 수 있습니다. (12:40) 여기서 Tim은 정적 클래스 ExtendSimpleLogger을 생성합니다:

public static class ExtendSimpleLogger
{
    public static void LogError(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Error");
    }

    public static void LogWarning(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Warning");
    }
}
public static class ExtendSimpleLogger
{
    public static void LogError(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Error");
    }

    public static void LogWarning(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Warning");
    }
}

통화 품질 향상

그것을 손에 들고, (14:02) 그는 이제 SimpleLogger 인스턴스에서 확장 메서드를 호출할 수 있습니다:

SimpleLogger logger = new SimpleLogger();
logger.LogError("This is an error");
logger.LogWarning("This is a warning");
SimpleLogger logger = new SimpleLogger();
logger.LogError("This is an error");
logger.LogWarning("This is a warning");

이렇게 하면 메시지 유형이 항상 '오류'와 '경고'로 유지됩니다.

출력 형식 개선 (14:35)

Tim은 오류 메시지가 눈에 잘 띄도록 콘솔 텍스트 색상을 설정하는 기능을 추가했습니다.

public static void LogError(this SimpleLogger logger, string message)
{
    var defaultColor = Console.ForegroundColor;
    Console.ForegroundColor = ConsoleColor.Red;
    logger.Log(message, "Error");

    Console.ForegroundColor = defaultColor;
}
public static void LogError(this SimpleLogger logger, string message)
{
    var defaultColor = Console.ForegroundColor;
    Console.ForegroundColor = ConsoleColor.Red;
    logger.Log(message, "Error");

    Console.ForegroundColor = defaultColor;
}

직접 메서드 호출과의 비교 (17:21)

Tim은 이 접근 방식을 원래의 Log 메서드를 직접 호출하는 것과 비교하며, 이는 불일치를 초래할 수 있습니다:

logger.Log("Test error", "Error");
logger.Log("Another error", "ERROR");
logger.Log("Test error", "Error");
logger.Log("Another error", "ERROR");

이 접근 방식은 오타와 일관성 없는 서식이 발생하기 쉽습니다.

체이닝 확장 방법 (18:13)

Tim은 확장 메서드를 연결하여 코드를 더 읽기 쉽게 만드는 방법을 보여줍니다.

public static void LogInfo(this SimpleLogger logger, string message)
{
    logger.Log(message, "Info");
}

public static void SaveToDatabase(this SimpleLogger logger)
{
    // Simulate saving to a database
}
public static void LogInfo(this SimpleLogger logger, string message)
{
    logger.Log(message, "Info");
}

public static void SaveToDatabase(this SimpleLogger logger)
{
    // Simulate saving to a database
}

이제 이러한 메서드들을 연결하여 사용할 수 있습니다.

logger.LogInfo("Information").SaveToDatabase();
logger.LogInfo("Information").SaveToDatabase();

이렇게 하면 중첩된 메서드 호출에 비해 코드가 더 읽기 쉽고 직관적입니다.

SaveToDatabase(LogInfo(logger, "Information"));
SaveToDatabase(LogInfo(logger, "Information"));

점 표기법과 체이닝을 사용하면 코드의 의도가 더 명확해지고 중첩이 줄어듭니다.

소유하지 않은 물건의 확장

20시 13분에 Tim Corey는 확장 메서드가 타사 라이브러리와 같이 자신이 소유하지 않은 클래스에 기능을 추가하는 데 이상적이라고 설명합니다. 이를 통해 원본 코드를 수정하지 않고도 기능을 향상시킬 수 있습니다.

의존성 회피

코리는 또한 클래스에 직접적으로 결합하지 않고도 의존성을 도입하기 위해 확장 메서드를 사용하는 방법을 강조합니다. 예를 들어, 데이터베이스 논리를 삽입하지 않고 Person 클래스에 데이터베이스 저장 기능을 추가하는 것입니다.

인터페이스 확장

21분 30초부터 설명했듯이 확장 메서드는 인터페이스에도 적용될 수 있으며, 이를 통해 인터페이스를 구현하는 여러 클래스가 동일한 기능을 공유할 수 있습니다. 이는 코드 재사용과 간소화를 촉진합니다.

확장 메서드를 사용하지 말아야 할 경우

23시 03분에 Tim Corey는 특히 기본 데이터 유형이나 Microsoft에서 제공하는 데이터 유형에 대해 확장 메서드를 과도하게 사용하지 말 것을 권고하며, 이는 코드의 복잡성과 혼란을 방지하기 위함입니다. 불필요한 기능은 최소한으로 사용하고, 명확한 이점이 있을 때만 사용하십시오.

개방/폐쇄 원칙

24분 54초부터 25분 40초 사이의 구간에서 Tim은 확장 메서드를 사용하여 기존의 안정적인 코드를 수정하지 않고 새로운 기능을 추가함으로써 개방/폐쇄 원칙을 준수하는 것이 중요하며, 이를 통해 버그 발생 위험을 줄일 수 있다고 강조합니다.

문장 사용을 위한 모범 사례

확장 메서드를 논리적으로 그룹화하고 별도의 네임스페이스에 배치하여 이름 충돌을 방지하고 유지 관리 및 디버깅을 용이하게 하세요.

결론

자, 이제 여러분은 메서드를 정의하고 호출하는 방법, 매개변수와 반환 값을 처리하는 방법, 그리고 메서드 오버로딩을 활용하는 방법에 대한 기본 사항을 이해하게 되었습니다. 이를 통해 C#으로 견고하고 유연한 애플리케이션을 구축할 수 있습니다.

Tim Corey가 설명했듯이 확장 메서드는 기존 유형을 향상시키고 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만드는 강력한 방법입니다. 더 자세한 내용과 실제 예제를 보려면 Tim Corey의 C#에서 확장 메서드를 만드는 방법 에 대한 전체 비디오를 시청하세요.

Hero Worlddot related to C# 확장 메서드 사용 및 메서드 이해하기
Hero Affiliate related to C# 확장 메서드 사용 및 메서드 이해하기

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해