[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임개발 3기 21일차
오늘은 코테 풀어보면서 모르는 함수라던지, 헷갈리는 기능들에 대해 알아보고, 컴퓨터적 사고를 해봐야지ㅣ..
람다 식
람다 식
- "이름 없는 함수", 쉽게 말해 한 줄짜리 함수, 즉 한 번 쓰고 말 함수를 간단하게 표현한 것
- 간결하고 가독성이 높은 코드 작성
- 메모리 사용의 효율성
(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
자주 쓰는 린큐 기능
- Where : 조건에 맞는 데이터 필터링
- Select : 각 항목을 다른 형태로 변환
- Orderby : 오름차순 정렬
- OrderbyDescending : 내림차순 정렬
- GroupBy : 데이터를 그룹화
- First/FirstOrDefault : 첫 번째 항목 가져오기( 없으면 기본값 반환)
- Last/LastORDefault : 마지막 항목 가져오기(없으면 기본값 반환)
- All : 모든 항목이 조건을 만족하는지 확인(True/False)
- Any : 하나라도 조건을 만족하는지 확인(True/False)
- Sum/Count/Averag : 데이터 집계
- Distinct : 중복 제거
- 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 , 후위 계산법, 탐색 관련 기능