"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

2025/03 9

클래스 관계의 종류와 객체지향 설계에서의 활용

.1. 클래스 관계의 주요 유형클래스 간의 관계는 크게 **연관(Association), 집합(Aggregation), 합성(Composition), 의존(Dependency), 상속(Inheritance), 구현(Implementation)**으로 나뉜다.이제 각 관계를 상세히 살펴보자.(1) 연관 관계 (Association)연관 관계는 한 클래스가 다른 클래스를 참조하는 가장 일반적인 관계이다.양방향 또는 단방향 연관이 가능하다.클래스 간 독립성이 유지되며, 필요할 때 참조할 수 있다.예제: 플레이어와 무기 관계public class Player{ public Weapon weapon; // Player가 Weapon을 참조 (단방향 연관)}public class Weapon{ publi..

상태 패턴과 전략 패턴의 고찰

1. 원리와 역할 비교상태 패턴(State Pattern)과 전략 패턴(Strategy Pattern)은 모두 객체의 행동을 변경하는 데 사용되지만, 그 동작 방식과 역할이 다르다. 상태 패턴은 객체의 내부 상태에 따라 행동이 변경되도록 설계된 패턴이며, 전략 패턴은 실행할 알고리즘을 동적으로 교체할 수 있도록 설계된 패턴이다.상태 패턴(State Pattern)상태 패턴은 객체가 여러 상태를 가질 때, 상태에 따라 행동을 달리하는 구조를 제공한다. 객체는 현재 상태를 관리하며, 상태 변경이 필요할 때 적절한 상태 객체로 교체된다. 이 패턴의 핵심은 상태 전환을 객체 내부에서 처리하도록 설계하여, 컨트롤 플로우를 분리하는 것이다.핵심 원리: 객체가 상태를 캡슐화하여, 상태 전환과 관련된 로직을 내부에서 ..

C#] ReactiveProperty 및 ReactiveCollections 구현

Observer 패턴을 활용한 리액티브 프로퍼티 및 컬렉션은 데이터의 변화를 감지하고 이를 구독자에게 알리는 역할을 한다. 이를 통해 UI나 데이터 로직이 변화에 반응하도록 설계할 수 있으며, 특히 VIPER 패턴의 Interactor와 잘 어울리는 구조를 형성할 수 있다. 이번 글에서는 C#을 기반으로 구현한 ReactiveProperty, ReactiveList, ReactiveDictionary, ReactiveArray 클래스에 대해 설명한다.1. 리액티브 프로퍼티ReactiveProperty는 단일 값의 변경을 감지하고 이를 구독자에게 전달하는 역할을 한다. 내부적으로 onChanged 델리게이트를 사용하여 값이 변경될 때만 이벤트를 발생시키도록 설계되었다.public class Reactive..

C#,유니티] 제네릭과 상속을 함께 사용하는 방법

제네릭과 상속은 개별적으로 강력한 기능을 제공하지만, 함께 사용할 때는 몇 가지 제약이 따른다.제네릭은 컴파일 시점에 특정 타입으로 확정(Instantiation)되기 때문에, 서로 다른 제네릭 타입 간에는 상속 관계가 성립하지 않는다.예를 들어, Base와 Base은 전혀 다른 타입으로 간주되므로, 이를 공통적으로 다루는 것이 어렵다.이러한 한계를 극복하기 위해 비제네릭 부모 클래스를 활용하는 방법과 인터페이스를 활용하는 방법이 있다.각 방법의 장단점을 분석하고, 최적의 해결책을 찾아본다.1. 비제네릭 부모 클래스를 활용하는 방법비제네릭 부모 클래스를 사용하면 제네릭 클래스의 타입과 관계없이 공통적인 기능을 제공할 수 있으며, 런타임에서 다형성을 유지할 수 있다.이를 활용하면 제네릭 타입을 직접 사용하..

C#] 자식 클래스인지 판별하고 사용하는 방법들

부모 클래스로 선언된 객체가 실제로 어떤 자식 클래스인지 판별하고, 자식 클래스의 기능을 활용하는 방법에는 여러 가지가 있다. 이 글에서는 대표적인 방법인 is 연산자, as 연산자, 명시적 캐스팅, switch 패턴 매칭, 제네릭을 활용한 변환 방법을 소개한다.1. is 연산자를 사용한 판별 후 캐스팅is 연산자를 사용하면 객체가 특정 자식 클래스인지 확인할 수 있으며, 이를 통해 자동으로 캐스팅이 가능하다.public class Parent { }public class ChildA : Parent { public void SpecialMethodA() => Debug.Log("ChildA 실행!"); }public class ChildB : Parent { public void SpecialMetho..

유니티] Attribute [RequireComponent(typeof())] 개요 및 활용법

Attribute [RequireComponent(typeof())]  개요 및 활용법1. [RequireComponent(typeof())]란?[RequireComponent]는 Unity의 C# 어트리뷰트(Attribute) 중 하나로, 특정 컴포넌트가 필수적으로 존재해야 함을 보장하는 기능을 한다.이를 스크립트에서 선언하면, 해당 컴포넌트를 포함한 게임 오브젝트에 자동으로 지정된 컴포넌트가 추가된다.2. 동작 원리[RequireComponent]는 Unity Editor에서만 동작하며, 런타임 시점이 아니라 스크립트를 추가하는 순간 특정 컴포넌트를 자동으로 추가한다.[RequireComponent]가 적용된 스크립트를 GameObject에 추가하면, 지정된 컴포넌트가 자동으로 함께 추가되므로 수동으..

유니티] ScriptableObject 알아보기

1. ScriptableObject란?ScriptableObject는 Unity에서 제공하는 데이터 컨테이너 클래스이다. MonoBehaviour와 달리 GameObject에 부착할 필요 없이 독립적으로 존재하며, 프로젝트 에셋으로 저장될 수 있다. 이를 통해 런타임 메모리 할당을 줄이고, 데이터 중심의 구조를 효율적으로 설계할 수 있다.2. ScriptableObject의 특징데이터 저장: 게임 데이터를 프로젝트 에셋으로 저장할 수 있다.메모리 효율성: MonoBehaviour와 달리 런타임에서 불필요한 객체 생성 없이 활용 가능하다.직렬화 가능: Unity의 직렬화 시스템과 연계되어 Inspector에서 편집 가능하다.객체 공유: 여러 게임 오브젝트에서 동일한 ScriptableObject 인스턴스를..

식(Expression)과 문(Statement)의 개념과 차이점

프로그래밍에서 식(Expression) 과 문(Statement) 은 코드의 기본적인 구성 요소이다. 이 둘은 종종 혼동되지만, 역할과 특징이 다르다.식(Expression)값을 생성하는 코드 조각반드시 값(결과)을 반환해야 하며, 변수에 저장할 수 있다.연산(2 + 3), 변수(x * 5), 함수 호출(GetValue()) 등 값이 되는 코드들이 식이다.예제: int a = 5 + 3;, bool check = a > 2;, string text = "Hello" + "World";5 + 3은 값 8을 생성하므로 식 이다.a > 2는 true 또는 false를 반환하므로 식 이다.함수 호출 GetValue()가 값을 반환하면 식 이다.문(Statement)어떤 동작을 수행하는 코드 조각값이 아니라 실행..

Async와 Coroutine 비교: 컨트롤 플로우 관점에서의 평가

유니티에서 비동기 작업을 수행하는 방식에는 크게 두 가지가 있다:코루틴(Coroutine) (IEnumerator, yield return)Async/Await (async Task, await)이 두 방식은 모두 프레임을 차단하지 않고(Non-blocking) 비동기 작업을 수행하는데, 컨트롤 플로우(제어 흐름) 관점에서는 각각 장점과 단점이 다르다.1. 컨트롤 플로우 차이점 개요비교 요소Coroutine (yield return)Async/Await (await)흐름 구조프레임 기반 (프레임과 연계)스레드 기반 (진행 시점 자유로움)실행 컨텍스트메인 스레드에서 실행 (Unity API 사용 가능)별도 스레드에서 실행 가능 (Unity API 사용하려면 MainThreadDispatcher 필요)비동기..