Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 정적 다형성(Static Polymorphism) 완벽 가이드 – 개념부터 함수 오버로딩 예제까지

정적 다형성(Static Polymorphism)컴파일 시점에 함수와 객체가 연결되는 방식을 말하며, 이를 '정적 바인딩(Static Binding)'이라고도 부릅니다. 실행 중에 호출 대상을 결정하는 동적 다형성과 달리, 프로그램이 실행되기 전에 어떤 메서드가 호출될지 이미 결정된다는 것이 특징입니다.

C#에서는 크게 두 가지 기법으로 정적 다형성을 구현할 수 있습니다.

  • 함수 오버로딩(Function Overloading)
  • 연산자 오버로딩(Operator Overloading)

1. 함수 오버로딩(Function Overloading)

함수 오버로딩은 동일한 범위(scope) 안에서 같은 이름의 함수를 여러 개 정의할 수 있게 해주는 기능입니다. 이때 각 함수 정의는 매개변수 목록에서 매개변수의 타입 또는 개수가 서로 달라야 합니다.

주의할 점은 반환 타입(return type)만 다른 함수 선언은 오버로딩할 수 없다는 것입니다. 매개변수의 차이가 반드시 존재해야만 컴파일러가 어떤 함수를 호출해야 할지 구분할 수 있습니다.

다음은 함수 오버로딩을 활용한 완전한 예제 코드입니다.

예제 코드

using System;

namespace PolymorphismApplication {
    class Printdata {
        void print(int i) {
            Console.WriteLine("Printing int: {0}", i);
        }

        void print(double f) {
            Console.WriteLine("Printing float: {0}", f);
        }

        void print(string s) {
            Console.WriteLine("Printing string: {0}", s);
        }

        static void Main(string[] args) {
            Printdata p = new Printdata();

            // print 메서드를 호출하여 정수 출력
            p.print(5);

            // print 메서드를 호출하여 실수 출력
            p.print(500.263);

            // print 메서드를 호출하여 문자열 출력
            p.print("Hello C#");
            Console.ReadKey();
        }
    }
}

실행 결과

Printing int: 5
Printing float: 500.263
Printing string: Hello C#

위 예제에서 볼 수 있듯이, print() 메서드는 하나의 이름으로 세 번 정의되었지만 각각 int, double, string 타입의 매개변수를 받습니다. 호출 시 전달되는 인자의 타입에 따라 컴파일러가 자동으로 적절한 메서드를 선택하기 때문에, 개발자는 하나의 직관적인 메서드 이름으로 다양한 데이터 타입을 처리할 수 있습니다.

2. 연산자 오버로딩(Operator Overloading)

연산자 오버로딩은 사용자 정의 타입(클래스나 구조체)에 대해 +, -, == 같은 연산자의 동작을 재정의하는 기법입니다. 예를 들어, 두 개의 복소수 객체를 더하거나 좌표 객체끼리 비교하는 연산을 자연스럽게 표현할 때 유용하게 활용됩니다.

정리

정적 다형성은 컴파일 시점에 호출 대상이 결정되므로 실행 속도가 빠르고 성능 면에서 유리합니다. 반면, 런타임에 객체의 실제 타입에 따라 동작이 달라지는 동적 다형성(메서드 오버라이딩)과 함께 적절히 활용하면 유연하고 확장 가능한 C# 코드를 작성할 수 있습니다.