프로그래밍 39

delegate 와 Action 그리고 Func

**Action**과 **Func**는 모두 **delegate(대리자)**의 일종입니다. Action과 Func는 .NET에서 미리 정의해 둔 제네릭 대리자(delegate) 타입으로, 각각 매개 변수가 있거나 없고, 반환값이 있는지 없는지에 따라 다양하게 사용할 수 있도록 제공되는 것입니다. delegate(대리자)란대리자는 함수를 참조할 수 있는 타입입니다.즉, 함수를 변수처럼 다룰 수 있도록 해주는 기능입니다. 함수를 대리자에 할당한 후, 대리자를 통해 함수를 호출할 수 있습니다.일반적으로 대리자는 사용자가 직접 정의해서 사용할 수 있지만, .NET에서는 이미 자주 사용되는 대리자를 편리하게 사용할 수 있도록 Action과 Func를 제공하고 있습니다. Action과 Func는 delegate의 ..

프로그래밍/C# 2024.10.19

클로저 (Closure)

클로저(Closure)클로저는 함수가 외부 범위에 있는 변수를 참조하고 기억하여 함수가 실행될 때마다 그 변수를 사용할 수 있는 개념입니다. 이 개념을 통해 람다 표현식이나 익명 함수가 외부 변수에 접근하여 그 상태를 유지하고, 나중에 함수를 호출할 때도 해당 변수를 사용할 수 있습니다. 클로저를 사용하는 코드 예시 버튼 클릭 시 클로저 사용다음 코드는 여러 개의 버튼이 있을 때, 각 버튼에 고유한 인덱스를 기반으로 다른 동작을 할당하는 방식입니다. 이때 클로저를 사용해, 각 버튼이 클릭될 때 해당 인덱스를 기억하고 올바르게 처리할 수 있도록 합니다.public class ButtonClosureExample : MonoBehaviour {     public Button[] buttons;     vo..

프로그래밍/C# 2024.10.19

RoundToInt()

RoundToInt()는 Unity에서 제공하는 함수로, 주어진 소수를 가장 가까운 정수로 반올림하는 함수입니다.이 함수는 Mathf 클래스에 속해 있으며, 실수 값을 입력으로 받아 정수로 변환합니다.기본적인 사용법은 다음과 같습니다:int result = Mathf.RoundToInt(2.7f);  // 결과: 3 int result2 = Mathf.RoundToInt(2.3f); // 결과: 2  주요 특징소수점 이하가 0.5 이상일 때는 해당 값을 올림 처리합니다.소수점 이하가 0.5 미만일 때는 내림 처리합니다.  예시 코드float value1 = 3.6f; float value2 = 3.3f; float value3 = 3.5f; int roundedValue1 = Mathf.RoundToIn..

Lazy<T> 에 대한 조금 더 깊이있는 이해

Lazy의 기본 구조**Lazy**는 C#의 제네릭 클래스이며, 내부적으로 객체가 실제로 필요할 때만 생성되도록 설계되어 있습니다.Lazy의 핵심은 Value 프로퍼티에 있으며, 이 프로퍼티가 호출되기 전까지는 객체가 생성되지 않습니다.  Lazy의 내부 동작 원리Lazy는 내부적으로 람다 표현식을 딜레이(지연) 시켜서 나중에 실행되도록 처리합니다. 즉, Lazy 생성자에서 전달된 객체 생성 로직(람다 표현식)이 즉시 실행되지 않고 저장만 되며, Value 프로퍼티가 처음 호출될 때까지 대기하게 됩니다. Lazy 생성 시:람다 표현식을 전달받습니다. 이 표현식은 객체를 어떻게 생성할지에 대한 정보만 저장하고, 즉시 실행되지 않습니다. Value 프로퍼티에 처음 접근할 때:Value 프로퍼티는 내부적으로 ..

프로그래밍/C# 2024.10.14

Lazy<T>

Lazy는 .NET에서 제공하는 제네릭 클래스 중 하나로, 특정 객체를 필요할 때까지 생성하지 않고 미루는 "지연 초기화" (Lazy Initialization)를 지원하는 클래스입니다. 즉, 실제로 객체가 필요할 때 처음 한 번만 생성하고 그 이후에는 이미 생성된 객체를 사용하게 하는 방식입니다. Lazy의 주요 특징지연 초기화: 객체 생성이 반드시 필요할 때까지 미루기 때문에 성능 최적화가 가능합니다. 스레드 안전성:Lazy는 기본적으로 스레드 안전하게 작동하여, 여러 스레드에서 동시에 접근하더라도 객체가 한 번만 생성됩니다. 싱글톤 구현에 유용:한 번만 생성되어야 하는 객체를 효율적으로 관리할 수 있습니다.  Lazy 사용 방법public class MyClass {     // Lazy를 사용하여..

프로그래밍/C# 2024.10.14

싱글톤 (Singleton)

싱글톤(Singleton) 패턴은 특정 클래스의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴입니다.주로 애플리케이션 전역에서 하나의 객체만 필요할 때 사용됩니다.예를 들어, 설정 관리 클래스, 로그 관리 클래스 등에 사용될 수 있습니다. C#에서 싱글톤 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 일반적인 구현 방법을 예시로 설명해 드리겠습니다. 기본적인 싱글톤 구현public class Singleton {     // 유일한 인스턴스를 저장하는 정적 필드     private static Singleton instance = null;     // 인스턴스에 접근하는 정적 프로퍼티     public static Singleton Instance     {         get       ..

프로그래밍/C# 2024.10.14

static 선언

C#에서 `static` 키워드는 클래스나 클래스 멤버(필드, 메서드 등)에 사용되며, 해당 멤버나 클래스가 객체 인스턴스에 속하지 않도록 선언할 때 사용합니다. 즉, 클래스 자체에 속하게 되어 모든 인스턴스에서 공유됩니다. 아래는 `static`의 주요 특징과 예시입니다.  정적 클래스 (Static Class)* 클래스 자체가 정적일 경우, 그 클래스는 인스턴스화 할 수 없습니다. * 모든 멤버가 자동으로 정적이 됩니다. public static class MathUtility {     public static int Add(int a, int b)     {         return a + b;     } } MathUtility 클래스는 인스턴스화가 불가능하며, `Add` 메서드는 다음과 같이..

프로그래밍/C# 2024.10.13

event 그리고 delegate, Action

C#에서는 메서드를 참조하고 호출하는 다양한 방식이 존재합니다. 그중에서도 delegate, Action, 그리고 event는 자주 사용되는 대표적인 기능들입니다. 이 세 가지를 한 번에 비교하여 각 개념의 역할과 사용 방법을 이해해봅시다. 사실 이 3가지를 비교한다는 말은 좀 어거지다. 다만, 처음보면 다소 헤깔리기 때문에 같이 놓고 어떤 식으로 쓰이는지 알아보는 정도로 이해하면 좋겠다. Delegate정의: delegate는 특정 메서드를 참조할 수 있는 사용자 정의 타입으로, C++의 함수 포인터와 유사한 기능을 제공합니다. 여러 메서드를 한 번에 호출하거나, 메서드를 콜백 형태로 전달할 때 유용합니다. 사용 방법: 직접 특정 시그니처를 정의하여, 그와 같은 매개변수와 리턴 타입을 가진 메서드를 참..

프로그래밍/C# 2024.10.12

Action

유니티에서 Action 사용하기유니티에서 Action은 C#에서 기본 제공하는 제네릭 delegate 타입으로, 주로 콜백 함수를 전달할 때 사용됩니다. Action은 리턴값이 없고, 간단히 여러 작업을 한 곳에 모아놓고 특정 상황에서 호출하는 데 유용합니다. 코드의 가독성을 높이고 간결하게 유지하기 위해 많이 사용됩니다. Action을 사용하는 경우이벤트 기반 작업: 특정 이벤트가 발생했을 때 여러 작업을 한 번에 처리하고 싶을 때. 버튼 클릭 등 UI 작업: 버튼 클릭 시 여러 작업을 연결해 처리하고 싶을 때. 비동기 작업 후속 처리: 비동기 작업이 끝난 후 후속 작업을 등록하고 처리할 때. 예시: 플레이어가 적과 충돌했을 때 여러 작업을 처리하는 경우using System;using UnityEng..

프로그래밍/C# 2024.10.12

Callback

콜백 함수와 직접 호출 방식의 차이콜백 함수는 특정 작업이 완료된 후 다른 작업을 실행하기 위해 미리 등록된 함수를 호출하는 방식입니다.일반적으로 이벤트 기반 프로그래밍이나 비동기 작업에서 유용합니다.반면, 직접 호출 방식은 함수를 순차적으로 호출하는 방식으로, 코드를 단순하게 유지할 수 있지만 작업의 흐름이 고정적입니다. 예시 1: 콜백 없이 직접 호출하는 방식public class WithoutCallback : MonoBehaviour {     void Start()     {         Task1();         Task2();         Task3();     }     void Task1()     {         Debug.Log("Task 1 Complete");     } ..

프로그래밍/C# 2024.10.12