[C#] 함수 오버로딩, 오버라이딩

[C#] 함수 오버로딩, 오버라이딩

함수 오버로딩(Overloading)

한글로 번역하면 과적, 과부화란 의미를 가지고 있는 오버로딩은, 객체 지향 프로그래밍에서는 동일한 이름을 가진 메소드를 여러 개 정의하는 기법으로, 매개변수 타입, 매개변수 개수를 다르게 하여 메소드를 다양한 용도로 사용하게 해줍니다.

예를 들어 아래와 같이 수학 클래스를 만들 때 더하기 함수를 여러 개 만들 수 있습니다.

class ClassMath
{
    // 매개 변수 개수 2개
    public void Sum(int x, int y)
    {
        Console.WriteLine($"{x} + {y} = {x+y}");
    }

    // 매개 변수 개수 3개
    public void Sum(int x, int y, int z)
    {
        Console.WriteLine($"{x} + {y} + {z} = {x + y + z}");
    }

    // 매개 변수 타입 double
    public void Sum(double x, double y)
    {
        Console.WriteLine($"{x} + {y} = {x + y}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassMath math = new ClassMath();
        math.Sum(1, 2);
        math.Sum(1, 2, 3);
        math.Sum(1.1, 2.2);
    }
}

double 계산 결과가 이상해 보이지만 그냥 넘어갑니다


함수 오버라이딩(Overriding)

오버라이딩은 재정의라는 의미를 가지고 있으며, 함수 오버라이딩은 추상 또는 가상 함수를 확장하거나 수정하기 위해 파생 클래스에서 override 키워드를 사용하여 함수를 재정의하는 기법입니다.
기본 클래스에 abstract, virtual 키워드가 적혀있는 메소드여야하며, 파생 클래스에서는 재정의 하기 위해 override 키워드를 입력해줘야합니다. 또한 private 함수는 재정의 할 수 없으며 재정의할 때 접근 한정자를 변경할 수도 없습니다.

위에서 만든 더하기 함수를 한글로 출력하고 싶으면 기존 클래스를 상속받아 한글로 출력하도록 재정의하면 됩니다.

class ClassMath
{
    // 가상함수
    public virtual void Sum(int x, int y)
    {
        Console.WriteLine($"{x} + {y} = {x+y}");
    }
}
class ClassMathKorean : ClassMath
{
    // 재정의
    public override void Sum(int x, int y)
    {
        Console.WriteLine($"{x} 더하기 {y} 는 {x+y} 입니다.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassMath math = new ClassMath();
        math.Sum(1, 2);

        ClassMathKorean math_kor = new ClassMathKorean();
        math_kor.Sum(1, 2);
    }
}

실행 하면 아래와 같이 출력합니다.


github: https://github.com/3001ssw/c_sharp/tree/main/class_study/overloading_override