포스트

Extension Method

기존에 존재하는 클래스의 기능을 확장할 때는 상속을 이용한다. 하지만, 일부 특별한 조건에서는 상속이 좋지 못한 선택일 수 있다. 그럴 때 선택 가능한 것이 바로 확장 메서드(Extension Method)이다.

사용되는 경우

  1. 상속으로 기능 확장이 어려운 경우에 사용된다.
    • 상속하고자 하는 클래스의 정의에 sealed 가 사용된 경우.

      sealed 키워드 해당 클래스를 더 이상 상속할 수 없도록 만드는 데 사용되는 키워드 public sealed class ... { ... }

      image (23)

      sealed class인 string을 상속받고자 할 때 나타나는 메세지

  2. 상속으로 기능을 확장하면 코드 수정이 필요하다.
    • 이를 설명하는 예제

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      
        public class Player
        {
            public void Move()
            {
                Debug.Log("Player is moving");
            }
        }
              
        public class AdvancedPlayer : Player
        {
            public void Jump()
            {
                Debug.Log("Player is jumping");
            }
        }
              
        private void Start()
        {
            // 기본 메서드는 Player 클래스를 사용
            Player player = new Player();
            player.Move();
                  
            // 새로운 기능인 Jump를 사용하려면 AdvancedPlayer로 코드 변경이 필요
            AdvancedPlayer advancedPlayer = new AdvancedPlayer();
            advancedPlayer.Move();
            advancedPlayer.Jump();
        }
      

      AdvancedPlayer 클래스는 Player 클래스를 상속받고 Jump 함수가 추가적으로 구현한다.

      이렇게 추가적으로 구현된 기능을 사용하려면, 기존에 Player 클래스로 작성된 코드를 모두 AdvancedPlayer로 고쳐야 한다.

사용법

image (24)

static class 내의 static method로 정의한다. method의 첫 번째 매개변수가 중요하다.

this 확장할타입 식별자 와 같은 인자가 method의 signature에 포함되어 있어야 한다.

사용 예시 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Player
{
    public void Move()
    {
        Debug.Log("Player is moving");
    }
}

public static class AdvancedPlayer
{
    public static void Jump(this Player player)
    {
        Debug.Log("Player is jumping");
    }
}

public class ExtensionMethodTest : MonoBehaviour
{
    private void Start()
    {
        Player player = new Player();
        player.Move();
        player.Jump();
    }
}

Player 클래스에서 Move 함수만 정의하고, Jump 함수는 정의하지 않았다.

그러나 위처럼 확장 메서드를 활용하면 Player 인스턴스가 Jump 함수를 자신의 메서드처럼 Call 할 수 있다.

  • 하지만 실제로는 정적 메서드로 컴파일되는 것을 알아두자.
    • player.Jump();가 실제 내부적으로는 PlayerExtensions.Jump(player); 와 같이 컴파일된다.
    • 이렇게 확장 메서드는 단순히 매개변수로 클래스의 인스턴스를 전달하는 방식으로 동작하며, 클래스의 메서드를 변경하는 것이 아니다.

사용 예시 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static class TransformExtension
{
    // Transform의 위치, 회전, 스케일을 초기화하는 확장 메서드
    public static void ResetTransform(this Transform transform)
    {
        transform.position = Vector3.zero;
        transform.rotation = Quaternion.identity;
        transform.localScale = Vector3.one;
    }
}
public class ExtensionMethodTest : MonoBehaviour
{
    private void Start()
    {
        Transform myTransform = transform;
        
        // myTransform.position = Vector3.zero;
        // myTransform.rotation = Quaternion.identity;
        // myTransform.localScale = Vector3.one;
        
        myTransform.ResetTransform();
    }
}

위와 같이 유니티 엔진에서 제공하는 Transform의 편리한 활용을 돕는 확장 메서드를 정의할 수도 있다.

2024-10-06210544-ezgif com-video-to-gif-converter (1)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.