CSharp 확장 메소드

양승준·2025년 4월 22일

CSharp

목록 보기
19/20
post-thumbnail

시작하며

확장 메소드는 기존에 있는 클래스를 컨드르지 않고, 기능을 추가할 수 있도록 하는 기능이다.


확장메소드

자주 쓰는 기능들은 확장 메소드로 구현하고 사용하여, 코드를 더 간결하게 해줄 수 있는 기능이다.

확장 메소드의 특징

  • static 클래스, static 메서드, 첫 매개변수에 this 키워드 정의해야된다.
  • 인스턴스 메서드처럼, 컴파일 시 정적 호출로 변환한다.
  • 네임스페이스 using을 통해 스코프(어느 코드 파일, 어느 블록에서) 제어
  • 원본 타입(클래스, 구조체, 인터페이스.. 등) 수정 없이 기능 추가 가능하다.
  • 실제 맴버가 아님(리플렉션 불가하다), private로 선언하면 접근 불가능하다.

예시 코드

public static class StringExtensions
{
    public static bool IsNullOrEmpty(this string s)
        => string.IsNullOrEmpty(s);
}

위와 같은 식으로 확장 메서드를 정의를 진행한다.

  • 해당 메서드는 받은 문자열이 비어있거나 Null인지를 확인하는 메서드이다.
string str = null;
str.IsNullOrEmpty();

위와 같이 사용했을 시, 코드 상에서는 위와 같이 사용한다.

StringExtensions.IsNullOrEmpty(str);

해당 코드가 컴파일 타임(소스 코드를 컴파일러가 분석 변환해서 중간 언어(IL) 또는 네이티브 코드로 만들어 내는 시점) 시점에는 아래와 같이 정적 메서드 호출로 변환 됩니다.

  • 런타임(프로그램 실행 중) 성능 오버헤드(사용하기 위한 추가 비용)는 전혀 없고, 일반 static 메서드 호출과 동일하다.

사용 예시 코드

배열 혹은 리스트를 무작위 섞기

구현 코드

public static class CollectionExtensions
{
    private static Random _rand = new Random();
    public static void Shuffle<T>(this IList<T> list)
    {
        int n = list.Count;
        while (n > 1)
        {
            int k = _rand.Next(n--);
            // temp 만들어서 바꾸는 코드와 동일한 행동을 진행한다.
            // 튜플이라는 것임
            // 값 형식 튜플일 경우 힙에 생성 안되고 스택이나 레지스터에 보관된다고 함.
            (list[n], list[k]) = (list[k], list[n]);   
        }
    }
}

사용 코드

var deck = new List<Card> {};
deck.Shuffle();    // 덱을 무작위로 섞는다



게임 오브젝트에 컴포넌트 없으면 추가하기

구현 코드

public static class GameObjectExtensions
{
    public static T GetOrAddComponent<T>(this GameObject go) where T : Component
    {
        var comp = go.GetComponent<T>();
        return comp != null ? comp : go.AddComponent<T>();
    }
}

사용 코드

var player = GameObject.Find("Player");
var rb = player.GetOrAddComponent<Rigidbody>();

주요 활용 사례

  1. 유틸리티 메서드 모음
    • string, DataTime, Enum 등 전역적으로 자주 쓰이는 함수 들을 정의
    • 본인도 프로젝트를 진행하면서 많이 사용하는 것들을 유틸로 빼서 사용하곤한다.
  2. Fluent API
    • builder.AddX().ConfigureY().Build(); 와 같은 체이닝 지원
  3. LINQ 연장
    • IEnumerable<T>에 새로운 연산자(예: Batch, ForEach) 추가
  4. 인터페이스 확장
    • 인터페이스에도 확장 메서드를 정의하면, 구현체 전부에 새 기능 추가 가능

profile
지모창말, 미모창.

0개의 댓글