고급 객체지향 개념 및 활용방법

네,가능합니다 ㅣ 2024. 12. 9. 19:30

1. override와 overload

  • override: 부모 클래스에서 정의한 가상 함수를 자식 클래스에서 재정의하는 것을 의미. 이를 통해 상속받은 기능을 자식 클래스 상황에 맞게 변경하여 다형성을 구현함(Unity에서 MonoBehaviour를 상속받아 Start()나 Update() 같은 메서드를 재정의하는 것은 override개념과 유사하나, 실제로는 Unity엔진 내부에서 특정 메서드를 찾아 호출하는 방식임)
  • overload: 같은 이름의 함수를 매개변수 타입이나 개수를 다르게 정의하는 것을 의미함. 이를 통해 동일한 동작 개념을 가진 함수들을 편리하게 호출할 수 있음.
// override 예시 (부모 클래스의 메서드 재정의)
public class Animal
{
    public virtual void Speak()
    {
        Debug.Log("동물이 소리를 냄");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Debug.Log("강아지가 멍멍 짖음");
    }
}

// overload 예시 (같은 이름 다른 매개변수)
public class Calculator
{
    public int Add(int a, int b) { return a + b; }
    public float Add(float a, float b) { return a + b; }
}

 

2. 확장 메서드

확장메서드는 기존에 정의된 클래스에 새로운 메서드를 추가하는 것처럼 보이게 하는 C#의 문법 요소이다.

이를 통해 Unity에서 제공하는 Vector3, GameObject 등 기본 클래스에 기능을 확장해 코드 재사용성과 가독성을 높임

public static class Vector3Extensions
{
    public static Vector3 AddX(this Vector3 original, float xValue)
    {
        return new Vector3(original.x + xValue, original.y, original.z);
    }
}

// 사용 예시
Vector3 pos = new Vector3(0, 0, 0);
Vector3 newPos = pos.AddX(5f); // 확장 메서드를 통해 코드 가독성을 높임

 

확장메서드는 보통 이렇게 유틸리티적 성격을 띄는 경우가 많음

 

3. 콜백(Callback)

콜백은 특정 작업 완료 후 호출하는 메서드나 람다 함수를 말함. Unity에서 비동기 로딩 완료 후 특정 동작을 실행하거나, 코루틴이 끝난 뒤 특정 함수를 호출하는 식으로 활용할 수 있음. 콜백을 통해 코드 흐름을 유연하게 제어하고, 이벤트 중심 설계를 구현할 수 있음

void LoadData(System.Action onComplete)
{
    // 가상의 비동기 작업 시작
    StartCoroutine(DataLoadCoroutine(onComplete));
}

IEnumerator DataLoadCoroutine(System.Action onComplete)
{
    yield return new WaitForSeconds(2f); // 데이터 로딩 대기 가정
    onComplete?.Invoke(); // 로딩 완료 후 콜백 함수 호출
}

// 사용 예시
LoadData(() => Debug.Log("데이터 로딩 완료 콜백 실행함"));

 

4. 델리게이트(delegate; 대리자)

델리게이트는 메서드를 참조하는 타입으로, 함수를 변수처럼 전달할 수 있게 함.

Unity에서 델리게이트를 사용하면 다양한 게임 이벤트를 처리할 때 코드 결합도를 낮추고 재사용성을 높일 수 있음.

public delegate void OnHealthChanged(int currentHealth);

public class PlayerStats : MonoBehaviour
{
    public OnHealthChanged onHealthChanged; // 델리게이트 변수 선언

    private int health = 100;

    public void TakeDamage(int damage)
    {
        health -= damage;
        onHealthChanged?.Invoke(health); // 체력 변화 시 델리게이트 호출
    }
}

// 다른 스크립트에서
// PlayerStats 컴포넌트에 접근 후 델리게이트 바인딩
playerStats.onHealthChanged = (current) => { Debug.Log("현재 체력: " + current); };

 

5. C#의 event

event는 델리게이트를 기반으로 한 특별한 형태로, 외부에서 해당 이벤트를 직접 호출할 수 없고, 구독(+=), 해지(-=)만 가능함.

이를 통해 특정 클래스 내부에서만 이벤트를 발생시키고, 외부는 그 이벤트를 구독하는 안전한 구조를 만들 수 있음.

public class EnemySpawner : MonoBehaviour
{
    public event System.Action OnSpawn; // 이벤트 선언

    public void SpawnEnemy()
    {
        // 적 스폰 로직 ...
        OnSpawn?.Invoke(); // 이벤트 발생
    }
}

// 다른 스크립트에서 구독
spawner.OnSpawn += () => { Debug.Log("적이 스폰됨"); };

 

6. Unity에서 사용하는 델리게이트 혹은 이벤트

Unity에서는 UnityEvent, Action, Func 등을 활용해 이벤트 기반 설계를 구현할 수 있음. UI버튼 클릭, 충돌, 트리거 등 다양한 상황에서 델리게이트나 이벤트를 사용해 객체 간 상호작용을 간결하게 만들 수 있음. 이러한 구조를 사용하면 프로젝트 규모가 커져도 코드 유지보수가 수월함.