Unity 개발 일지/코딩 공부

확장 메서드(Extension Method)

ohty20012 2025. 6. 2. 21:28

프로그램을 개발하다 보면 외부 라이브러리나 프레임워크에서 제공하는 다양한 클래스와 구조체를 자주 활용하게 된다. 이때, 기존의 클래스나 구조체에 기능을 추가하고 싶지만, 직접 상속하거나 원본 코드를 수정할 수 없는 경우가 많다.

 

이럴 때 유용하게 사용할 수 있는 기능이 바로 확장메서드다.

 

확장 메서드는 static 클래스 내부에 정의되며, static 메서드로 작성된다. 첫 번째 매개변수 앞에 this 키워드를 붙여 확장할 대상 타입을 지정함으로써, 마치 해당 타입의 인스턴스 메서드처럼 호출할 수 있게 해준다.

 

 


 

 

1. 확장 메서드의 특징

  • 기존 타입의 소스를 변경하지 않아도 메서드를 추가할 수 있다.
  • 컴파일 시에는 일반 static 메서드로 처리된다.
  • Unity나 외부 라이브러리의 클래스를 커스터마이징할 때 매우 유용하다.

 

2. 선언 방법

1) 클래스와 메서드를 static으로 정의한다.

 

2) 반환형, 메서드명, 매개변수를 정의한다.

  • 매개변수 앞에는 반드시 this가 들어가야한다.
  • 매개변수에는 여러가지 자료형을 사용할 수 있다.
  • 여러가지 자료형을 사용할 때는 첫 번째 매개변수에만 this를 사용하면 된다.
  • ex) public static float Sum(this int a, float b) {}

3) 내부에 기능을 작성한다.

 

 

2. 사용 방법

1) 매개변수가 하나일 때

 

2) 매개변수가 두 개 이상일 때

 

 

< 어떤 상황에서 상속 대신 확장 메서드를 사용하는게 유리할까? >

  1. 기존 클래스를 수정하거나 상속할 수 없을 때
    • 외부 라이브러리, Unity의 내장 클래스 등
    • ex) string, int, Transform, GameObject, etc
  2. 기능만 추가하고 싶고, 상태(State)나 필드가 필요 없는 경우
  3. 다형성이 필요 없는 경우
  4. 여러 클래스에 동일한 기능을 공통적으로 추가하고 싶을 때
    • 확장 메서드는 인터페이스, 클래스 구분 없이 다수의 타입에 동일한 기능을 제공할 수 있다.

 

< Unity 프로젝트에서 자주 활용할 수 있는 확장 메서드 아이디어는 뭐가 있을까? >

1. Transform 초기화

public static void ResetTransform(this Transform t)
{
    t.localPosition = Vector3.zero;
    t.localRotation = Quaternion.identity;
    t.localScale = Vector3.one;
}
  • Transform은 Unity 내장 클래스이므로 수정이 불가능하다
  • 반복되는 초기화 코드를 간결하게 줄일 수 있다.

2. GameObject 레이어 일괄 설정

public static void SetLayerRecursively(this GameObject go, int layer)
{
    go.layer = layer;
    foreach (Transform child in go.transform)
    {
        child.gameObject.SetLayerRecursively(layer);
    }
}
  • GameObject 또한 Unity 내장 클래스이므로 수정이 불가
  • 하위 오브젝트까지 포함해 레이어를 일괄 설정 할 때 매우 유용하다.
  • Collider, Physics, Color 등등 Unity 내장 클래스들도 활용하면 좋음

3. List/Array

public static void Shuffle<T>(this IList<T> list)
{
    int n = list.Count;
    for (int i = n - 1; i > 0; i--)
    {
        int j = UnityEngine.Random.Range(0, i + 1);
        (list[i], list[j]) = (list[j], list[i]);
    }
}

 

  • 주어진 리스트(카드, 아이템배치 등)를 섞는 기능

 

 


 

확장 메서드는 간결하고 직관적인 코드 작성을 가능하게 해주는 도구다.

특히 Unity 개발처럼 외부에서 제공된 클래스를 기반으로 작업할 때, 상속이나 원본 수정 없이 기능을 유연하게 확장할 수 있는 효과적인 방법이다.

다만, 남용하게 되면 코드의 책임 범위가 흐려지고 유지보수가 어려워질 수 있으므로, 기능적 유틸리티 로직에 한정해 사용하는 것이 바람직하다.

 

 

 

< Microsoft 공식 문서 >

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

 

확장 멤버 - C#

C#의 확장 멤버를 사용하면 새 파생 형식을 만들거나, 다시 컴파일하거나, 원래 형식을 수정하지 않고도 기존 형식에 메서드, 속성 또는 연산자를 추가할 수 있습니다.

learn.microsoft.com

'Unity 개발 일지 > 코딩 공부' 카테고리의 다른 글

델리게이트(delegate)  (0) 2025.04.30
new 키워드  (1) 2025.04.18
열거형 (Enum)  (0) 2025.04.15
부동 소수점 (Floating Point)의 오류(Error)와 흔들림(Jitter)  (0) 2025.04.09