[C#] 제너릭(Generics)과 out, ref

장민제·2025년 4월 15일

C# Study

목록 보기
8/11
post-thumbnail

✅ 제네릭 (Generics) ?

  • 데이터 형식을 일반화하여, 형식에 의존하지 않는 코드를 작성할 수 있도록 해주는 기능
  • 컬렉션(List< T >, Dictionary<TKey, TValue> 등)이나 클래스, 메서드 등에 자주 사용된다.

장점

  • 형변환 없이 다양한 타입 처리 가능
  • 타입 안정성 보장 (컴파일 시 타입 체크)
  • 코드 재사용성 향상

제네릭을 사용한 Unity 싱글톤 예제

using UnityEngine;

// T는 MonoBehaviour를 상속한 클래스만 사용가능
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;
    
    // null이면 해당 타입을 가진 오브젝트를 찾고, 없다면 새로 생성
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                // 해당 컴포넌트를 가지고 있는 게임 오브젝트 반환
                instance = (T)FindAnyObjectByType(typeof(T));

                if (instance == null)
                {
                    // 새로운 게임 오브젝트 생성 및 컴포넌트 추가
                    GameObject obj = new GameObject(typeof(T).Name, typeof(T));
                    // 새로운 오브젝트의 컴포넌트 인스턴스에 지정
                    instance = obj.GetComponent<T>();
                }
            }

            return instance;
        }
    }

    private void Awake()
    {
        // 인스턴스가 없을 때 해당 오브젝트로 설정
        if (instance == null)
        {
            instance = this as T;
            DontDestroyOnLoad(this.gameObject);
        }

        // 인스턴스가 존재한다면 현재 오브젝트 파괴
        else if (instance != null)
            Destroy(gameObject);
    }
}

사용 예시

public class GameManager : Singleton<GameManager>
{
    public int score;

    public void AddScore(int value)
    {
        score += value;
    }
}

// 다른 클래스에서
GameManager.Instance.AddScore(10); 

제네릭 기반 클래스를 통해 공통된 로직을 정의하여 다른 곳에서 코드를 복붙하지 않아도 된다.
-> 타입에 따라 달라지는 부분만 따로 구현
-> 공통적인 로직은 한 번만 정의하여 코드 중복 없이 재사용 가능


🔑 ref 키워드

  • 인자를 참조에 의해 전달
  • 메서드 안에서 변경한 값이 호출한 쪽에도 반영
public void AddTen(ref int number)
{
    number += 10;
}

int num = 5;
AddTen(ref num);
Console.WriteLine(num);

>>> 15

ref 매개변수는 메서드 호출 전 반드시 초기화되어 있어야한다.

🔑 out 키워드

  • ref와 비슷하지만, 메서드 내부에서 값을 반드시 할당해야한다.
  • 메서드가 여러 개의 값을 반환할 때 유용
public void GetValues(out int a, out int b)
{
    a = 10;
    b = 20;
}

int x, y;
GetValues(out x, out y);
Console.WriteLine($"{x}, {y}");

>>> 10, 20
키워드특징호출 전 초기화메서드 내 값 할당 필수용도
ref참조 전달필요선택기존 값을 수정하고 싶을 때
out출력 전용불필요필수메서드에서 여러 값을 반환할 때

out, ref 모두 메서드에서 매개변수를 전달할 때 사용하고 값의 반환이 아닌, 매개변수를 이용하여 값을 전달 할 수있다.

하지만, 너무 많이 사용하게 되면 가독성이 떨어진다.


profile
Unity, C#

0개의 댓글