TIL

[멋쟁이사자처럼 부트캠프 TIL회고] Untiy 게임개발 3기 20일차

Cadi 2024. 12. 9. 10:53

 대락 10%정도 한 시점.. 더 많은 양을 공부할 필요를 느낀다.

 

 저번 시간에 우선순위 Queue를 만들어봤는데 이는 자료구조 Tree에서 나온 것이다. (완전이진트리구조)

Tree는 다음 주에 배울 내용이지만 간단하게나마 알아보자. 

 

 

자료구조

Tree

Tree

  • 계층적 구조를 표현하기 위한 비선형(non-liner) 자료구조
  • 노드와, 노드 사이의 연결을 나타내는 간선(Edge)로 구성
  • 루트(Root) 노드에서 시작하여 하위 노드로 뻗어 나감, 계층 관계의 효율적 표현

종류

  1. 이진 트리 : 각 노드가 최대 두 개의 자식(완전 이진 트리, 포화 이진 트리)
  2. 이진 탐색 트리 : 왼쪽 자식이 부모보다 작고, 오른쪽 자식은 부모보다 큼
  3. 균형 트리 : 트리의 높이를 최소화하여 효율성 유지 (AVL, Red-Black 트리)
  4. Heap : 완전 이진 트리의 한 종류

장점

  • 계층적 데이터 표현
  • 빠른 탐색(이진 탐색 트리) : 시간복잡도 O(log n)
  • 동적 크기 

단점

  • 구현 복잡성
  • 균형이 아닐시, 시간 복잡도 증가

실제 사용

  1. 게임 오브젝트 계층 구조 : Hierarchy 창의 계층 구조
  2. UI 구성 및 레이아웃 관리 : Canvas 아래 요소를 계층적으로 배치
  3. AI 시스템에서의 활용 : Behavior Tree
  4. 파일 및 데이터 구조 관리
  5. 스킬 시스템 및 콤보 구현

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(), 생성자가 있는 타입을 사용해야 한다는 뜻

값 타입이나, 참조 타입을 구분

특정 동작 방지

 

이러한 제약조건들은, 데이터 검색의 효율성을 직접적으로는 개선하지 않지만 간접적으로는 관련이 있을 수 있다.

 

 


https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

 

형식 매개 변수에 대한 제약 조건 - C#

형식 매개 변수에 대한 제약 조건을 알아봅니다. 제약 조건은 형식 인수에 포함되어야 하는 기능을 컴파일러에 알립니다.

learn.microsoft.com