Menu
Coddy logo textTech

메서드 오버로딩

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)와 다릅니다. 선택적 매개변수를 사용하면 여러 시나리오를 처리하는 하나의 메서드를 갖게 됩니다. 오버로딩을 사용하면 각 케이스에 대해 완전히 다른 로직을 포함할 수 있는 별개의 메서드들을 갖게 됩니다.

반환 타입만으로는 메서드를 고유하게 만들 수 없다는 점에 유의하세요. 반환하는 값만 다른 두 개의 메서드를 가질 수 없습니다. 매개변수 목록이 달라야 합니다. 메서드 오버로딩은 컴파일 타임 다형성의 한 형태이며, 어떤 메서드를 호출할지에 대한 결정은 코드가 실행될 때가 아니라 코드가 컴파일될 때 내려집니다.

challenge icon

챌린지

쉬움

메서드 오버로딩의 강력함을 보여주는 다재다능한 계산기 클래스를 만들어 봅시다. 단순한 두 숫자 연산부터 더 복잡한 계산까지, 동일하고 직관적인 메서드 이름을 공유하면서 다양한 시나리오를 처리하는 여러 버전의 계산 메서드를 만들게 됩니다.

코드는 두 개의 파일로 구성됩니다:

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

계산기를 사용하여 다음 연산을 수행하고 각 결과를 별도의 줄에 출력하세요:

  1. 처음 두 정수를 곱합니다 (두 개의 int 버전을 사용)
  2. 세 정수 모두를 곱합니다 (세 개의 int 버전을 사용)
  3. 첫 번째 정수와 소수를 곱합니다 (두 개의 double 버전을 사용)
  4. 첫 번째 정수를 설명합니다 (int 버전을 사용)
  5. 소수를 설명합니다 (double 버전을 사용)

예를 들어, 입력이 5, 4, 3, 2.5인 경우 출력은 다음과 같아야 합니다:

20
60
12.5
Integer: 5
Double: 2.5

서로 다른 인수 유형과 개수로 MultiplyDescribe를 호출하지만, 컴파일러가 매번 어떤 버전을 사용해야 할지 정확히 알고 있다는 점에 주목하세요. 이것이 바로 컴파일 타임 다형성(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를 호출하고 결과 출력
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨