Study 8

Unity에 싱글톤(Singleton) 패턴 적용하기

개요 싱글톤 패턴은 단일의 인스턴스를 보장하고 이에 대한 전역적인 접근점을 제공하는 패턴이다. 이 글에서는 싱글톤 패턴을 Unity에 어떻게 적용시키는지 살펴본다. 싱글톤 패턴에 대한 상세한 정보가 필요하다면 여기를 참고하라. Unity에서 싱글톤을 적용하는 방법은 MonoBehaviour를 상속 받아서 구현하는 방법과 상속 받지 않고 구현하는 방법으로 나뉜다. 후자는 일반 C#에서의 방법과 크게 다르지 않으므로 여기서는 전자 부분만 살펴보려 한다. 구현 우선 싱글톤 추상 클래스를 만들어 원하는 컴포넌트는 해당 클래스를 상속 받아 싱글톤으로 만드는 구조로 갈 것이다. 그럼 아래와 같이 작성할 수 있다. public class SingletonBehaviour : // Unity의 제어를 받기 위해 Mon..

Study/Unity 2022.07.17

Awake / OnEnable / Start의 차이

개요 초기화를 목적으로 제공되는 Unity 이벤트는 아래와 같이 3가지가 있다. Awake: 이 함수는 항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다. OnEnable: (오브젝트가 활성화된 경우에만): 오브젝트 활성화 직후 이 함수를 호출합니다. 레벨이 로드되거나 스크립트 컴포넌트를 포함한 게임 오브젝트가 인스턴스화될 때와 같이 MonoBehaviour를 생성할 때 이렇게 할 수 있습니다. Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다. 하지만, 이 3가지에 대해서 차이점을 모른다면 적절하게 초기화를 못할 수도 있다. 이 글에..

Study/Unity 2022.07.17

싱글톤 패턴(Singleton Pattern)

개요 싱글톤 패턴(Singleton Pattern)은 오직 한 개의 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공하는 패턴이다. 구조는 아래와 같다. 싱글톤이 되려고 하는 클래스는 Singleton 클래스를 상속 받으면 된다. 구현 구현 방법은 상황에 따라 달라질 수 있으므로 아래의 코드는 정답이 아니라 참고 정도로 여겨야 한다. 모던 C++ template class Singleton abstract { public: Singleton(const Singleton&) = delete; Singleton(Singleton&&) = delete; Singleton& operator=(const Singleton&) = delete; Singleton& operator=(Singleton&..

재귀(Recursion)

재귀 재귀(Recursion)는 함수가 자기 자신을 호출하는 것을 말한다. 재귀의 구조는 재귀를 중단시키는 기저 조건(Base Case)과 기저 조건으로 수렴하게 되는 재귀 조건(Recursive Case)으로 구성된다. 재귀를 사용하는 이유는 문제에 따라 전체를 한 번에 해결하기보다 같은 유형의 하위 작업으로 분할하여 작은 문제부터 해결하는 방법이 효율적*일 수 있기 때문이다. 다시 말해 복잡한 알고리즘을 단순하고 알기 쉽게 표현할 수 있다. 그뿐만 아니라 알고리즘 자체만으로는 얼마나 많은 단계를 깊이 들어가야 하는지 알 수 없을 때에도 사용할 수 있다. *이를 분할 정복법(Divide & Conquer)이라고 한다. 예시를 살펴보자. 어떤 디렉토리가 갖고 있는 모든 파일 및 디렉토리를 지우는 함수를 ..

Study/Algorithm 2022.07.05

가비지 컬렉션

개요 C++에서는 메모리를 프로그래머가 관리한다.* 즉, 동적 할당된 메모리를 전부 사용했다면 시스템에 돌려줘야 한다. 이 과정에서 여러가지 실수가 많이 발생하는 데 아래와 같다. * C++11부터 스마트 포인터 라이브러리가 추가되어 모던 C++에서는 명시적 해제보다는 스마트 포인터 사용을 권장하고 있다. 메모리 누수(Memory Leak) 메모리 사용이 끝났음에도 불구하고 해제하지 않은 것이다. 이중 해제(Double Free) 이미 해제가 된 메모리임에도 불구하고 또 해제하는 것이다. 이미 해제가 된 메모리를 가리키는 포인터를 댕글링 포인터(Dangling Pointer)라 한다. 섣부른 해제(Premature Free) 아직 사용이 끝나지 않았음에도 불구하고 해제하는 것이다. 이런 불편함을 해결하기..

Study/C# 2022.02.06

공용 타입 시스템

개요 .NET에서는 여러 .NET 언어를 지원하기 위해 공용 타입 시스템(CTS; Common Type System)을 지원한다. .NET의 모든 형식은 값 타입(Value Type) 혹은 참조 타입(Reference Type)으로 구분되며 모든 타입은 기본 타입인 System.Object에서 파생된다. C#에서는 아래와 같은 계층을 가지고 있다. 값 타입 C#에서 값 타입은 구조체 / 열거형 / 그 외에 기본 제공 타입으로 구성된다. 값 타입은 아래와 같은 특징을 갖는다. 구조체를 제외한 모든 타입은 System.ValueType에서 파생된다. 스택 메모리에 직접 값이 포함된다. 다시 말해 복사가 일어난다. 상속이 불가능하다. 구조체 멤버 중에 참조 타입이 있다면 메모리 주소가 복사된다.* * 얕은 복..

Study/C# 2022.02.06

C#에 대한 이해

개요 C#은 마이크로소프트에서 개발한 객체 지향 프로그래밍 언어다. C#은 강건하고 유지보수를 위한 여러 가지 기능을 제공하는데 메모리를 자동으로 정리해주는 가비지 컬렉션, 함수형 프로그래밍을 위한 람다 식, 비동기 프로그래밍 등이 있다. .NET 아키텍처 C#과 함께 빼놓을 수 없는 것이 .NET이다. 마이크로소프트는 어떤 플랫폼이던지 언어를 동작시킬 수 있도록 공용 언어 인프라(CLI; Common Language Infrastructure)라는 사양을 발표했는데, .NET은 이 사양에 맞춰 마이크로소프트가 구현한 프로그램인 공용 언어 런타임(CLR; Common Language Runtime)과 클래스 라이브러리 세트를 말한다. C#은 이러한 .NET 위에서 동작하는 프로그래밍 언어 중에 하나다.*..

Study/C# 2022.02.05

템플릿 메서드 패턴(Template Method Pattern)

개요 템플릿 메서드 패턴(Template Method Pattern)은 알고리즘의 뼈대를 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스에서 하는 패턴이다. 구조는 아래와 같다. 템플릿 메서드 패턴의 구조 TemplateMethod()에서 알고리즘의 뼈대를 정의하고 각 단계에서의 연산을 가상 함수로 만들어, 서브클래스에서 오버라이딩한다. 이 중 기본 행동을 제공하는 가상 함수를 훅 연산(Hook Operation)이라고 한다. 자주 사용되는 패턴이다. 특히 게임 엔진 사용할 때 Unity의 이벤트 함수 순서라던가 Unreal의 Actor 라이프 사이클 등이 그것이다. Unity나 Unreal은 이미 함수를 호출할 순서를 정의해놓고 우리가 사용할 때는 그것을 오버라이딩 하여 사용한다. using Un..