KDT Unity 2주차~4주차 - 개인학습2
해당 내용의 전부는 학원에서 배우는 것이기 때문에 공개가 어렵습니다.
해당 내용의 자세한 강의가 필요하신 분들은 이곳에서 확인하시면 됩니다.
2023-11-07 TIL
알고리즘 문제
오늘의 알고리즘 문제 : x만큼 간격이 있는 n개의 숫자
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
x는 -10000000 이상, 10000000 이하인 정수입니다.
n은 1000 이하인 자연수입니다.
1
2
3
4
5
6
public class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[] {};
return answer;
}
}
해결
처음에는 굉장히 간단한 문제였다.
음 그냥 for문 돌리면 되는거 아닌가? 하면서 for문을 돌려서 테스트도 무난하게 통과하였고 제출을 했는데 몇개가 오류가 나오고 말았다.
1
2
3
4
5
6
7
8
9
10
public class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
for (int i = 0; i<n;i++)
{
answer[i] = x * (i+1);
}
return answer;
}
}
왜그런가… 했더니 아차 오버플로우…!! int 값은 대략 -2,147,483,648부터 2,147,483,647까지의 값을 표현할수 있는데 반해 해당 문제는 최대 10,000,000,000까지 나올수 있는 것이였습니다.
그래서 answer[i] = x * (i+1); 코드를 answer[i] = (long)x * (i+1);이렇게 바꾸니까 해결되었습니다.
1
2
3
4
5
6
7
8
9
10
public class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
for (int i = 0; i<n;i++)
{
answer[i] = (long)x * (i+1);
}
return answer;
}
}
델리게이트, 람다
조금 어려운 내용이 있어 정리하려고 합니다.
델리게이트- 델리게이트란 메서드를 참조하는 타입.
- 함수 포인터라는 용어를 사용하기도 하지만 같은 것은 아니다.
- 메서드를 매개변수로 전달하거나 변수에 할당 할수 있다.
- 하나 또는 하나 이상의 메서드를 등록할 수 있다.
- 델리 게이트에 메서드를 등록할 시에는 델리게이트와 같은 매개변수를 받는 메서드만 등록할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
delegate void MyDelegate(string message);
static void Method1(string message)
{
Console.WriteLine("Method1: " + message);
}
static void Method2(string message)
{
Console.WriteLine("Method2: " + message);
}
class Program
{
static void Main()
{
// 델리게이트 인스턴스 생성 및 메서드 등록
MyDelegate myDelegate = Method1;
myDelegate += Method2;
// 델리게이트 호출
myDelegate("Hello!");
Console.ReadKey();
}
}
람다- 익명의 메서드를 만드는 방법이다.
- 메서드의 이름 없이 사용할수 있다.
델리게이트= (매개변수)=>함수 구동식으로 이해하면 편하다- 델리게이트에는 마찬가지로 하나 이상의 람다를 할당할수 있다.
JS를 배웠을 때 한 애로우 평션과 비슷한 맥락으로 이해하니 편하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
// 델리게이트 선언
delegate void MyDelegate(string message);
class Program
{
static void Main()
{
// 델리게이트 인스턴스 생성 및 람다식 할당
// JS를 배웠다면 애로우 평션이 바로 생각날 것이다.
MyDelegate myDelegate = (message) =>
{
Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
};
// 델리게이트 호출
myDelegate("안녕하세요!");
Console.ReadKey();
}
}
Func, Action
델리게이트를 대체하는 미리 정의된 제네릭 형식
Func- 값을 반환하는 메서드를 나타내는 델리게이트
- 마지막 파라미터의 값은 반환 값을 나타낸다.
1
2
3
4
5
6
7
8
9
10
11
// Func를 사용하여 두 개의 정수를 더하는 메서드
int Add(int x, int y)
{
return x + y;
}
// Func를 이용한 메서드 호출
// 마지막 int 값은 반환값이다.
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);
Action- 반환 값이 없는 메서드를 나타내는 델리게이트
- 매개변수를 받지만 반환 값은 없다.
1
2
3
4
5
6
7
8
9
// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
Console.WriteLine(message);
}
// Action을 이용한 메서드 호출
Action<string> printAction = PrintMessage;
printAction("Hello, World!");
Func 및 Action은 제네릭 형식으로 미리 정의되어 있어 매개변수와 반환 타입을 간결하게 표현할 수 있습니다.
오늘의 정리
항상 값의 크기와 변환되는 값을 잘 생각하고 확인해보는 습관이 필요한 것 같다.
작은 수들은 가능하더라도 어느순간 큰수가 나오게 되면 그때부터 큰 오류를 낼 가능성이 크기때문이다.
사용자들은 개발자의 의도대로 움직이지 않는다는 것을 항상 명심해야하며 그에 따른 오류 통제 능력이 확실해야한다.
자바와 같은 객체지향이지만 조금은 다른 점이 이제는 많이 보이기 시작했다.
비슷한 맥락이지만 항상 겸손한 마음으로 계속 배우려는 습관을 들여야겠다.
또한 정적인 웹개발과는 달리 사용자와의 상호작용과 그에 따른 직각적인 피드백이 중요한 게임 개발인 만큼 더더욱 깊고 더 넓게 배워야 할거같다.
