C#_ Unity Game programming

C#, 클래스 개념 지식 : 오버로딩, 오버라이딩

doyyy_0 2024. 1. 1. 18:29

| 오버로딩

오버로딩이란 함수명은 같지만 시그니쳐(매개변수 구성)를 달리해서 여러개의 함수를 사용할 수 있는 기법을 말한다.

 

만약 이런 기능이 없다면, 매번 다른 명의 함수명을 생각해내야 하는 귀찮음이 발생한다.

 

이 오버로딩은 생성자에서 자주 사용되는데 예시를 통해 확인해보면,

 

 

public class Animal
{
    public string name;

    public Animal()

    {

        this.name = "No name";

    }

    public Animal(string name)
    {
        this.name = name;
    }

    public Animal(string name,int x)
    {
        this.name = "second";
    }
}



Animal animal = new Animal();



void Start()

{

      Debug.Log(animal.name);

}



=> No name 출력



Animal animal = new Animal("Lion");



void Start()

{

      Debug.Log(animal.name);

}



=> Lion 출력

 

| 오버라이딩

 

오버라이딩은 오버로딩과 다르게 부모클래스의 메소드를 자식클래스의 메소드가 덮어 쓰는 방식이다. 예제를 확인해보자.

 

class Animal
{
    public void sleep()
    {
        Debug.Log("동물이 자다");
    }
}

class Monkey : Animal
{
    public void sleep()
    {
        Debug.Log("원숭이가 자다");
    }
    
}



public class TestScript : MonoBehaviour
{
    Monkey monkey = new Monkey();
    
   
    void Start()
    {
        monkey.sleep();
    }



}

 

이러면 출력은 "원숭이가 자다" 가 된다.

부모 클래스 Animal을 상속받은 것이다.

| virtual과 override

이 때 누가 부모클래스이고 자식클래스인지 손쉽게 확인하는 방법이 있다. 바로 virtual과 override를 사용하는 것인데, 

코드를 살펴보기 전에 virtual의 의미를 보자. virtual은 '가상의','허상의'라는 뜻이다. 즉 실제로 쓰이기 보다는 재정의 하기 전에 힌트같은 의미이다. 따라서 상속을 많이 시킬 클래스(부모클래스가 될 클래스)에 virtual를 붙이는 습관을 들이는 것도괜찮은 방법이다

 

class Animal
{
    public virtual void sleep()
    {
        Debug.Log("동물이 자다");
    }
}

class Monkey : Animal
{
    public override void sleep()
    {
        Debug.Log("원숭이가 자다");
    }
    
}

 

이런식으로 부모클래스에는 virtual을 쓰고 자식클래스에는 override를 쓰면 클래스를 딱 봤을떄 누가 부모클래스고 누가 자식 클래스인지 한 눈에 파악할 수 있다. 그리고 virtual을 사용하면 자식클래스에서 override까지 쓰면 자동완성 기능으로 함수가 나온다.

 

| base함수

 

base함수는 부모클래스의 메소드를 그대로 사용하는 방법이다.

 

class Animal
{
    public virtual void sleep()
    {
        Debug.Log("동물이 자다");
    }
}

class Monkey : Animal
{
    public override void sleep()
    {
        base.sleep();
    }
    
}



public class TestScript : MonoBehaviour
{
    Monkey monkey = new Monkey();
    
   
    void Start()
    {
        monkey.sleep();
    }



}

 

이렇게 작성하면 "동물이 자다"가 출력이된다. 여기서 팁으로 override까지쓰고 자동완성 기능을 하면 base가 알아서 생성된다.