[C#] 확장 메서드, 정적 클래스, static 정리

동키·2024년 12월 26일

C#

목록 보기
12/12

C#에서 확장 메서드, 정적 클래스, 그리고 static 키워드는 서로 연관된 개념이지만 각각 고유한 역할을 합니다. 아래에서 이들의 정의, 사용법, 차이점, 그리고 상호작용에 대해 정리하겠습니다.

확장 메서드 (Extension Method)

  • 확장 메서드는 기존 클래스나 구조체에 새로운 메서드를 추가하는 기능입니다.
  • 기존 클래스의 코드를 수정하지 않고도 해당 클래스의 인스턴스 메서드처럼 호출할 수 있습니다.
  • 반드시 정적 클래스에서 정의되어야 하며, 첫 번째 매개변수 앞에 this 키워드를 붙입니다.
using System;

namespace ExtensionMethodExample
{
    public static class StringExtensions // 정적 클래스
    {
        public static bool IsNullOrEmpty(this string value) // 확장 메서드
        {
            return string.IsNullOrEmpty(value);
        }
    }

    class Program
    {
        static void Main()
        {
            string text = null;

            // 확장 메서드 사용
            bool result = text.IsNullOrEmpty();
            Console.WriteLine($"IsNullOrEmpty: {result}"); // 출력: IsNullOrEmpty: True
        }
    }
}

확장 메서드의 특징

  • 기존 클래스 수정 불필요: 확장 메서드는 기존 클래스를 그대로 유지하며 새로운 기능을 추가합니다.
  • 첫 번째 매개변수에 this 사용: 확장할 클래스 또는 구조체의 인스턴스를 나타냅니다.
  • 정적 클래스에서 정의: 확장 메서드는 반드시 정적 클래스 내에서 작성해야 합니다.
  • 가독성 향상: 메서드를 직접 호출하는 것처럼 사용할 수 있어 코드가 더 간결해집니다.

확장 메서드에서 this의 역할

  • 확장 메서드의 첫 번째 매개변수 앞에 붙이는 this 키워드는 확장하려는 타입(예: string, int, 사용자 정의 클래스)을 지정합니다.
  • 확장 대상이 되는 인스턴스를 전달받아 메서드 내부에서 해당 인스턴스에 접근할 수 있습니다.
  • 위 예제에서 처럼 text.IsNullOrEmpty()와 같이 string 함수처럼 사용이 가능합니다.

정적 클래스 (Static Class)

  • 정적 클래스는 정적 멤버(정적 필드, 속성, 메서드)만 포함하는 클래스입니다.
  • 인스턴스를 생성할 수 없습니다.
  • 주로 유틸리티 클래스 또는 확장 메서드 정의에 사용됩니다.

정적 클래스의 특징

  1. 인스턴스 생성 불가:
    정적 클래스는 new 키워드를 사용해 객체를 생성할 수 없습니다.
public static class Utility
{
    public static void PrintMessage()
    {
        Console.WriteLine("Hello, Static Class!");
    }
}

// 호출 예제
Utility.PrintMessage(); // 인스턴스 생성 없이 사용
  1. 정적 멤버만 포함:
    모든 멤버는 static이어야 하며, 인스턴스 멤버를 포함할 수 없습니다.
  2. 프로그램 전체에서 공유 가능:
    정적 멤버는 모든 클래스와 공유되며, 전역적으로 사용할 유틸리티 함수에 적합합니다.

정적 클래스의 예제

유틸리티 함수

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

class Program
{
    static void Main()
    {
        int result = MathHelper.Add(3, 5); // 정적 클래스의 정적 메서드 호출
        Console.WriteLine(result); // 출력: 8
    }
}

확장 메서드 정의

public static class StringExtensions
{
    public static string ToUpperWithExclamation(this string value)
    {
        return value.ToUpper() + "!";
    }
}

// 호출
string message = "hello".ToUpperWithExclamation();
Console.WriteLine(message); // 출력: HELLO!

static 키워드

  • static 키워드는 클래스, 메서드, 속성, 필드 등에서 사용되며, 클래스 자체에 속하는 멤버를 정의합니다.
  • 정적 멤버는 인스턴스를 생성하지 않고 호출할 수 있습니다.

정적 멤버의 특징

  • 클래스에 속함:
    • 정적 멤버는 특정 객체가 아니라 클래스 자체에 속합니다.
  • 공유 멤버:
    • 정적 멤버는 모든 인스턴스에서 공유됩니다.
  • 인스턴스화 없이 호출 가능:
    • 정적 메서드와 속성은 객체를 생성하지 않고 클래스 이름을 통해 직접 호출합니다.
// 정적 필드 예제
public class Counter
{
    public static int Count = 0;

    public static void Increment()
    {
        Count++;
    }
}

class Program
{
    static void Main()
    {
        Counter.Increment();
        Console.WriteLine(Counter.Count); // 출력: 1
    }
}
profile
오키동키

0개의 댓글