본문 바로가기

분류 전체보기

(18)
LINQ(2) - 일반적인 LINQ 코드 작성 원칙 및 유의점 LINQ에 대한 여러가지 LINQ는 워낙 거대한 기능이라 사용방법이 복잡하다. 이 글에서는 LINQ에 관련된 여러가지 잡다한 이야기와 LINQ 코드를 사용할 때 주의할 점들에 대해 서술한다. 또한 이 글은 유니티에서의 사용을 전제로 삼고 있다. LINQ는 SQL로 변환될 수 있는 쿼리 표현식으로 널리 사용되지만, 여기서는 고려하지 않는다. . LINQ 코드 작성 원칙 이 글에서 제안하는 LINQ 관련 코드 작성 원칙이다. 1. 쿼리 구문보다 메서드 구문을 사용한다. 쿼리 구문은 일반적인 C# 코드와 너무 이질적인 모양을 하고 있다. SQL보다는 C#에 익숙할 유니티 프로그래머들이 굳이 더 생소하게 보일 쿼리 구문을 사용할 필요가 없다. 유니티에서 실제 DB에 쿼리할 일이 없으니 더욱 그렇다. 또한 쿼리 ..
LINQ(1) - 함수형 프로그래밍에 대해서 함수형 프로그래밍은 프로그래밍을 하다 보면 누구나 한번쯤은 빠져들게 되는 주제이다. 이 글에서는 C#의 가장 중요한 기능 중 하나인 LINQ에 대해 설명하기 전, 함수형 프로그래밍에 대해 간략하게 설명한다. 명령형 프로그래밍vs선언형 프로그래밍 함수형 프로그래밍에 대해 생각하기 전에 먼저 명령형imperative 프로그래밍과 선언형declarative 프로그래밍의 개념부터 알아야 한다. 명령형 프로그래밍이란 어떻게 해야 하는지를 서술하는 것이다. 반면에 선언형 프로그래밍은 내가 무엇을 할지를 서술하는 것이다. 예를 들어 지금 Q라는 글자를 타이핑하려고 해보자. 명령형 프로그래밍의 관점에서 Q를 타이핑하는 방법은 다음과 같다: 새끼손가락을 왼쪽으로 0.5cm, 앞쪽으로 0.5cm 이동한다. 새끼손가락 끝에..
C#의 프로퍼티와 필드는 뭐가 다를까? 프로퍼티vs필드 프로그래밍을 입문하는 경우 C/C++로 입문하는 경우가 많다. 그래서 클래스를 "메서드"와 "멤버 변수"의 묶음으로 이해하는게 대부분이다. 그런데 C#에는 "멤버 변수" 대신 필드와 프로퍼티가 있다. 뭐가 다를까? 필드는 전통적인 의미의 멤버 변수이다. 인스턴스의 상태를 저장한다. 프로퍼티는 C++등에서도 흔하게 만들던 setter/getter 메서드를 언어 문법으로 가져온 것이다. 아래는 해당 개념을 코드로 표현한 것이다. public class ClassWithProperty { public int Field; private int _backingVariable; public int Property { get { return _backingVariable; } set { _backin..
C#에서 데이터를 압축하는 코드 유니티로 게임을 만지다 보면 데이터를 직접 압축할 일이 종종 생긴다. 특히 서버와 큰 데이터를 주고받거나 서버에서 굳이 열어보지 않을 데이터를 수집하는 등의 작업에서 압축을 하면 효과를 볼 때가 있다. 아래는 문자열을 압축하는 간단한 코드이다. 유니티서 사용할 경우 동기 버전으로 변형하거나 Task 대신 UniTask 등으로 변형해서 사용할 수 있다. brotli compression in C# brotli compression in C#. GitHub Gist: instantly share code, notes, and snippets. gist.github.com using System.IO; using System.IO.Compression; using System.Text; using System..
C#의 확장 메서드는 언제 사용하면 좋을까? 확장 메서드가 뭔가요? 확장 메서드는 C#의 기능으로, 어떤 클래스에 외부에서 메서드를 정의해서 추가하는 것이다. 확장 메서드는 다음과 같이 정의된다. SomeClass someClass = new SomeClass(); someClass.ExtensionMethod(42);// someClass.A = 42 class SomeClass { public int A; } static class SomeClassExtension { public static void ExtensionMethod(this SomeClass s, int a) { s.A = a } } 정적 클래스에 첫 번째 매개변수를 this로 선언할 것 이렇게 하면 첫 번째 매개변수로 지정한 클래스에 원래 그런 이름의 메서드가 있었던 것 처럼 ..
코루틴 여러개가 모두 완료될때까지 대기하는 코드 언제 끝날 지 모르는 코루틴 여러개를 동시에 실행하되, 모든 코루틴이 끝날때까지 기다리는 기능이 필요해서 만들어 보았다. 개념으론 Task.WhenAll과 동일한데, Task와 달리 코루틴 여러개를 기다리는 기능은 유니티가 기본으로 제공해주지 않는다. . WaitForCoroutines WaitForCoroutines. GitHub Gist: instantly share code, notes, and snippets. gist.github.com using System.Collections; using UnityEngine; public class WaitForCoroutines : CustomYieldInstruction { public override bool keepWaiting => _remain..
유니티에서 async/await를 어떻게 쓰면 좋을까? async/await는 비동기? 병렬? C#의 async/await와 Task는 비동기를 표현한 것일까 병렬실행을 표현한 것일까? 이 점을 헷갈려하는 사람들이 아주 많다. 결론부터 말하면 Task는 비동기 작업을 표현하는 클래스이다. 그러나 병렬로 실행되기도 한다. 이 점 때문에 Task를 쓰면 멀티스레드를 사용하여 병렬 작업이 일어난다고 알고 있는 경우가 많다. 그러나 이것은 단순히 .NET에 포함된 Task의 구현이 스레드 풀을 사용하도록 되어 있어서 그렇기 때문이다. Task는 어디서 실행될까? await SomethiingAsync(); async Task SomethingAsync() { Console.WriteLine(Environment.CurrentManagedThreadId); await..
Singleton 패턴을 써야 할까? 들어가며.. 싱글턴 패턴은 항상 많은 의견이 나오는 주제이다. 디자인 패턴 중 가장 쉬운 패턴인 것도 있고 가장 사용빈도가 높은 패턴 중 하나이기도 하다. 또한 안티패턴이다 vs 하나의 패턴일 뿐이다 로 의견이 많이 갈리는 주제이기도 하다. 이 글에서는 약간 다른 방향으로 접근해보려 한다. 전역변수처럼 쓰이는 싱글턴 싱글턴을 간단하게 정의하면 인스턴스가 한개만 존재해야 하는 상황을 모델링한 것이다. 이걸 C#에서는 생성자를 private으로 숨겨서 직접 생성할 수 없게 하고 대신 정적 인스턴스 프로퍼티를 만들어서 접근하는 식으로 구현하곤 한다. // 흔히 사용하는 제네릭 부모 클래스 형태의 싱글턴 public class Singleton where T : class { private static Sing..
Unity에서의 실제 FSM 구현에 대해 들어가며.. 흔히 게임에서 캐릭터를 조종한다던가 할 일이 있을 때 가장 먼저 배우는 것이 유한 상태 기계, FSM이다. FSM에 대해서는 이미 매우 잘 알려져 있고 양질의 정보도 쉽게 접할 수 있으므로 이 글에서 FSM에 대한 상세한 설명은 생략한다. 하지만 FSM이라는 개념에 너무 매몰되어 생각하는 경우 오버엔지니어링이 잔뜩 된 좋지 못한 코드를 쓰는 경우가 종종 있다. 특히 AI의 구현을 FSM으로 구현하려고 할 경우 그렇게 될 가능성이 큰데, 이 글에선 그에 대해 이야기한다. "게임에서의" FSM과 실제 구현에서의 문제 그런데 사실 컴퓨터과학에서 말하는 FSM과 실제로 게임에서 일반적으로 구현하는 FSM은 약간의 차이가 있다. 컴퓨터과학에서 이야기하는 FSM이 어떤 알고리즘을 수학적으로 표현하는 모..
Unity의 ScriptableObject의 활용법 ScriptableObject 유니티의 공식 문서(https://docs.unity3d.com/kr/current/Manual/class-ScriptableObject.html)에는 스크립터블 오브젝트를 다음과 같이 정의하고 있다. ScriptableObject는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너입니다. ScriptableObject의 주요 사용 사례 중 하나는 값의 사본이 생성되는 것을 방지하여 프로젝트의 메모리 사용을 줄이는 것입니다. 이는 연결된 MonoBehaviour 스크립트에 변경되지 않는 데이터를 저장하는 프리팹이 있는 프로젝트의 경우 유용합니다. 이리저리 꼬아놨지만, 결론적으로는 어떤 데이터를 에셋 형태로 저장하는 기능이다. 스크립터블 ..