메서드 오버로딩
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 50번째.
메서드 오버로딩(Method overloading)은 이름은 같지만 매개변수 목록이 다른 여러 메서드를 정의할 수 있도록 해줍니다. 컴파일러는 제공된 인수를 기반으로 어떤 버전을 호출할지 결정합니다.
각 오버로드된 메서드는 고유한 시그니처를 가져야 합니다. 즉, 매개변수의 개수가 다르거나 매개변수의 형식이 달라야 합니다:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}// 컴파일러가 올바른 버전을 선택합니다
Print("Hello"); // Print(string)을 호출합니다
Print("Hi", 3); // Print(string, int)를 호출합니다
Print(42); // Print(int)를 호출합니다오버로딩(Overloading)은 중요한 면에서 선택적 매개변수(optional parameters)와 다릅니다. 선택적 매개변수를 사용하면 여러 시나리오를 처리하는 하나의 메서드를 갖게 됩니다. 오버로딩을 사용하면 각 케이스에 대해 완전히 다른 로직을 포함할 수 있는 별개의 메서드들을 갖게 됩니다.
반환 타입만으로는 메서드를 고유하게 만들 수 없다는 점에 유의하세요. 반환하는 값만 다른 두 개의 메서드를 가질 수 없습니다. 매개변수 목록이 달라야 합니다. 메서드 오버로딩은 컴파일 타임 다형성의 한 형태이며, 어떤 메서드를 호출할지에 대한 결정은 코드가 실행될 때가 아니라 코드가 컴파일될 때 내려집니다.
챌린지
쉬움메서드 오버로딩의 강력함을 보여주는 다재다능한 계산기 클래스를 만들어 봅시다. 단순한 두 숫자 연산부터 더 복잡한 계산까지, 동일하고 직관적인 메서드 이름을 공유하면서 다양한 시나리오를 처리하는 여러 버전의 계산 메서드를 만들게 됩니다.
코드는 두 개의 파일로 구성됩니다:
Calculator.cs:MathTools네임스페이스 안에 이름은 같지만 매개변수가 다른 오버로드된 메서드들을 가진Calculator클래스를 생성합니다:Multiply- 세 가지 오버로드된 버전을 만듭니다:- 두 개의
int매개변수를 받아 그 곱을int로 반환하는 버전 - 세 개의
int매개변수를 받아 그 곱을int로 반환하는 버전 - 두 개의
double매개변수를 받아 그 곱을double로 반환하는 버전
- 두 개의
Describe- 두 가지 오버로드된 버전을 만듭니다:int를 받아"Integer: {value}"를 반환하는 버전double을 받아"Double: {value}"를 반환하는 버전
Program.cs: 메인 파일에서Calculator인스턴스를 생성하고, 컴파일러가 제공된 인수에 따라 올바른 오버로드된 메서드를 자동으로 선택하는 방법을 보여줍니다.
네 개의 입력을 받게 됩니다:
- 첫 번째 정수 (예:
5) - 두 번째 정수 (예:
4) - 세 번째 정수 (예:
3) - 소수 (예:
2.5)
계산기를 사용하여 다음 연산을 수행하고 각 결과를 별도의 줄에 출력하세요:
- 처음 두 정수를 곱합니다 (두 개의 int 버전을 사용)
- 세 정수 모두를 곱합니다 (세 개의 int 버전을 사용)
- 첫 번째 정수와 소수를 곱합니다 (두 개의 double 버전을 사용)
- 첫 번째 정수를 설명합니다 (int 버전을 사용)
- 소수를 설명합니다 (double 버전을 사용)
예를 들어, 입력이 5, 4, 3, 2.5인 경우 출력은 다음과 같아야 합니다:
20
60
12.5
Integer: 5
Double: 2.5서로 다른 인수 유형과 개수로 Multiply와 Describe를 호출하지만, 컴파일러가 매번 어떤 버전을 사용해야 할지 정확히 알고 있다는 점에 주목하세요. 이것이 바로 컴파일 타임 다형성(compile-time polymorphism)이 실제로 작동하는 모습입니다. 결정은 코드가 실행될 때가 아니라 컴파일될 때 일어납니다!
치트 시트
메서드 오버로딩을 사용하면 이름은 같지만 매개변수 목록이 다른 여러 메서드를 정의할 수 있습니다. 컴파일러는 제공된 인수를 기반으로 호출할 버전을 결정합니다.
오버로드된 각 메서드는 고유한 시그니처를 가져야 합니다. 즉, 매개변수의 개수가 다르거나 매개변수 유형이 달라야 합니다:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}
// 컴파일러가 올바른 버전을 선택합니다
Print("Hello"); // Print(string)을 호출합니다
Print("Hi", 3); // Print(string, int)를 호출합니다
Print(42); // Print(int)를 호출합니다메서드 오버로딩에 대한 주요 사항:
- 오버로딩은 선택적 매개변수(optional parameters)와 다릅니다. 오버로딩을 사용하면 각 경우에 대해 완전히 다른 로직을 포함할 수 있는 별개의 메서드를 갖게 됩니다.
- 반환 형식만으로는 메서드를 고유하게 만들 수 없습니다. 매개변수 목록이 달라야 합니다.
- 메서드 오버로딩은 컴파일 타임 다형성의 한 형태이며, 어떤 메서드를 호출할지에 대한 결정은 코드가 실행될 때가 아니라 컴파일될 때 이루어집니다.
직접 해보기
using System;
using MathTools;
class Program
{
public static void Main(string[] args)
{
// 입력 읽기
int firstInt = Convert.ToInt32(Console.ReadLine());
int secondInt = Convert.ToInt32(Console.ReadLine());
int thirdInt = Convert.ToInt32(Console.ReadLine());
double decimalNum = Convert.ToDouble(Console.ReadLine());
// TODO: Calculator 인스턴스 생성
// TODO: 두 개의 정수로 Multiply를 호출하고 결과 출력
// TODO: 세 개의 정수로 Multiply를 호출하고 결과 출력
// TODO: 첫 번째 정수와 소수로 Multiply를 호출하고 결과 출력
// TODO: 첫 번째 정수로 Describe를 호출하고 결과 출력
// TODO: 소수로 Describe를 호출하고 결과 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.