카테고리 없음

김민찬 14주차 수업 후 과제

content9349 2025. 12. 3. 14:13

템플릿을 직접적으로 지원하는 언어

(“template”라는 이름을 공식적으로 사용)

  • C++ — 대표적으로 템플릿을 언어 차원에서 지원
  • D 언어(Dlang) — 템플릿 기반 메타프로그래밍 강력 지원
  • Rust — 제네릭 + 트레이트 기반이지만 C++ 템플릿과 유사한 메타프로그래밍 가능
  • Go(Go 1.18+) — 제네릭 도입, 템플릿과 유사한 기능 제공
  • Nim — 템플릿과 매크로 기능을 모두 제공
  • Zig — 컴시간(comptime) 기반 제네릭/템플릿 기능 제공
  • Haxe — 템플릿 메타프로그래밍 가능

제네릭을 중심으로 템플릿과 유사 기능을 제공하는 언어

(템플릿이라는 명칭을 쓰지 않더라도 사실상 동일한 목적을 수행)

  • Java — 제네릭 기반
  • C# / .NET 언어들 — 제네릭 기반
  • Swift — 제네릭 + 프로토콜 기반
  • Kotlin — 제네릭 기반
  • TypeScript — 제네릭 기반, 매우 강력한 타입 레벨 프로그래밍 지원
  • Scala — 제네릭 + 고급 타입 시스템
  • Haskell — 타입클래스 기반, 제네릭/템플릿보다 더 강력한 타입 기능
  • OCaml / F# — 파라메트릭 폴리모피즘 기반
  • Python(3.5+) — 타입 힌트 제네릭 지원
  • Ruby — 정식 제네릭은 없지만 템플릿 메서드 패턴 구현 가능
  • PHP(8.1+) — 제네릭 유사 기능 제공

템플릿 엔진을 통해 ‘코드 생성용 템플릿’을 지원하는 언어

(언어 자체의 템플릿 문법이 아닌 템플릿 엔진 기반)

  • C, Objective-C, JavaScript, Python, Java 등 대부분의 언어는
    Jinja2, Mustache, Handlebars, Mako 등 템플릿 엔진을 사용해 코드 생성 가능

============================================================================================

1. 제네릭 MonoBehaviour로 공통 기능 만들기

여러 타입에 공통 기능을 적용하고 싶을 때 제네릭 컴포넌트를 만들 수 있습니다.

예시: Singleton<T> 템플릿

 
using UnityEngine; public class Singleton<T> : MonoBehaviour where T : MonoBehaviour { private static T instance; public static T Instance { get { if (instance == null) instance = FindObjectOfType<T>(); return instance; } } }

사용 예

 
public class GameManager : Singleton<GameManager> { public int score; }

이렇게 하면 GameManager, AudioManager, UIManager 등 여러 매니저를 한 번의 템플릿 코드로 재사용할 수 있습니다.


2. 제네릭 컬렉션 또는 데이터 구조 사용

Unity에서 아이템 시스템, 풀링 시스템 등 확장성 있는 시스템을 만들 때 자주 사용됩니다.

예시: 제네릭 Object Pool 템플릿

 
using System.Collections.Generic; using UnityEngine; public class ObjectPool<T> where T : Component { private Queue<T> pool = new Queue<T>(); private T prefab; public ObjectPool(T prefab, int initialSize) { this.prefab = prefab; for(int i = 0; i < initialSize; i++) pool.Enqueue(Object.Instantiate(prefab)); } public T Get() { return pool.Count > 0 ? pool.Dequeue() : Object.Instantiate(prefab); } public void ReturnToPool(T obj) { pool.Enqueue(obj); } }

이 템플릿을 쓰면 어떤 오브젝트 타입이든 풀링 시스템에 적용 가능:

 
public class BulletPool : MonoBehaviour { public Bullet bulletPrefab; private ObjectPool<Bullet> pool; void Start() { pool = new ObjectPool<Bullet>(bulletPrefab, 20); } }

3. 제네릭 ScriptableObject 템플릿

ScriptableObject를 템플릿화하면 아이템, 스탯, 설정 등 다양한 데이터 타입을 유연하게 다룰 수 있습니다.

예시

 
public class DataContainer<T> : ScriptableObject { public T value; }

사용 예

  • DataContainer<int> → 플레이어 체력 수치
  • DataContainer<string> → 아이템 설명
  • DataContainer<Vector3> → 스폰 위치

4. 커스텀 에디터 + 제네릭으로 유연한 에디터 확장

UnityEditor 관련 코드를 제네릭으로 작성해 여러 타입의 인스펙터를 손쉽게 재사용할 수 있습니다.

 
using UnityEditor; public class BaseInspector<T> : Editor where T : UnityEngine.Object { protected T Target => (T)target; }

5. UnityEvent<T> 활용

UnityEvent도 템플릿 기반입니다.

 
[System.Serializable] public class FloatEvent : UnityEngine.Events.UnityEvent<float> { } public class Health : MonoBehaviour { public FloatEvent onDamage; public void TakeDamage(float amount) { onDamage.Invoke(amount); } }

여기서 UnityEvent<float>는 내부적으로 템플릿(제네릭) 구조를 사용합니다.


요약

Unity에서 템플릿(제네릭) 사용 예는 다음과 같습니다.

목적예
공통 로직 재사용 Singleton<T>, Manager 템플릿
데이터 관리 ScriptableObject<T>, DataContainer
풀링 시스템 ObjectPool<T>
에디터 확장 BaseInspector<T>
이벤트 UnityEvent<T>

 

시험 나옴
시험에 나음(어떤게 무슨의미 인지 알기) 특히 CCC부분
시험 나옴

 

vector <int> x; 이 부분 나옴 push back같은 것도 추가로 알면 좋음
시험에 나옴
시험에 나옴(double부분 굉장히 중요) 단계도 잘 알아놓기
시험 꼭 나옴
시험 나옴
이것도 알기
시험에 나옴 아래 코드도 참고
ofstream hout("test1.txt"); 파일을 만드는 방법 hout.close(); 파일 닫기
시험에 나옴 ifstream과 ofstream에 차이 잘 알기