C# Extensions Method

작성자

카테고리:

,

C# 3.0부터 추가된 기능이다. 이 기능을 사용하게 되면 기존 형식을 확장, 수정하지 않고도 메소드를 추가할 수 있다. Microsoft .NET 문서 에선 확장메서드를 호출하나 Extensions Method 나 차이가 없다고 서술하고 있다.

확장명 메서드를 호출하는 것과 형식에 실제로 정의된 메서드를 호출하는 데는 명백한 차이가 없습니다.

사용용도

이 기능은 어느 클래스에나 사용할 수 있기 때문에 특정한 범위에서 사용하는 것이 좋다. 일반적으로 봉인된(sealed) 클래스에 필요한 기능을 추가할 수 없을 때가 가장 적합한 사용용도 인 거 같다.

사용방법

사용방법은 생각보다 간단하다. String 클래스를 예로 들어보겠다.

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, 
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   
}

Extensions Method의 생성 조건이 몇 가지 있다.

  • 클래스는 static으로 선언해준다. ( 자동으로 함수도 static )
  • 매개변수의 첫 번째는 this와 해당 메소드가 들어갈 타입을 적어준다.

예제에 맞게 적고 string 변수를 확인해보면 WorldCount 라는 함수가 보일 것이다.

기타 설명

더 자세한건 Microsoft .NET 문서 를 참고하길 바란다.


Unity + Extensions Method

이 기능을 유니티에 가져와 적용해본다면 기존에 불필요하게 했던 작업을 함수 하나로 보기 좋게 정리할 수 있게 된다.

기존에 유니티 기능으로만 사용했을 때 불편한 작업이 있었다.

  • transform.position의 x값만 바꾸고 싶을 때
  • Sprite의 Color중 Alpha 값만 바꾸고 싶을 때
  • 배열에서 랜덤을 뽑고 싶을 때 ( 물론 이건 C#이지만..ㅋ )

등등 상황에 따라 더 있겠지만 저런 상황에 Extensions Method 기능을 사용하면 매우 편리하다.

첫 번째 경우를 가지고 설명하자면 Unity의 Transform 클래스에 Extensions Method를 추가하면 좀 더 코드가 깔끔해지고 보기 편해진다.

TransformExtensions.cs

using UnityEngine;

public static class TransformExtensions
{
    public static void SetPositionX(this Transform transform, float x)
    {
        var newPosition = new Vector3(x, transform.position.y, transform.position.z);
        transform.position = newPosition;
    }
}

Test.cs

using UnityEngine;

public class Test : MonoBehaviour
{
    private void Start()
    {
        // 이전의 X값 변경 방법
        transform.position = Vector3.zero;
        Debug.Log("[Basic] Prev: " + transform.position);
        transform.position = new Vector3(20, transform.position.y, transform.position.z);
        Debug.Log("[Basic] Curr: " + transform.position);

        // Extensions Method
        transform.position = Vector3.zero;
        Debug.Log("[Extensions] Prev: " + transform.position);
        transform.SetPositionX(20);
        Debug.Log("[Extensions] Curr: " + transform.position);
    }
}

마무리

Extensions Method는 클래스의 수정이 불가능한 부분들에 의한 반복적인 일들을 줄여줄 수 있는 좋은 기능인 것 같다. 유니티로 개발을 하면서 어쩔 수 없이 반복적이고 불필요한 코드들이 늘어난다면 이 기능을 이용해 리팩토링하는 것도 좋을 것 같다.