개발블로그
[유니티 C#] Action 사용 - 이벤트(event), 강한 결합(Tight Coupling) 해소 본문
지난 포스팅에서 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)
이벤트는 이벤트 자체로는 어떤 일을 실행하지 않지만,
이벤트가 발생했을 때 이벤트를 구독하는 '구독자(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;
참고 서적 : 레트로의 유니티 게임 프로그래밍 에센스
'Unity > 스크립팅' 카테고리의 다른 글
[유니티 C#] FollowCamera 만들기. 캐릭터를 따라다니는 카메라, 카메라가 움직이는 방향으로 이동하기. (0) | 2021.10.25 |
---|---|
[유니티 C#] 다형성(Polymorphism) (0) | 2021.10.20 |
[유니티 C#] 유한 상태머신(Finite State Machine, FSM) (0) | 2021.10.13 |
[유니티 C#] GetAxis, GetAxisRaw. 오브젝트가 바라보는 방향으로 이동하기 (0) | 2021.09.29 |
[유니티 C#] Action 과 Func (0) | 2021.09.04 |