관리 메뉴

개발블로그

[유니티 C#] Action 사용 - 이벤트(event), 강한 결합(Tight Coupling) 해소 본문

Unity/스크립팅

[유니티 C#] Action 사용 - 이벤트(event), 강한 결합(Tight Coupling) 해소

dvmoo 2021. 10. 13. 14:16

지난 포스팅에서 Action의 예제로 자동차 리스트에서 Action을 사용함으로써 의존성을 낮추는 방법에 대해서 작성했다.

다른 예제를 작성하며 Action을 이해하자.

 

https://devheehee.tistory.com/27

 

[유니티 C#] Action 과 Func

💪 GOAL https://devheehee.tistory.com/21 지난 포스팅에서 Delegate의 사용 방법을 알아보았다. 지난 시간에 이어서 C#에서 Delegate를 좀 더 간단히 사용할 수 있도록 미리 선언한 Delegate 변수인 Action과 F..

devheehee.tistory.com

 

💪 GOAL

 - Action을 사용해서 견고한 커플링을 해소하는 예제를 작성하며 익힌다.


🔶 이벤트(Event)

그림 1 이벤트와 이벤트 리스너의 관계

이벤트는 이벤트 자체로는 어떤 일을 실행하지 않지만,

이벤트가 발생했을 때 이벤트를 구독하는 '구독자(Subscriber)'들이 알림을 받고 실행하게 된다.

 

이 구독자들을 '이벤트 리스너(Event Listener)'라고 한다.

이벤트 리스너들은 이벤트를 항상 듣고 있다가 이벤트가 발동되면 실행된다.

이벤트 리스너를 이벤트에 등록하는 것을 '구독한다'고 표현하기 때문에 구독자라고도 한다.

 

 

이를 통해서 '강한 커플링(Tight Coupling)'을 해소할 수 있다.

강한 커플링이란 '강한 결합' 이라고도 하는데, 다른 오브젝트에 대한 정보를 많이 필요로 하고 객체간의 의존성이 높은 경우를 말한다.

 

예제를 보자.

using UnityEngine;

public class GameData : MonoBehaviour
{
    public void Save()
    {
        Debug.Log("게임 저장");
    }
}
using UnityEngine;

public class Player : MonoBehaviour
{
    GameData _gameData;

    public void Die()
    {
        _gameData.Save();
    }
}

 

Player 클래스에서는 Die 상태일 때 GameData 클래스의 Save() 함수를 실행한다.

하지만, GameData 클래스의 Save() 함수의 구현이 변경된다면 Player 클래스의 구현도 변경해야 되기 때문에

코드의 유지보수에 어려움이 생길 수 있다.

 

 

이는 Action을 사용해서 이벤트를 제공하는 방식으로 변경해서 강한 결합을 느슨하게 바꿔줄 수 있다.

using UnityEngine;

public class GameData : MonoBehaviour
{
    void Start()
    {
        var player = GetComponent<Player>().onDeath += Save;
    }

    void Save()
    {
        Debug.Log("게임 저장");
    }
}
using UnityEngine;
using System;

public class Player : MonoBehaviour
{
    public Action onDeath;

    public void Die()
    {
        onDeath();
    }
}

변경된 코드를 확인해보면 Player클래스는 GameData 타입의 오브젝트를 비롯해서 상대방 오브젝트를 파악할 필요가 없다.

Player의 Die() 에 관심이 있는 오브젝트는 Player의 onDeath 이벤트를 구독하면 되는 것이다.

 

만약 Action을 onDeath를 event로 선언하면 클래스 외부에서 델리게이트를 실행할 수 없게 되므로

Player 클래스에서 onDeath를 실행할 수 없다.

public event Action onDeath;

 

 


참고 서적 : 레트로의 유니티 게임 프로그래밍 에센스