본문 바로가기
Development/멋쟁이사자처럼 게임개발 부트캠프

[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 9일차 - 메서드, 쿼리 구문 & select & 알고리즘 & 상속 & 메서드 오버라이딩

by jjeondeuk1008 2025. 3. 11.

[ 목차 ]

     


     

    오늘은 배열에 관련해서 많이 나올 것이니..

     

    배열은 꼭! 기본적으로 익혀두고 시작하는 것이 좋다.

     

    한 번으로 복습은 안 된다!!

    (나에게 하는 말)

     

     

    파이팅하면서 시작!

     


     

    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(); //오버라이딩 된 메서드 실행
        }
    }
    

     

     

     

     


     

    정리하면서 이해가 갈 법도 한데 !

     

    막상 코드 문제를 풀어보려고 하면

    막막해질 나 자신이 보인다..

     

    이왕에 열심히 배우는거!!!!

    완벽하게! 알아가자!

     

    점점 느껴지는 것인데,

    컴퓨터와 대화하기 위해서는 정말

    다양한 변형 방식, 응용, 활용 등을 사용하는 것 같다..

     

    이러니까 정말 영어 공부하는 느낌이다.

     

     

    컴퓨터와 능통하게 회화할 수 있을 정도로

    될 날이 오길~~!! 😫

     

     

     

    이렇게 오늘의 내용도 마친다!


    목차