본문 바로가기

C#

메소드 오버로딩 (Overloading) / 가변 개수의 인수 / 명명된 인수

오버로딩 Overloading

오버로딩이란 과적하다 라는 뜻을 갖고 있다. 과적이란 트럭 따위애 원래의 탑재량을 넘겨 싣는 것을 말한다.

메소드 오버로딩은 하나의 메소드 이름에 여러 개의 구현을 올리는 것을 뜻 한다.

장점

- 이름에 대한 고민을 줄일 수 있다.

- 코드를 일관성 있게 유지 + 생산성 제공 (WriteLine은 18개 버전을 오버로딩 하고 있다).

static void Main(string[] args)
        {
            Console.WriteLine(Plus(1,2));
            Console.WriteLine(Plus(1,2,3));
            Console.WriteLine(Plus(2.0f, 2.5f));
            Console.WriteLine(Plus(2.0f, 2.5f, 3.0f));
        }
        public static int Plus(int a, int b)
        {
            Console.WriteLine("Calling int Plus(int, int)");
            return a + b;
        }

        public static int Plus(int a, int b, int c)
        {
            Console.WriteLine("Calling int Plus(int, int, int)");
            return a + b + c;
        }

        public static double Plus(double a, double b)
        {
            Console.WriteLine("Calling double Plus(double, double)");
            return a + b;
        }

        public static double Plus(double a, double b, double c)
        {
            Console.WriteLine("Calling double Plus(double, double, double)");
            return a + b + c;
        }

가변 개수의 인수

프로그래밍을 하다 보면 그저 인수의 개수가 다르다는 이유만으로 똑같은 메소드를 여러 가지 버전으로 오버로딩 하고 싶을 때가 있다. 이런 경우를 이해 C#은 "가변 개수의 인수" 라는 기능을 제공한다.

가변 개수의 인수는 params 키워드와 배열을 이용해서 선언한다.

static void Main(string[] args)
        {
            Console.WriteLine(Sum(10,10));
            Console.WriteLine(Sum(10,10,10));
            Console.WriteLine(Sum(10,10,10,10));

        }
        public static int Sum(params int[] args)
        {
            Console.WriteLine("Summing");
            int sum = 0;
            for (int i = 0; i < args.Length; i++)
            {
                sum += args[i];
            }
            return sum;
        }

명명된 인수

메소드를 호출할 때 매개변수 목록 중 어느 매개변수에 데이터를 할당할지 지정하는 것은 "순서" 이지만, 

명명인수는 메소드를 호출할 때 인수의 이름에 근거해서 데이터를 할당할 수 있는 기능이다.

 

명명된 인수를 사용하기 위해 메소드 선언에 손댈 일은 전혀 없고, 메소드를 호출할 때만 인수의 이름 뒤에 콜론 (:)을 붙인 뒤 그 뒤에 할당할 데이터를 넣어주면 된다.

static void Main(string[] args)
        {
            PrintProfile(name: "홍길동", phone:"010-1234-5678");
        }
        public static void PrintProfile(string name, string phone)
        {
            Console.WriteLine($"Name: {name}, Phone:{phone}");
        }

선택적 인수

메소드의 매개변수는 기본값을 가질 수 있다.

기본값을 가진 매개변수는 메소드를 호출할 때 해당 인수를 생략할 수 있다.

static void Main(string[] args)
        {
            Profile(65);		// Age: 65 출력
        }
        public static void Profile(int age, int weight = 0)
        {
            if(weight == 0)
            {
                Console.WriteLine($"Age: {age}");
            }
            else
            {
                Console.WriteLine($"Age: {age}, Weight: {weight}");
            }
        }

 

선택적 인수는 메소드의 사용자에게 신경 쓰고 싶지 않은 인수를 염두에 두지 않도록 편의를 제공하지만, 또 한편으로는 모호함이라는 스트레스도 같이 준다.

작성한지 오래된 코드를 볼 때 어느 매개변수에 어떤 인수를 할당했는지 분간이 안 될 때도 있다. 이런 경우 명명된인수의 도움을 받으면 쉽게 문제를 풀 수 있다.

(선택적 인수와 명명된 인수의 궁합이 좋다는 얘기인 것 같다.)

static void Main(string[] args)
        {
            Profile(age: 65);
        }
        public static void Profile(int age, int weight = 0)
        {
            if(weight == 0)
            {
                Console.WriteLine($"Age: {age}");

            }
            else
            {
                Console.WriteLine($"Age: {age}, Weight: {weight}");
            }
        }

 

메소드 오버로딩 VS 선택적 매개 변수

선택적 인수는 상당히 유용한 기능이지만, 메소드 오버로딩과 힘께 사용될 때 혼란을 야기한다.

오버로딩을 할지 아니면 선택적 인수를 사용할지 프로그래머가 정책적으로 분명하게 정해야 한다.

논리는 동일하되 매개변수가 다른 경우: 선택적 인수

매개변수에 따라 논리도 함께 달라지는 경우: 오버로딩

 

참조: 이것이 C#이다

'C#' 카테고리의 다른 글

객체지향 프로그래밍과 클래스  (0) 2022.05.09
로컬 함수  (0) 2022.05.09
값에 의한 전달 / 참조에 의한 전달 / ref / out  (0) 2022.05.09
for / foreach  (0) 2022.05.07
Switch 문 / Switch 식  (0) 2022.05.07