TIL

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

Cadi 2024. 12. 10. 01:18

오늘은 코테 풀어보면서 모르는 함수라던지, 헷갈리는 기능들에 대해 알아보고, 컴퓨터적 사고를 해봐야지ㅣ..

 

 

람다 식

람다 식

  • "이름 없는 함수", 쉽게 말해 한 줄짜리 함수, 즉 한 번 쓰고 말 함수를 간단하게 표현한 것
  • 간결하고 가독성이 높은 코드 작성
  • 메모리 사용의 효율성
(parameters) => expression


parameters : 함수에 들어오는 값(인자)들을 적음

=>               : 람다 연산자, "이 값을 받아서 이렇게 계산한다

expression  : 수행할 작업이나 반환할 값

 

예시

우리가 지금까지 배운 내용으로 a,b를 인자로 받고, a + b로 작동하는 함수를 작성

int Add( int a, int b)
{
   return a+b;
}

 

만일 이를 람다식으로 표현한다면

(a,b) => a + b

 

우리가 배웠던 린큐와 함께 같이 많이 사용한다.

 

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/lambda-expressions

 

람다 식 - 람다 식 및 무명 함수 - C# reference

익명 함수 및 식 본문 멤버를 만드는 데 사용되는 C# 람다 식입니다.

learn.microsoft.com

 

자주 쓰는 린큐 기능

  1. Where : 조건에 맞는 데이터 필터링
  2. Select : 각 항목을 다른 형태로 변환
  3. Orderby : 오름차순 정렬
  4. OrderbyDescending : 내림차순 정렬
  5. GroupBy : 데이터를 그룹화
  6. First/FirstOrDefault : 첫 번째 항목 가져오기( 없으면 기본값 반환)
  7. Last/LastORDefault : 마지막 항목 가져오기(없으면 기본값 반환)
  8. All : 모든 항목이 조건을 만족하는지 확인(True/False)
  9. Any : 하나라도 조건을 만족하는지 확인(True/False)
  10. Sum/Count/Averag : 데이터 집계
  11. Distinct : 중복 제거
  12. Reverse : 데이터 순서 뒤집기

등이 있다. 더 많을테지만 일단 이것만 알아두고 차차 배우면서 추가하도록 해야겠다.

 

이렇게 린큐와 람다를 이용하면 데이터를 상당히 쉽게 검색하고, 조작해서 사용할 수 있다.

예를 들어 나는 배열에서 짝수, 홀수의 갯수를 구하는 문제를 다음과 같이 풀었다.

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int[] num_list)
    {
        int even = 0;
        int odd = 0;
        foreach (int num in num_list)
        {
            if (num == 0 || num%2 ==0)
            {
                even++;
            }
            
            else if (num % 2 == 1)
            {
                odd++;
            }
        }
        int[] answer = new int[2] {even, odd};
return answer;
            
    }
}

하지만 린큐를 이용한다면 ?

using System;
using System.Linq;

public class Solution {
    public int[] solution(int[] num_list) {
        int[] answer = new int[2] { num_list.Count(x => x % 2 == 0), num_list.Count(x => x % 2 == 1) };

        return answer;
    }
}

간단하게 풀 수 있다. 

 

코딩 테스트 입문 문제들을 풀어보면서 최대한, 린큐와 람다를 사용해서 풀어봐야겠다.

사실 대리자 라던가 공부를 하게 되면서 뭔가 더 배워야겠다 ! 생각이 든 키워드들이 많지만, 당장 쓰일게 아니면 일단 

'게임 개발'이라는 목표에 지금 바로 필요한 것들에 우선 집중하고, 수업 진도를 쉽게 따라갈 수 있을 정도가 되었을 때

다른 기초들을 하나씩 쌓아 올려야겠다.

 

추가 : 

처음으로 다른 추가 자료(GPT, Microsoft learn, 블로그 등) 안보고 혼자 푼 린큐 & 람다 문제. 간단하지만 어제의 나였다면 이제 반복문 써가면서 하나하나 검사했겠지.

 

오버로드(Overload) 와 오버라이딩(Overriding)

Overlaod

  • 하나의 이름을 가진 함수(메서드)가 다른 파라미터를 가지고 동시에 존재하는 것
  • 다른 기능을 가진 함수들을 같은 이름으로 묶으면 구분이 힘드므로 비슷한 기능들에서 인자들만 다르게 사용

 

Overriding

  • 부모 클래스에서 정의한 메서드(기능)을 자식 클래스에서 '재정의' 하는 것
  • 기본 동작을 그대로 사용하지 않고, 자식 클래스가 필요에 맞게 바꾸는 것
  • 부모 클래스의 메서드에서는 재정의 가능하도록 virtual 키워드,
    자식 클래스에서 부모 메서드를 재정의 할 때는 override 키워드를 사용

Overriding의 사용 이유

  • 부모 클래스의 공통된 인터페이스를 통해 다양한 동작 처리
  • 유지보수성과 재사용성(공통 코드, 필요 부분 수정)
  • 예외적인 동작 처리 ( 특정 조건에서만 다르게 동작)

In Unity

 사실은 우리가 Start(), Update() 메서드에 기능을 작성하는 것도 오버라이딩이다.

원래는 MonoBehaviour 클래스에는 비어 있는, 재정의할 준비가 된 가상 메서드인 Start(),Update()를 제공한다.

그 안에 우리가 원하는 기능을 집어넣음으로써 오버라이딩 하는 것. 

찾아보려 하였으나 .. 네이티브 클래스라서 인터페이스만 볼 수 있다고 함.

 

혹은 캐릭터라는 기본 클래스에 전직같은 특정 조건 등을 넣을 때도 오버라이딩을 사용하기도 함.

 

 

 

 

https://www.youtube.com/watch?v=GaAP8VJwP_k&list=PLNKlzpnLyknqNmHnzZIJYyD08SUT_ErjZ&index=15

 

 

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/override

 

override 한정자 - C# reference

override 한정자 - C# 참조

learn.microsoft.com

 

 

값 타입과 참조 타입

값 타입(Value Type)

  • 저장 장소 : 값 타입은 데이터를 일반적으로 Stack 메모리에 직접 저장
                                                      (값 타입이 참조 타입 객체의 필드로 포함될 경우, 그 값은 힙에 저장)
  • 저장 방식 : 변수를 할당할 때 해당 변수에 데이터의 실제 값 저장
  • 해당 타입 : int, double, char, struct, enum 등
  • 다른 변수에 값 할당 시, 복사본 생산해 별도의 메모리 공간에 저장(원본과 복사본은 독립적)
  • 메소드에 매개변수로 전달될 때도 값이 복사되어 전달됨.
int a = 5;
int b = a; // 값 복사

b = 10;    // b만 변경
Console.WriteLine(a); // 출력: 5
Console.WriteLine(b); // 출력: 10

참조 타입(Reference Type)

  • 저장 장소: 데이터를 Heap 메모리에 저장함(스택에는 해당 데이터를 참조하는 주소(참조)를 저장)
  • 저장 방식: 변수에 데이터가 저장된 힙의 주소(참조)가 저장
  • 해당 타입: class, array, delegate, interface
  • 다른 변수에 할당 시, 힙 메모리 주소의 참조가 복사됨, 따라서 두 변수는 같은 객체를 참조하게 됨.
  • 메소드에 매개변수로 전달 시, 힙에 있는 데이터의 주소인 참조가 전달(복사)됨. 참조를 통해 힙의 데이터에 직접 접근하게 되므로  메소드 내에서 객체의 상태가 변경된다면 원본 객체에도 영향이 감
int[] array1 = { 1, 2, 3 };
int[] array2 = array1; // 참조 복사

array2[0] = 10; // array2를 수정하면 array1도 변경됨
Console.WriteLine(array1[0]); // 출력: 10
Console.WriteLine(array2[0]); // 출력: 10

 

 

 

구조체(Struct)

Struct

  • 값 타입(Value Type)으로 동작하는 사용자 정의 데이터 타입
  • 필드(변수)와 메서드(기능)을 그룹으로 묶어서 정의 가능
  • Class와 비슷한 점도 많지만, 메모리 동작 방식과 용도에서 중요한 차이
  • 가볍고 작은 데이터에 적합하며 상속이 불가능하다.

Unity에서의 활용

  • Stack에 저장되고, 할당과 해제가 빠르다.
  • 따라서 Vector3, Quaternion, Color 같은 데이터는 작은 수학적 정보를 저장하기 위해 구조체로 설계

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/struct

 

구조체 형식 - C# reference

C#의 구조체 형식에 관한 자세한 정보

learn.microsoft.com

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/language-specification/structs

 

구조체 - C# language specification

이 장에서는 구조체 선언을 정의합니다. 대부분의 경우 설명은 클래스와 구조체 간의 차이를 사용하여 정의됩니다.

learn.microsoft.com

 

더 알아봐야 할 것 : static , 후위 계산법, 탐색 관련 기능