유니티 C#에서 함수의 인자가 너무 많을 때

 

프로그래밍을 하다보면 꽤 많은 인자를 넘겨줘야 하는 경우가 생긴다.

 

다음의 예를 보자. 인자로 GameObject형을 4개를 받고있다. 

using UnityEngine;

public class TestClass : MonoBehaviour
{
    void Start()
    {
        var cat = new GameObject();
        var dog = new GameObject();

        Animal(cat, dog, null, null); // 함수의 인자를 모두 쓰지않으면 오류가 난다.
    }
    
    public void Animal(GameObject obj1, GameObject obj2, GameObject obj3, GameObject obj4)
    {
        
    }
}

 

하지만 인자가 null일 경우엔 예외처리를 해놔서, 앞의 두개만 넘겨주고 싶은 경우가 있다.

단순하게 생각하면 오버로딩을 통해 아래와 같이 구현할 수 있겠다.

    public void Animal(GameObject obj1, GameObject obj2) // 인자를 두개만 받는다.
    {
        Animal(obj1, obj2, null, null); // 자동으로 null 값을 채워준다.
    }

    public void Animal(GameObject obj1, GameObject obj2, GameObject obj3, GameObject obj4)
    {
        
    }

 

하지만 인자를 한개만 넘겨줄 경우, 세개를 넘겨줄경우를 전부 오버로딩으로 구현하기에는 쓸데없는 코드가 많아진다. 

함수의 인자를 선언하면서 초기화를 같이 해주면, 해당 값이 넘어오지 않는 경우에는 초기화 한 값으로 채워진다!

using UnityEngine;

public class TestClass : MonoBehaviour
{
    void Start()
    {
        var cat = new GameObject();
        var dog = new GameObject();

        Animal(cat, dog); // 함수의 인자를 두개만 써도 쓰지않으면 오류가 나지 않는다.
    }
    
    // 인자가 초기화를 겸한다.
    public void Animal(GameObject obj1 = null, GameObject obj2 = null, GameObject obj3 = null, GameObject obj4 = null)
    {
        
    }
}

 

 

하지만 여기서도 문제는 발생한다.

순서대로라면 가능하지만, 만약 마지막 자리 수만 넣어주고 싶은 경우에는 앞 세 인자를 null로 써줄 수 밖에없다.

함수를 호출 할 때 특정 이름을 지정해서 인자로 값을 넘겨줄수 있다!

using UnityEngine;

public class TestClass : MonoBehaviour
{
    void Start()
    {
        var cat = new GameObject();
        var dog = new GameObject();

        Animal(cat, obj4: dog); // 첫번째 인자와, 이름지정된 인자를 한개 넘겨준다.
    }
    
    // 인자가 초기화를 겸한다.
    public void Animal(GameObject obj1 = null, GameObject obj2 = null, GameObject obj3 = null, GameObject obj4 = null)
    {
        if (obj1 == null)
            Debug.Log("obj1 is null");
        else
            Debug.Log("obj1 isn't null");

        if (obj2 == null)
            Debug.Log("obj2 is null");
        else
            Debug.Log("obj2 isn't null");

        if (obj3 == null)
            Debug.Log("obj3 is null");
        else
            Debug.Log("obj3 isn't null");

        if (obj4 == null)
            Debug.Log("obj4 is null");
        else
            Debug.Log("obj4 isn't null");
    }
}

 

 

[ 출력값 ]

 

 

댓글

Designed by JB FACTORY