인풋과 관련된 로직을 짜다가 문득 들었던 생각.
보통 인풋과 같은 이벤트를 처리할 때 콜백 함수를 사용해서 많이 구현하는데 꼭 그래야 하나?
실제로 저번 콘솔 RPG제작 때에도 ReadKey()를 통해서 키보드 입력을 받아올 때 ReadKey()를 받는 곳에서 Key값에 따라 필요한 로직을 처리하는 메소드를 호출하게 구현했었다.
콜백함수를 써볼까 했지만 콜백함수를 써서 구현하나 그냥 직접 호출하나 차이가 없을거라고 느껴졌기 때문이다.
그래서 어떤 경우에 콜백 함수를 쓰는지 직접 검색해보았다.
콜백 함수 관련 질문 입니다.
평소 콜백 함수는 아예 정의해서 쓰지 않는 편인데 유독 많이 쓰는 분이 있더라구요 기본 적인 개념으로는 키 입력이나 라이브러리 함수에 사용하면 좋다 라는 ...
lab.gamecodi.com
[C#] 콜백 함수(Callback)는 무엇이고 대리자(Delegate)는 뭘까?
목차 개요 콜백(Callback)이란 개념을 처음 들은 것은 유니티(Unity)를 공부할 때였다. 게임이란 분야 특성상, 비동기 처리가 주를 이루는 시점에 콜백이란 개념은 필수적으로 등장하는 것 같았다.
daekyoulibrary.tistory.com
Chapter 17. Delegates and Events
Table of contents Delegates and Events Article 04/27/2010 In this article --> This chapter is excerpted from Learning C# 3.0: Master the fundamentals of C# 3.0 by Jesse Liberty, Brian MacDonald, published by O'Reilly Media When a head of state dies, the pr
learn.microsoft.com
10년 가까이 된 현업자 분의 댓글과 다른 개발자분의 블로그, ms문서등을 통해서 어느정도 감을 잡을 수 있었다.
요약하자면 콜백을 사용하는 이유는 크게 2가지가 있는 것 같다.
1. 비동기적 처리
2. 로직의 캡슐화
비동기적 처리에 관해 말하자면 콜백 함수를 사용하면 매 번 어떤 시점에서 어떤 로직을 실행해야하는지 확인할 필요 없이 어떤 로직이 발생하면 해당하는 행동을 실행하라! 라는 식으로 동작할 수 있게 된다는 것이다.
위의 2번째 링크의 사장님이 부재중인지 매번 확인하지 않고 사장님이 오면 연락을 달라고 하는 것과 같다.
유니티에서 코루틴을 떠올려보면 될 것 같다.
코루틴을 작성하면 메인 루프에서 매번 조건을 확인해서 특정 행동을 하라고 호출하는 것이 아니라 그냥 해당 조건이 되었을때 그 행동이 담긴 코루틴을 실행하듯이 말이다.
이런 방식으로 동작하게 되면 메인 로직의 흐름과 별개로 어떤 행동이 가능해지는 비동기적 처리가 가능해지니 콜백을 사용한다.
로직의 캡슐화에 대해 말하자면 콜백 함수를 사용하면 그게 어떤 로직인지 전~혀 몰라도 된다는 것이다.
예를 들어 1번째 링크의 한 댓글과 같은 상황을 가정해보자.
플레이어의 HP가 25%이하로 떨어지면 물약을 먹는 기능을 구현한다고 하자.
콜백을 사용하지 않는다면 HP를 감소시키는 플레이어의 메소드에서 로직을 구현할 것이다. HP가 25% 미만인지 체크하고 맞으면 물약을 먹는다.
그러다가 기획이 변경되어서 물약을 먹고 자폭도 한다고 하자.
그럼 이제 HP를 감소시키는 메소드에서 자폭을 시켜주는 로직도 추가시켜줘야 한다.
그게 또 변경되면 그 때마다 HP감소 메소드는 로직이 바뀌고 또 바뀌고 또 바뀐다.
그런데 콜백을 사용하게되면 HP 메소드에서 로직을 수정할 필요가 없다.
HP 메소드는 그냥 HP가 얼마로 변경되었다~ 알려만 주면 그걸 지켜보고 있던 로직에서 알아서 물약먹고 자폭하도록 하면 된다.
물약을 안 먹고 싶으면 단순히 물약 먹는 로직을 HP지켜볼 필요 없다~ 하고 빼버리면 된다.
다른 기능을 넣고 싶으면 너도 HP 지켜보고 할거 해라~ 하면 된다.
코드 작성도 간편할 것이고 유지 보수도 훨씬 쉬워질 것이다.
해당 내용은 위의 3번 링크의 ms문서를 참조하면 더 좋을 것이다.
이런 이유로 라이브러리에서 사용자의 로직을 적용하는 방법으로 콜백 함수를 사용한다고 한다.
그 라이브러리가 어떻게 생겨먹었는지 사용자도 모르고 라이브러리도 사용자 로직이 어떻게 굴러갈지 모르지만 어쨌든 라이브러리는 나 어떤 이벤트 발생했다? 할거 있으면 해라 하고 사용자는 이런 이벤트 발생하면 이거 해야지! 하기만 하면 잘 굴러갈 것이다.
예를 들면 유니티의 Update가 대표적인 콜백 함수다. 우리는 매 프레임마다 유니티에서 어떤 로직을 실행하는지 전~혀 몰라도 된다. 그냥 유니티는 매 프레임마다 할 거 있냐? 있으면 Update에 작성해라 하고 사용자는 그럼 이거 이거 할까~ 하고 Update 함수 안에 로직을 적는다. 그럼 서로 로직을 모르지만 잘 작동이 된다.
이런 콜백을 위해 사용되는 기능들도 C#에서 몇 가지 있는데 delegate, event 키워드 등이 대표적이다.
위의 유니티의 Update는 유니티의 MonoBehaviour를 상속받아서 사용하니 사용 방식이 좀 다르지만 C#에서 콜백을 사용하려면 delegate가 필요하다.
콜백은 행동을 전해줘야 하는데 그 행동을 나타낼 수 있는게 delegate기 때문이다.
어려울 건 없다. delegate는 메소드를 담는 그릇이다. 이게 끝이다.
선언 방식도 메소드 시그니처 그대로 작성하고 맨 앞에 delegate 붙여주면 된다. 하나의 Type으로 기능하니까 사용할 땐 해당 타입으로 delegate 객체를 만들어서 사용하면 된다.
자세한 사용 방법은 3번 ms 문서를 참고하면 된다. 아주 자세하게 잘 나와 있더라. event 키워드가 무엇이고 왜 써야하는지까지 나와있다.
'부트캠프' 카테고리의 다른 글
팀 콘솔 RPG2 (스킬 구현) (0) | 2023.08.29 |
---|---|
팀 콘솔RPG 프로젝트 (0) | 2023.08.28 |
콘솔앱으로 TextRPG 만들기3 (0) | 2023.08.23 |
콘솔앱으로 TextRPG 만들기2 (0) | 2023.08.21 |
콘솔앱으로 TextRPG 만들기 (0) | 2023.08.18 |