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

C# 컴파일 타임 다형성(정적 다형성)이란? 개념부터 함수 오버로딩 예제까지

다형성(Polymorphism)은 크게 정적 다형성(Static Polymorphism)동적 다형성(Dynamic Polymorphism)으로 나눌 수 있습니다. 정적 다형성에서는 함수에 대한 응답이 컴파일 시간(Compile Time)에 결정되고, 동적 다형성에서는 실행 시간(Run-time)에 결정됩니다.

컴파일 시간 바인딩(초기 바인딩)

컴파일 시간에 함수와 객체를 연결하는 과정을 초기 바인딩(Early Binding)이라고 하며, 이를 정적 바인딩(Static Binding)이라고도 부릅니다. C#에서는 정적 다형성을 구현하기 위해 다음 두 가지 기법을 제공합니다.

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

함수 오버로딩(Function Overloading)

함수 오버로딩은 같은 스코프 내에서 동일한 이름의 함수를 여러 개 정의할 수 있게 해주는 기능입니다. 단, 각 함수의 정의는 매개변수 목록에서 인수의 타입 또는 개수가 서로 달라야 합니다.

예를 들어, 같은 이름의 print() 함수라도 int, double, string 타입을 각각 처리하도록 세 번 정의하면, 호출 시 전달되는 인수의 타입에 따라 컴파일러가 알맞은 함수를 자동으로 선택합니다.

예제 코드

다음은 C#에서 함수 오버로딩을 구현하는 방법을 보여주는 예제입니다.

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);

            // 실수(float) 출력을 위한 print 호출
            p.print(500.263);

            // 문자열 출력을 위한 print 호출
            p.print("Hello C#");
            Console.ReadKey();
        }
    }
}

실행 결과

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

정리

위 예제에서 볼 수 있듯이, 메서드 이름은 하나지만 인수의 타입(int, double, string)에 따라 서로 다른 버전의 print() 메서드가 호출됩니다. 이처럼 어떤 함수가 실행될지 컴파일 단계에서 미리 결정되기 때문에, 이러한 방식을 컴파일 타임 다형성 또는 정적 다형성이라고 부릅니다. 반대로 실행 시간에 어떤 메서드가 호출될지 결정되는 방식은 메서드 오버라이딩(Method Overriding)을 통한 동적 다형성으로 구현됩니다.