본문 바로가기
[ Unity ]/- 유니티 실습

유니티 Delegate

by MRG 2024. 8. 31.
728x90
반응형

▣ 델리게이트(Delegate)는 C#에서 매우 중요한 개념으로, 특정 메서드를 참조할 수 있는 형식을 의미합니다. 이를 통해 메서드를 변수처럼 다룰 수 있으며, 메서드를 매개변수로 전달하거나, 런타임에 어떤 메서드를 호출할지 동적으로 결정할 수 있습니다.

▣  델리게이트의 사용 목적:
동작의 캡슐화: 델리게이트를 사용하면 함수 자체를 변수처럼 전달할 수 있어, 실행할 코드의 일부를 런타임에 결정할 수 있습니다.
이벤트 처리: 이벤트 시스템에서 자주 사용됩니다. 예를 들어 버튼 클릭 시 호출할 메서드를 델리게이트로 지정할 수 있습니다.
콜백 메서드: 비동기 작업이 끝났을 때 호출할 메서드를 지정하는 콜백에 사용됩니다.

 

▣ 델리게이트의 사용 상황:
코드의 재사용성을 높이기 위해
여러 객체가 동일한 작업을 수행해야 할 때
이벤트 기반 프로그래밍에서 특정 이벤트에 반응하는 메서드를 동적으로 할당해야 할 때

 

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/

 

Delegates - C#

A delegate in C# is a type that refers to methods with a parameter list and return type. Delegates are used to pass methods as arguments to other methods.

learn.microsoft.com

 

 

 

 

▣ 설명: 델리게이트 정의 시 delegate 키워드를 붙여야 합니다.  

그리고 델리게이트를 사용시에는 인스턴스 생성을 해야 합니다.

이 코드는 Unity의 Start() 메서드에서 SimpleDelegate 델리게이트를 사용하여 SayHello 메서드를 호출하는 예제입니다. Unity에서는 Start() 메서드가 게임 오브젝트가 활성화될 때 자동으로 호출됩니다.

 

 

 

▣ 설명: 이 예제에서는 Start() 메서드에서 델리게이트를 통해 PrintMessage 메서드를 호출합니다. Unity에서는 Debug.Log()를 사용하여 콘솔에 메시지를 출력합니다.

 

 

 

▣ 설명: 이 예제는 Unity에서 Start() 메서드를 사용하여 멀티캐스트 델리게이트를 호출하는 방법을 보여줍니다. 여러 메서드를 하나의 델리게이트에 할당하여 동시에 실행할 수 있습니다. 

이걸 멀티캐스트 델리게이트라고 합니다. 

 

 

 

▣ 설명: 이 코드는 Unity의 Start() 메서드에서 비동기 작업을 시뮬레이션하고, 작업이 완료된 후 콜백 메서드를 호출하는 예제입니다. Debug.Log()를 통해 작업의 진행 상태를 출력합니다.

 

▣ Thread.Sleep(2000);는 C#에서 사용되는 코드로, 현재 실행 중인 스레드를 지정된 시간(밀리초 단위) 동안 일시 중지시킵니다. 이 코드는 프로그램이 일정 시간 동안 아무 작업도 하지 않고 기다리도록 할 때 사용됩니다.

▣ 코드 설명:
Thread 클래스: Thread는 C#의 스레드 관리를 위한 클래스입니다. 스레드는 프로그램의 독립적인 실행 흐름을 의미하며, 여러 스레드를 통해 동시 작업을 처리할 수 있습니다.
Sleep(int millisecondsTimeout) 메서드: Thread.Sleep 메서드는 현재 실행 중인 스레드를 일정 시간 동안 중지시킵니다. 매개변수로 중지할 시간을 밀리초 단위로 받습니다.


▣ 코드의 동작:
Thread.Sleep(2000);은 현재 실행 중인 스레드를 2000밀리 초(즉, 2초) 동안 중지시킵니다.
이 동안 스레드는 CPU 자원을 사용하지 않으며, 지정된 시간이 경과한 후에 다시 작업을 재개합니다.


▣ 사용 시 주의사항:
메인 스레드에서 사용: 만약 이 코드가 UI 스레드(메인 스레드)에서 실행된다면, 그동안 UI 업데이트가 중지되고 프로그램이 응답하지 않게 될 수 있습니다. 따라서 UI 스레드에서는 이 코드를 주의해서 사용해야 합니다.
비동기 작업에서 사용: Thread.Sleep 대신 비동기 작업에서는 Task.Delay를 사용하는 것이 더 적합할 수 있습니다. Task.Delay는 비동기적으로 기다리며, 스레드를 차단하지 않기 때문에 UI 응답성을 유지할 수 있습니다.

 

https://learn.microsoft.com/ko-kr/dotnet/api/system.threading.thread.sleep?view=net-7.0

 

Thread.Sleep 메서드 (System.Threading)

지정된 시간 동안 현재 스레드를 일시 중단합니다.

learn.microsoft.com

 

 

 

 

▣ 설명: 이 예제는 이벤트 시스템에서 델리게이트를 사용하는 방법을 보여줍니다. 이벤트에 메서드를 구독하여 특정 이벤트 발생 시 동작을 정의할 수 있습니다.

 

▣ OnClick?. Invoke();는 C#에서 사용되는 코드로, 이벤트를 안전하게 호출하기 위한 문법입니다. 이 코드는 이벤트가 구독된 경우에만 해당 이벤트를 호출하도록 합니다.

▣ OnClick?: 여기서? 는 null 조건 연산자 (Null-conditional operator)입니다. OnClick이 null이 아닌 경우에만 오른쪽의 Invoke()를 호출합니다. 만약 OnClick이 null이라면, 이 줄의 실행을 건너뛰게 됩니다.

▣ Invoke(): 이벤트나 델리게이트를 호출하는 메서드입니다. OnClick에 등록된 모든 메서드를 호출합니다.

 

 

 

▣ evenNumbers.ForEach(number => Debug.Log(number)); 부분에서 ForEach 메서드 내에서 Debug.Log를 호출할 때, 각 요소를 Debug.Log 메서드에 전달하도록 람다식을 사용했습니다.
이 방법을 사용하면 evenNumbers 리스트에 있는 모든 숫자가 Debug.Log를 통해 콘솔에 출력됩니다.

 

 

▣ ForEach 메서드와 람다식을 결합하여 리스트의 각 요소에 대해 특정 작업을 수행하는 코드입니다.
코드 구성:
evenNumbers: 짝수로 필터링된 정수들의 리스트입니다.
ForEach: List <T> 클래스에 포함된 메서드로, 리스트의 각 요소에 대해 주어진 작업을 수행합니다.
number => Debug.Log(number): 람다식으로, 리스트의 각 요소 number에 대해 Debug.Log(number)를 호출하여 콘솔에 출력하는 작업을 정의합니다.


▣ 상세 설명:
ForEach 메서드: ForEach는 리스트의 각 요소를 순차적으로 접근하며, 요소마다 지정된 동작(람다식에서 정의한)을 수행합니다.
람다식 number => Debug.Log(number): 람다식은 익명 메서드의 간결한 표현 방식입니다. 여기서 number는 evenNumbers 리스트의 각 요소를 나타내며, => 뒤에 있는 Debug.Log(number)는 각 요소를 Unity의 콘솔에 출력하는 작업을 나타냅니다.
number는 evenNumbers 리스트의 현재 요소를 의미합니다.
Debug.Log(number)는 number 값을 Unity 콘솔에 출력합니다.

 

 

 

▣ 이 코드에서는 델리게이트를 사용하지 않고, 필터링 로직을 직접 메서드로 구현했습니다. 이 경우 특정 조건(짝수)만을 필터링할 수 있으며, 다른 조건을 적용하려면 별도의 메서드를 작성해야 합니다.
반대로 델리게이트를 사용하면 다양한 조건을 외부에서 전달할 수 있어, 코드의 재사용성과 유연성이 높아집니다. 따라서 델리게이트는 단순한 작업이 아니라 동적으로 작업을 제어해야 하는 상황에서 유용하게 사용됩니다.

 

 

 

 

728x90
반응형

댓글