오버로딩 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 |