Class 복습

김치헌·2024년 1월 26일
0

TIL

목록 보기
22/38

오늘 스탠다드 강의 중에 Class를 복습하면서 아래와 같은 코드는 똥을 싸는것과 같다하셧다.

using System;
using System.Collections.Generic;

// 부모 클래스 (상위 클래스)
class Animal
{
    public void Eat()
    {
        Console.WriteLine("Eating...");
    }
}

// 자식 클래스 (하위 클래스)
class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Barking...");
    }
}

// 다른 자식 클래스 (하위 클래스)
class Cat : Animal
{
    public void Meow()
    {
        Console.WriteLine("Meowing...");
    }
}

class Program
{
    static void Main()
    {
        // Animal 형식의 리스트 생성
        List<Animal> animals = new List<Animal>();

        // Dog 객체와 Cat 객체를 Animal 리스트에 추가
        animals.Add(new Dog());
        animals.Add(new Cat());

        // Animal 리스트를 순회하며 각 객체의 Eat 메서드 호출
        foreach (Animal animal in animals)
        {
            animal.Eat();

            // 만약 animal이 Dog 형식이라면 Bark 메서드도 호출 가능
            if (animal is Dog)
            {
                ((Dog)animal).Bark();
            }

            // 만약 animal이 Cat 형식이라면 Meow 메서드도 호출 가능
            if (animal is Cat)
            {
                ((Cat)animal).Meow();
            }
        }
    }
}

오늘 배운 매서드 오버라이딩을 적용하면 어떻게 코드를 구성할 수 있을까?
if(animal is Dog)<< 이 부분은 Virtual에서 자신의 형태를 한번 더 확인하는 것과 같다고 볼 수 있다.
하지만, Animal에는 Eat매서드만 있고 Bark와 Meow가 없다.
그러면 Abstrack으로 Bark와 Meow를 적고 자식 형태에서 구현하면 어떨까?
Dog에는 Meow가 정의되어 있지 않고, Cat에는 Bark가 정의되어 있지 않다.
Virtual로 Bark와 Meow를 만들고 부모함수에서 그냥 리턴시켜버리면 될 것 같아서 코드를 작성했다.


첫번째 Add인 Dog가 Eating Barking을 하고 두번째 Add인 Cat이 Eating과 Meowing을 하는 것을 확인 할 수 있었다. 확실히 Virtual과 Abstract가 동작하는 원리를 알게 되니 기존에 무지성으로 public void하던 것보다 한번 더 생각하게 되는 것 같다!

이번 입문강의에서 CharacterController를 InputController가 상속받던데 awake를 Virtual로 사용하면서 InputController의 awake를 overridie하고 base.awake로 CharacterController의 Awake를 불러오는 방법을 사용하던데 자식Class에서 부모Class를 동시에 Awake 시키는 방법인거 같은데... 그냥 따로 둬도 Awake되지 않나 싶기도 하고... 좀 더 공부해 봐야 겠다.

profile
초보개발자

0개의 댓글