NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 15-3. 메서드의 오버로딩 (Method's Overloading)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 OOP의 핵심 개념 중 하나인 다형성을 구현하는 2가지 중 하나인 오버로딩(Overloading)에 대해서 알아 볼께요. 다른 하나는 오버라이딩(Overriding)으로 다음 장인 클래스에 대해서 알아볼 때 같이 설명하도록 하겠습니다.

     

    메서드는 다음의 규칙을 통해 같은 이름으로 생성할 수 있습니다. 예전 C언어에서는 시그니처가 다르더라도 동일한 이름으로 메서드를 생성할 수 없었습니다. 엄밀히 말하면 함수(Function)라고 해야 겠죠.

     

    오버로딩은 메서드를 구성하는 파라메터의 타입과 개수가 다르면 같은 이름으로 메서드를 정의할 수 있도록 하는 메커니즘을 제공합니다. 이런 규칙을 메서드의 시그니처라고 부르죠. 아래의 예가 모든 경우의 수를 표현하지는 않지만, 기본적인 내용을 잘 보여주고 있습니다. Java와 C#은 모두 반환 형식을 메서드의 시그니처에 포함시키지 않았습니다. 따라서 반환 형식을 지정하거나 void로 지정해도 같은 시그니처로 인식합니다. 또한, out, ref와 같은 한정자와 parmas는 별개의 형식으로 인식하게 되어 있습니다.

    using System;
    namespace Overloading
    {
        class MainApp
        {
            static int Plus(int a, int b)
            {
                Console.WriteLine("Calling int Plus(int,int)...");
                return a + b;
            }
            static int Plus(int a, int b, int c)
            {
                Console.WriteLine("Calling int Plus(int,int,int)...");
                return a + b + c;
            }
            static double Plus(double a, double b)
            {
                Console.WriteLine("Calling double Plus(double,double)...");
                return a + b;
            }
            static double Plus(int a, double b)
            {
                Console.WriteLine("Calling double Plus(int, double)...");
                return a + b;
            }
            static void Main(string[] args)
            {
                Console.WriteLine(Plus(1, 2));
                Console.WriteLine(Plus(1, 2, 3));
                Console.WriteLine(Plus(1.0, 2.4));
                Console.WriteLine(Plus(1, 2.4));
            }
        }
    }

     

     

    ※ 시그니처란?

    클래스, 구조체 및 인터페이스의 맴버를 오버로드할 수 있는 메커니즘입니다.

     

    모든 ref 및 out 파라메터 한정자는 시그니처의 일부입니다. 아래 예제에서 사용된 F(int)와 F(ref int)는 서로 다른 고유한 시그니처입니다. 반환 형식과 params 한정자는 시그니처의 일부가 아니므로 반환 형식이나 params 한정자의 포함 또는 제외만을 기반으로해서는 오버로드할 수 없습니다. 따라서 아래 코드의 메서드 F(int)와 F(params string[])를 선언하면 컴파일 타임 에러가 발생합니다.

    interface ITest
    {
        void F();                     // F()    
        void F(int x);                // F(int)    
        void F(ref int x);            // F(ref int)    
        void F(int x, int y);         // F(int, int)    
        int F(string s);              // F(string)    
        int F(int x);                 // F(int)         error
        void F(string[] a);           // F(string[])    
        void F(params string[] a);    // F(string[])    error
    }

     

     

    오버로딩은 메서드에만 사용되는 것은 아닙니다. 생성자와 구조체, 인덱서, 인터페이스 및 연산자에 사용할수도 있습니다. 각각의 단원에서 좀 더 자세하게 알아보도록 하겠습니다.

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.