전체 글 269

[C#] LINQ

LINQ : Language INtegrated Query, C#에 도입된 통합된 데이터 질의 기능 SQL 언어랑 비슷하며 데이터를 다루기 위한 문법이다. Name과 Height를 프로퍼티로 가지는 Profile 클래스가 있다하자. 다음과 같은 배열에서 Height가 175 미만인 인스턴스를 오름차순으로 정렬하고 싶을때 만족하는 Profile 인스턴스만 찾고 싶다면 긴 문법을 작성해야한다. Profile[] arrProfile = { new Profile(){ Name = "정우성", Height = 186}, new Profile(){ Name = "김태희", Height = 158}, new Profile(){ Name = "고현정", Height = 172}, new Profile(){ Name =..

C#/C# 기본 2021.10.18

[C++ Thread] Lock Free Programming - (2) Lock Free Queue

LockFree 큐를 설계해본다. LockFree Queue LockFree Stack에 이어서 큐와 같은 경우 FIFO 특징이 있기 때문에 맨 앞을 가리키는 노드(Head)와 맨 뒤를 가리키는 노드(Tail)이 있어야한다. 큐의 설계 처음 큐에는 Head와 Tail이 일치하는 더미 노드가 하나 존재하며 데이터를 가지지 않는다. Push() : 현재 Tail의 노드(OldTail)에 데이터를 삽입하고 새로운 노드를 Tail로 만들어준다. 새로운 노드에 데이터를 할당하는 것이 아니다. Pop(): Head와 Tail이 일치하지 않다면, 큐는 적어도 하나의 데이터가 있는 것이다. 이 때 Head는 OldHead가 되고 OldHead의 다음 노드가 Head가 된다. Single Producer Single C..

[UE4] Behavior Tree 정리

관련 모듈 : 블랙보드, 비헤이비어 트리 : "AIModule", 네비게이션 "NavigationSystem", 태스크 클래스 : "GameplayTasks" Character(Pawn)에서 생성시 사용되는 컨트롤러를 지정 AIControllerClass = ASimpleAIController::StaticClass(); AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; AIController의 OnPossess(APawn* InPawn) 혹은 BeginPlay() 에서 BT 에셋과 BB 에셋을 등록 1) AIController의 멤버 BlackboardComponent와 블랙보드 에셋을 바인딩 bool AAIController::UseBlackboard..

C++/Unreal Engine 2021.10.15

[C#] 람다식

람다식 함수형 프로그래밍의 근간이 되는 람다 계산법에서 사용하는 식을 말한다. C#에서 표현하는 람다식은 매개변수_목록 => 식 으로 표현된다. - 예시 delegate int Function(int a, int b); static void Main(string[] args) { Function func = (int a, int b) => a + b; } 컴파일러는 람다의 매개 변수의 타입을 지정하지 않아도 타입 유추를 통해 가능하다면 람다 함수를 생성할 수 있다. Function func = (a, b) => a + b; 단일 실행문장이 아닌 여러 세미 콜론을 사용하는 문의 경우 중괄호를 이용하여 그 안에 실행하는 문장을 표현한다. Function func = (a, b) => { int c = a +..

C#/C# 기본 2021.10.15

[C#] 대리자와 이벤트

대리자 delegate 대리자란 함수의 호출을 대신하는 객체로 C++의 function 혹은 임의의 함수를 타입지정하는 것과 유사하다. 한정자 delegate 반환 형식 대리자_이름(매개변수_목록) delegate int MyDelegate(int a, int b); MyDelegate 타입은 두 int 형 매개변수를 받아 int를 반환하는 함수를 의미한다. 대리자를 통한 함수 호출은 다음과 같다. 1) 대리자를 선언한다. 2) 대리자 인스턴스를 만들고 함수를 등록한다. 3) 대리자를 호출한다. C++과 다르게 대리자의 함수의 경우 멤버 함수와 정적 함수 모두 형식만 맞으면 등록하여 호출할 수 있다는 점이다. C++에서 멤버 함수의 경우 첫번쨰 인자에 인스턴스를 바인딩해야한다. class Calculat..

C#/C# 기본 2021.10.15

[C++ Thread] Lock-Free Programming - (1) Lock Free ? / Lock Free Stack

Lock-Free 코드란? - Concurrency와 Scalibility를 가지는 동기화 방법 코드상 존재하는 블로킹/기다림을 제거하거나 줄이는 것 - 블록킹을 사용하면서 생기는 잠재적인 문제 경쟁 조건 (Race Condition): 잘못된 락의 사용 혹은 락의 부재 데드락 (DeadLock) : 락이 다른 스레드에 의해 잠긴 상태에서 영원히 해제가 안되는 상태 Simplicity vs Scalabilty : 락을 이용한 프로그램은 단순하다. 하지만 락에 의해 발생하는 병목 현상으로 사용자의 증가로 인한 성능 이슈가 발생한다 (Low Scalability). 블로킹에 의해 발생하는 콘보이 효과 / 우선순위 뒤집힘(Priority Inversion) 등. Compare And Exchange (CAS)..

[C#] Generic 프로그래밍 / 예외 처리

C#의 일반화 프로그래밍 Generic Programming C++에서 template를 C#에서 어떻게 하는 지 알아본다. 일반화 메서드 메서드 이름 뒤에 를 붙여 임의의 타입에 대해 동작하는 일반화 메서드를 정의한다. void CopyArray (T[] source, T[] target) { for(int i =0;i 10) throw new FilterableException() { ErroNo = num }; else Console.WriteLine($"Output : {num}"); } catch (FilterableException e) when (e.ErroNo < 0) { Console.WriteLine("Negative Input is not allowed"); } catch (Filte..

C#/C# 기본 2021.10.12

[UE4] 디버깅 기록 UTextBlock의 TextDelegate

UE 4.27 기준 UI중에 블루프린트로 UTextBlock의 Text 설정을 함수를 만들어서 바인딩할 수 있으나 C++에서 해당 기능을 구현 중에 있었는데, 관련 델리게이트가 보이길래 UTextBlock의 TextDelegate를 이용하여 특정 이벤트가 발생했을 때 TextDelegate함수를 호출하고 다음과 같이 UI에 해당 내용을 바꾸려고 했다. //UPROPERTY(VisibleAnywhere, Category = UI, Meta = (PrivateAccess = true)); //class UTextBlock* AmmoText; AmmoText->SetText(AmmoText->TextDelegate.Execute()); 하지만 실제로는 한번만 실행되고 해당 델리게이트가 Empty가 되어 어디서..

C++/Unreal Engine 2021.10.11

[C#] 배열 / 컬렉션 / 인덱서

배열의 선언과 사용 데이터형식[] 이름 = new 데이터형식[용량]; - 5개 원소를 가지는 배열 int[] scores = new int[5]; 배열은 메모리가 연속적인 구조를 갖는다. 배열은 다음과 같이 3가지 방법으로 초기화할 수 있다. string[] array1 = new string[3] { "hello", "안녕", "Halo" }; string[] array2 = new string[] { "안녕", "Hello", "Halo" }; string[] array3 = { "안녕", "Hello", "Halo" }; ^연산자를 이용한 배열 인덱스 접근 c#8.0에서부터 ^숫자는 인덱스를 지칭하게 된다. 실제 타입은 System.Index 형식이다. ^숫자 = 배열.Length - 숫자의 의미를..

C#/C# 기본 2021.10.11

[UE4] 디버깅 기록 PostActorCreated / 월드에서 스폰시

게임 중 액터를 스폰시 사용하는 함수 T* SpawnedActor = GetWorld()->SpawnActor(...); 위 함수를 호출하게 되면 PostActorCreated()까지의 함수를 모두 호출한 액터를 반환한다. 정확히 생성자 -> PreRegisterAllComponents() -> PostRegisterAllComponents() -> PostActorCreated() -> 반환순으로 이루어진다. 플레이어 액터가 PostActorCreated()에서 무기(웨폰)액터를 소환한다면 무기 웨폰도 PostActorCreated()까지 호출된 상태이다. SetupAttachment vs AttachToComponent 두 함수 모두 첫번째 인자로 전달하는 씬 컴포넌트의 트랜스폼을 부모로 두는 함수이..

C++/Unreal Engine 2021.10.11