[ 목차 ]
오늘은 배열에 관련해서 많이 나올 것이니..
배열은 꼭! 기본적으로 익혀두고 시작하는 것이 좋다.
한 번으로 복습은 안 된다!!
(나에게 하는 말)
파이팅하면서 시작!
1. 데이터 정렬과 검색
OrderBy() 메서드를 사용해 순차적으로 배열한 것을 알파벳 순서로 정리한다.
기준은 n으로 된다.
n.StartsWith("A") 조건을 사용해
문자열 A로 시작하는지 검사 후 출력한다.
//OrderBy 순차적 정렬
string[] names = { "Charlie", "Alice", "Bob" };
var sortedNames = names.OrderBy(n => n);
//람다식 아래의 코드를 축약한 것을 n => n
//int Identity(int n){ return n; }
foreach (var name in sortedNames)
{
Console.WriteLine(name);
}
//A로 시작하는 첫번째 문자열을 찾는 코드
var firstName = names.First(n => n.StartsWith("A"));
Console.WriteLine($"First name starting with A: {firstName}");
2. Meshod(메서드) 구문, Query(쿼리) 구문
메서드 구문은
OrderBy라는 LINQ 메서드를 사용해 배열을 정렬한다.
오름차순으로 정렬하며, foreach 루프에서 호출한다.
쿼리 구문은
배열의 각 요소를 n 변수로 다룬다.
orderby를 통해 오름차순으로 정렬하고
select를 통해 최종 결과를 생성한다.
//메서드구문, 쿼리 구문
int[] nums = { 5, 3, 8, 1 };
//메서드 구문
var sortedMeshod = nums.OrderBy(n => n);
//쿼리 구문
var sortedQuery = from n in nums
orderby n
select n;
Console.WriteLine("Meshod syntax: ");
foreach (var n in sortedMeshod)
Console.WriteLine(n);
Console.WriteLine("Query syntax: ");
foreach (var n in sortedQuery)
{
Console.WriteLine(n);
}
반대로 큰 것부터 정렬
//메서드 구문
var sortedMeshod = nums.OrderByDescending(n => n);
3. select
select는 조건에 따라서 각 요소를 새로운 형태(컬렉션)로 변환한다.
람다식으로 해당 단어의 길이를 반환한다.
foreach 루프를 사용하여 길이를 출력한다.
//Select()로 길이 추출
//select 개념 : 조건에 따라서 각 요소를 새로운 형태(컬렉션)로 변환
string[] words = { "apple", "banana", "cherry" };
var lengths = words.Select(w => w.Length);
foreach(var length in lengths)
{
Console.WriteLine(length);
}
대문자로 변환
ToUpper() 메서드를 통해 대문자로 변환한다.
//대문자로 변환
string[] words = { "apple", "banana", "cherry" };
var upperWords = words.Select(w => w.ToUpper());
foreach(var word in upperWords)
{
Console.WriteLine(word);
}
4. 알고리즘
(1) sum
배열의 현재 요소를 d에 대입해 sum에 배열 전체의 합이 저장될 때까지 반복된다.
//sum 알고리즘
int[] data = { 1, 2, 3, 4, 5 };
int sum = 0;
foreach (var d in data)
sum += d;
Console.WriteLine($"Sum: {sum}");
(2) count
data.Length를 통해 배열의 개수를 반환한다.
//count 알고리즘
int[] data = { 1, 2, 3, 4, 5 };
int count = data.Length; //개수
Console.WriteLine($"Count: {count}");
(3) 평균
Average() 메서드를 통해 평균을 구한다.
float[] data = { 80, 75, 71 };
double avg = data.Average();
Console.WriteLine($"Average: {avg}");
(4) max (최댓값)
Max() 메서드를 통해 최댓값을 구한다.
//MAX 알고리즘
int[] data = { 10, 3, 5, 2, 8 };
int max = data.Max();
Console.WriteLine($"Max: {max}");
(5) Min (최솟값)
Min() 메서드를 통해 최솟값을 구한다.
//Min 알고리즘
int[] data = { 10, 3, 5, 2, 8 };
int min = data.Min();
Console.WriteLine($"Min : {min}");
(6) NEAR (근삿값)
근삿값은 특정 값에 가장 가까운 값을 찾는 것이다.
data 배열을 선언한 후, 기준 값을 정한다.
data[0]을 통해 기준값을 배열 첫 번째 숫자로 잡는다.
Math.Abs(d - target)
현재 요소 'd'와 목표값 'target' 간의 차이를 절댓값으로 반환한다.
Math.Abs(nearest - target)
현재 저장된 가장 가까운 값과 목표 값 간의 절댓값 차이를 반환한다.
그렇게 {target}은 22가 되고, {nearest}은 25가 되어서
근삿값은 25이다.
//NEAR 알고리즘 (근삿값)
//특정 값에 가장 가까운 값을 찾는 것
int[] data = { 10, 12, 20, 25, 30 };
int target = 22;
int nearest = data[0];
foreach(var d in data)
{
if (Math.Abs(d - target) < Math.Abs(nearest - target))
nearest = d; //Math.Abs = 절댓값으로 변환 ( 마이너스도 양수로 만들어줌 )
}
Console.WriteLine($"Nearest to {target}: {nearest}");
(7) RANK (순위)
배열을 선언하고,
반복문을 통해 scores[ j ]가 scores[ i ]보다 크면 현재 점수보다 높은 점수이므로
rank 1을 증가시킨다.
이 과정을 통해 현재 점수보다 높은 점수의 개수를 계산한다.
최종적으로 해당 순위와 스코어를 출력해준다.
//RANK 알고리즘 (순위)
//각 요소가 몇 번째로 큰지 순위 매기기
int[] scores = { 90, 70, 50, 70, 40 };
for(int i = 0; i<scores.Length; i++)
{
int rank = 1;
for(int j = 0; j<scores.Length; j++)
{
if (scores[j] > scores[i])
rank++;
}
Console.WriteLine($"Score: {scores[i]}, Rank: {rank}");
}
(8) SORT (순서대로 나열)
Sort 메서드를 활용해 오름차순으로 정렬할 수 있다.
//SORT 알고리즘 (순서대로 나열)
int[] data = { 5, 2, 8, 1, 9 };
Array.Sort(data);
foreach (var d in data)
{
Console.WriteLine(d);
}
(9) SEARCH (특정 값 검색)
검색할 특정 값을 target 변수로 선언하고,
index 변수는 검색 결과를 저장해 초기값은 -1으로 설정한다.
for 루프를 통해 배열 요소를 반복한다.
조건문을 통해 data[i] 가 target과 동일한지 찾는다.
찾은 경우 index에 저장하고 반복문을 종료해 출력한다.
//SEARCH 알고리즘 (특정 값 검색)
int[] data = { 5, 2, 8, 1, 9 };
int target = 8;
int index = -1;
for(int i = 0; i<data.Length; i++)
{
if (data[i] == target)
{
index = i;
break;
}
}
Console.WriteLine(index >= 0 ? $"Found at index {index}" : "Not Found");
(10) GROUP (특정 기준으로 그룹화)
GroupBy() 메서드를 사용하여, f[0]은 각 배열의 첫 글자로 그룹화할 것이다.
예를 들면 apple 의 'a'를 기준으로 그룹화를 한다는 것이다.
foreach를 통해
각 그룹의 Key 출력하고, 해당 그룹에 속한 모든 요소를 출력한다.
//GROUP 알고리즘 (특정 기준으로 그룹화)
string[] fruits = { "apple", "banana", "blueberry", "cherry", "apricot" };
//LINQ의 GroupBy()를 사용
var groups = fruits.GroupBy(f => f[0]); //첫 글자로 그룹화
foreach(var group in groups)
{
Console.WriteLine($"Key: {group.Key}"); //Key: a Key: b Key: c
//해당 그룹에 속한 모든 요소 출력
foreach(var item in group)
{
Console.WriteLine($" {item}");
}
}
5. 상속
예시 코드로
부모의 클래스를 class Animal이라고 가정한다.
새로운 클래스를 지정해 class Dog : Animal으로 자식 클래스 (파생 클래스)를 지정한다.
클론( : )으로 Animal 클래스가 부모화가 된 것이다.
//부모 클래스
class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name}이(가) 음식을 먹고 있습니다.");
}
}
//자식 클래스 (파생 클래스)
class Dog : Animal //클론(:)으로 Animal 클래스가 부모화 됨
{
public void Bark()
{
Console.WriteLine($"{Name}이가 멍멍 짖습니다!");
}
}
class Program
{
static void Main(string[] args)
{
Dog myDog = new Dog();
myDog.Name = "바둑이"; // 부모 클래스의 속성 사용
myDog.Eat(); //부모 클래스의 메서드 호출 기능
myDog.Bark(); //자기 메서드 호출 가능
}
}
6. 메서드 오버라이딩
메서드 오버라이딩은
부모 클래스의 메서드를 자식 클래스에서 재정의하여 다른 동작을 수행한다.
자식 클래스가 부모 클래스 기능을 확장하거나 변경할 수 있다는 것이다.
중요한 점은 자식 클래스의 메서드는 부모 클래스의 메서드와 같은 이름, 반환 타입 및 매개변수를 가져야한다.
예를 들어 아래의 코드를 보면
부모 클래스 public virtual void Speak()
자식 클래스 public override void Speak()
이렇게 Speak로 같은 이름으로 만들어야 한다.
하지만 자식은 override 키워드를 꼭 포함하여야 한다.
부모는 virtual(가상) 키워드를 사용하여 정의한다.
//메서드 오버라이딩 (Overriding)
//부모 클래스의 메서드를 자식 클래스에서 재정의하여 다른 동작 수행
class Animal
{
public string Name { get; set; }
//가상(virtual)메서드 : 자식 클래스에서 재정의
public virtual void Speak()
{
Console.WriteLine("동물이 소리를 냅니다.");
}
}
class Dog : Animal
{
//부모 클래스의 메서드를 오버라이딩(재정의)
public override void Speak() //같은 이름으로 만들 수 있지만 override 키워드를 꼭 포함
{
Console.WriteLine($"{Name}이(가) 멍멍 짖습니다.");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal();
myAnimal.Name = "일반 동물";
myAnimal.Speak(); //부모 클래스의 기본메서드 실행
Dog myDog = new Dog();
myDog.Name = "바둑이";
myDog.Speak(); //오버라이딩 된 메서드 실행
}
}
정리하면서 이해가 갈 법도 한데 !
막상 코드 문제를 풀어보려고 하면
막막해질 나 자신이 보인다..
이왕에 열심히 배우는거!!!!
완벽하게! 알아가자!
점점 느껴지는 것인데,
컴퓨터와 대화하기 위해서는 정말
다양한 변형 방식, 응용, 활용 등을 사용하는 것 같다..
이러니까 정말 영어 공부하는 느낌이다.
컴퓨터와 능통하게 회화할 수 있을 정도로
될 날이 오길~~!! 😫
이렇게 오늘의 내용도 마친다!
'Development > 멋쟁이사자처럼 게임개발 부트캠프' 카테고리의 다른 글
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 8일차 - Environment & Stopwatch & 클래스 & 값 형식과 참조 형식 & 문자열 다루기 & 예외 처리 & List & Null (0) | 2025.03.11 |
---|---|
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 7일차 - 클래스 & this 키워드 (4) | 2025.03.09 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 6일차 - 네임스페이스 & 열거형 & 구조체 (0) | 2025.03.07 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 5일차 & 6일차 - 함수 (0) | 2025.03.07 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 5일차 (1) - 배열 & foreach (0) | 2025.03.06 |