Game Development, 게임개발/개발

Extension Method, 확장 메서드 [Unity]

게임이 더 좋아 2021. 3. 29. 05:56
반응형
728x170

역시나 해석 그대로다.

메서드 확장하는 것이다.

알아보자

 


정의부터 하자면

 

기존 내장 되어있는 소스들을 수정 안해도

사용자 정의 메서드를 추가할 수 있는 것이다.

 

** 이것이 목적이라고 보는 게 맞겠다.

ex) Transform 같은 경우 내장되어 있어서 일반적으로 접근이 불가능하다.

 

 

Generic이 아니면서 static 클래스에서만 정의되며 static 메서드로 정의한다.

-> 그냥 static 메서드로 인식 되지 않고 확장 메서드로 인식되는 이유는

this 키워드로 "첫번째" parameter를 받기 때문이다.

 

**만약 매개변수가 더 필요하면 그 때는 this를 붙이지 않고 입력해야 한다.

 

**여기서 this는 2가지 역할을 한다.

1. 어느 클래스의 확장 메서드가 될지 결정한다.

2. 해당되는 클래스의 객체를 불러온다.

(그래서 실제 사용에선 객체를 자동으로 불러오기에 매개변수를 안 쓴다.)

-> 밑에 예시를 보면 확장메서드에 파라미터를 필요로 하지 않는다. 

 

 

 

++확장 메서드는 우리가 일반적으로 클래스에서 정의해서 쓰는 인스턴스 메서드와 똑같이 사용한다.

 

**다만 기존에 정의된 메서드와 같은 확장 메서드가 있을 경우 주의해야한다.

-> 근데 대부분 안 겹친다.

 

 

 

예를 들어서 보자

 

ExtensionMethods

using UnityEngine;
using System.Collections;

//확장 메서드는 static 클래스에서 정의되어야 한다.
public static class ExtensionMethods
{
    //또한 확장메서드도 static으로 선언되어야 한다.
    //그리고 첫번째 매개변수는 this 키워드가 사용되어야 한다.
    //여기 밑에 Transform이 사용된 것처럼 
    //첫 번째 매개변수의 의미는 어떤 클래스의 확장메서드가 될 것이냐이다.
    //여기서는 Transform 클래스가 되겠다.
    
    public static void ResetTransformation(this Transform trans)
    {
    	//Transform을 매개변수로 받기 때문에 아래 변수들이 사용가능해진다.
        trans.position = Vector3.zero;
        trans.localRotation = Quaternion.identity;
        trans.localScale = new Vector3(1, 1, 1);
    }
}

 

 

SomeClass

using UnityEngine;
using System.Collections;

public class SomeClass : MonoBehaviour 
{
    void Start () {
        //확장메서드를 사용하려면 그저 우리는 무슨 클래스의 확장메서드인지만 기억하면 된다.
        //여기선 Transform이었다.
        //그래서 아래와 같이 확장메서드를 사용할 수 있다.
        transform.ResetTransformation();
    }
}

 

 

 


참고링크

learn.unity.com/tutorial/extension-methods

반응형
그리드형