[멋쟁이사자처럼 부트캠프 TIL회고] Untiy 게임개발 3기 20일차
대락 10%정도 한 시점.. 더 많은 양을 공부할 필요를 느낀다.
저번 시간에 우선순위 Queue를 만들어봤는데 이는 자료구조 Tree에서 나온 것이다. (완전이진트리구조)
Tree는 다음 주에 배울 내용이지만 간단하게나마 알아보자.
자료구조
Tree
Tree
- 계층적 구조를 표현하기 위한 비선형(non-liner) 자료구조
- 노드와, 노드 사이의 연결을 나타내는 간선(Edge)로 구성
- 루트(Root) 노드에서 시작하여 하위 노드로 뻗어 나감, 계층 관계의 효율적 표현
종류
- 이진 트리 : 각 노드가 최대 두 개의 자식(완전 이진 트리, 포화 이진 트리)
- 이진 탐색 트리 : 왼쪽 자식이 부모보다 작고, 오른쪽 자식은 부모보다 큼
- 균형 트리 : 트리의 높이를 최소화하여 효율성 유지 (AVL, Red-Black 트리)
- Heap : 완전 이진 트리의 한 종류
장점
- 계층적 데이터 표현
- 빠른 탐색(이진 탐색 트리) : 시간복잡도 O(log n)
- 동적 크기
단점
- 구현 복잡성
- 균형이 아닐시, 시간 복잡도 증가
실제 사용
- 게임 오브젝트 계층 구조 : Hierarchy 창의 계층 구조
- UI 구성 및 레이아웃 관리 : Canvas 아래 요소를 계층적으로 배치
- AI 시스템에서의 활용 : Behavior Tree
- 파일 및 데이터 구조 관리
- 스킬 시스템 및 콤보 구현
LINQ
LINQ( Language - Integrated Query)
Query : 문의하다,질문하다/ 프로그래밍에서는 데이터베이스에 정보를 요청하는 일
데이터베이스에서, 원하는 조건의 데이터베이스를 가져오는 일
LINQ : C# 언어에서 쿼리 기능을 사용하는 것
특징
- 강력한 필터링, 정렬, 그룹화 기능
- 코드의 가독성과 유지보수성 향상
LINQ를 사용하려면 namespace에 다음을 추가해준다. (사용한 뒤 ALT + Enter로도 가능)
using System.Linq;
Query는 다양한 기능을 수행할 수 있다.
- 데이터 정렬 : OrderBy(Descending), Reverse
- 데이터 필터링 : where
- 프로젝션 작업 : Select
- 데이터 분할 : Skip,Take
- 데이터 형식 변환 : ToList, ToArray
- 집계 작업 : Aggregate,Average,Cont.Max,Min,Sum
참고 :https://learn.microsoft.com/ko-kr/dotnet/csharp/linq/get-started/introduction-to-linq-queries
LINQ 쿼리 소개 - C#
LINQ는 다양한 데이터 원본 및 형식의 데이터 쿼리에 대한 일관된 모델을 제공합니다. LINQ 쿼리에서는 항상 개체로 작업합니다.
learn.microsoft.com
Properties
Properties
- 속성이라는 의미
- 데이터 필드의 값을 읽거나 쓰거나 계산하는 유연한 메커니즘을 제공하는 멤버
- 클래스의 필드를 안전하게 읽거나 변경할 수 있는 방법을 제공하는 문
예를 들어 다음과 같은 코드가 있다.
public class Node<T>
{
public Node<T> Next { get; set; }
}
{get; set; } 이 프로퍼티를 정의하는데 사용.
get : 현재 Next 값을 읽을 수 있음
set : Next 값을 다른 노드로 변경할 수 있음
사용 예시를 들어보자면 ,
Node<int> node1 = new Node<int>();
Node<int> node2 = new Node<int>();
node1.Next = node2; // Setter 호출
Node<int> nextNode = node1.Next; // Getter 호출
배웠던 것처럼 간단하게 노드의 Next 값들을 변경해 주거나 (Setter), 읽을 수 있다(Getter).
get; 만 사용하거나, set;만 사용해서 읽기 전용, 쓰기 전용으로도 바꿀 수 있다.
이해의 편의를 위해서, 만일 프로퍼티를 쓰지 않았다면 위 코드는 다음과 같은 모습이다.
public class Node<T>
{
// private 필드
private Node<T> _next;
// Getter 메서드
public Node<T> GetNext()
{
return _next;
}
// Setter 메서드
public void SetNext(Node<T> next)
{
_next = next;
}
}
이렇게 긴 코드가 필요하며 사용도 다음과 같이 불편해진다.
Node<int> node1 = new Node<int>();
Node<int> node2 = new Node<int>();
node1.SetNext(node2); // Setter 호출
Node<int> nextNode = node1.GetNext(); // Getter 호출
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties
Properties - C#
A property in C# is a member that uses accessor methods to read, write, or compute the value of a private field as if it were a public data member.
learn.microsoft.com
Generic과 제약조건
Generic
Generic
- 여러 데이터 타입을 처리할 수 있는 코드를 작성하는 방법
- '같은 기능', '다른 타입' 일 시 사용
- 코드의 재사용성을 높이고, 안전한 타입 검사를 제공
public class 클래스명<T>
<T> 와 같은 방식으로 사용함, T는 타입 매개변수로써, 어떤 타입인지는 추후에 지정된다는 의미
Generic이 없다면, 같은 기능을 하는 클래스들을 타입별로 만들어야 함 (비효율적)
제약조건(Constranint)
Constranint
- 제네릭 타입 매개변수(T)가 특정 요구 사항을 만족하도록 제한하는 도구
- 제네릭은 모든 타입을 허용하지만, 특정 작업에 모든 타입이 적합한 것은 아니기 때문에 사용
사용 이유
- 코드 안정성과 예측 가능성 확보
- 타입이 제공해야 하는 기능 보장
- 버그 방지
- 효율적 설계
예를 들어, 우리가 구현한 우선순위 큐를 구현할 때에, 우선순위를 정해야 하기 때문에 비교가 가능해야 했다.
그런데 제약조건을 사용하지 않고 진행했다면 런타임 오류가 발생할 수 있었다.
이를 미연에 방지하고자, 제약조건을 추가해 컴파일러가 사전에 차단하도록 한다.
(where T : ICmparable<T>)
객체 생성 안정성을 추가하려면 >where T : new(), 생성자가 있는 타입을 사용해야 한다는 뜻
값 타입이나, 참조 타입을 구분
특정 동작 방지
이러한 제약조건들은, 데이터 검색의 효율성을 직접적으로는 개선하지 않지만 간접적으로는 관련이 있을 수 있다.
형식 매개 변수에 대한 제약 조건 - C#
형식 매개 변수에 대한 제약 조건을 알아봅니다. 제약 조건은 형식 인수에 포함되어야 하는 기능을 컴파일러에 알립니다.
learn.microsoft.com