C# 메서드 오버로딩은 같은 이름의 메서드를 매개변수의 개수나 형식이 다르게 여러 개 선언하는 기능이에요. 호출하는 쪽에서는 하나의 일관된 이름을 쓰고, 컴파일러가 전달된 인수에 가장 잘 맞는 메서드를 선택합니다. 다만 반환 형식만 바꾼 메서드는 오버로딩할 수 없습니다.
메서드 이름이 같아도 매개변수의 개수, 형식 또는 순서가 달라야 합니다. 반환 형식, 매개변수 이름,
string과 string?의 차이만으로는 서로 다른 오버로드가 되지 않습니다.메서드 오버로딩은 왜 사용할까요?
같은 목적의 작업을 입력 형식마다 다른 이름으로 만들면 호출부가 불필요하게 복잡해집니다. 예를 들어 로그를 남길 때 WriteTextLog, WriteNumberLog처럼 이름을 나누기보다 Write라는 이름을 유지하고 문자열과 숫자용 오버로드를 제공할 수 있어요. 사용자는 “기록한다”는 동작만 기억하면 됩니다.
public static class LogWriter
{
public static void Write(string message)
{
Console.WriteLine(message);
}
public static void Write(int code, string message)
{
Console.WriteLine($"[{code}] {message}");
}
public static void Write(Exception exception)
{
Console.WriteLine(exception.Message);
}
}
LogWriter.Write("서버 시작");
LogWriter.Write(503, "서비스 점검 중");
첫 호출은 string 하나를 받는 메서드가, 두 번째 호출은 int와 string을 받는 메서드가 선택됩니다. 선택은 실행 중이 아니라 컴파일할 때 이뤄져요. 전달한 인수를 변환할 수 있는 후보가 여러 개라면 C#의 오버로드 결정 규칙이 더 나은 변환을 고릅니다.

반환 형식만 다르면 왜 오류가 날까요?
아래 두 메서드는 반환값이 다르지만 매개변수 목록이 같습니다. 호출문 Parse("10")만 보고는 어느 메서드를 선택해야 하는지 결정할 수 없으므로 같은 형식 안에 함께 선언할 수 없어요. 결과를 담는 변수의 형식도 오버로드 선택 기준으로 사용되지 않습니다.
// 컴파일 오류: 매개변수 구성이 같음
// static int Parse(string value) => int.Parse(value);
// static double Parse(string value) => double.Parse(value);
static int ParseInt(string value) => int.Parse(value);
static double ParseDouble(string value) => double.Parse(value);
두 동작의 의미나 결과가 실질적으로 다르다면 억지로 같은 이름을 유지하기보다 이름으로 차이를 드러내는 편이 읽기 쉽습니다. 오버로딩은 이름을 줄이는 기술이 아니라 같은 개념의 사용 방법을 일관되게 제공하는 설계 도구예요.
선택적 매개변수와 오버로드를 함께 쓸 때
선택적 매개변수는 호출 편의를 높이지만 비슷한 오버로드와 겹치면 어느 메서드가 선택되는지 읽기 어려워질 수 있습니다. 후보가 똑같이 적합하면 생략된 선택적 매개변수가 없는 쪽이 일반적으로 우선됩니다. 공개 라이브러리에서는 기본값 변경이 이미 컴파일된 호출 코드에 즉시 반영되지 않을 수 있다는 점도 고려해야 해요.
static void Save(string path)
=> Save(path, overwrite: false);
static void Save(string path, bool overwrite)
{
Console.WriteLine($"{path}, overwrite={overwrite}");
}
이처럼 짧은 오버로드가 긴 오버로드를 호출하게 만들면 실제 로직이 한곳에 모여 중복이 줄어듭니다. 반대로 두 오버로드가 비슷한 검증과 저장 코드를 각각 갖고 있으면 시간이 지나며 동작이 달라질 수 있어요.
params는 편리하지만 모호성을 만들 수 있어요
params는 여러 인수를 자연스럽게 받을 수 있게 하지만, 서로 다른 params 형식의 오버로드가 함께 있으면 빈 인수나 변환 가능한 배열을 전달할 때 컴파일러가 하나를 고르지 못할 수 있습니다. params 매개변수는 마지막에 하나만 선언할 수 있으며, 호출 방식이 분명한지 테스트해야 합니다.
static int Sum(params int[] values)
{
int total = 0;
foreach (int value in values)
total += value;
return total;
}
int result = Sum(10, 20, 30);
자주 만나는 컴파일 오류를 확인해 보세요
- CS0111: 같은 매개변수 형식의 메서드를 중복 선언했습니다. 매개변수 이름만 바꿔서는 해결되지 않아요.
- CS0121: 두 후보가 똑같이 적합해 호출이 모호합니다. 명시적 형 변환이나 메서드 이름 변경으로 의도를 분명히 하세요.
- CS1501: 전달한 인수의 개수에 맞는 오버로드가 없습니다. 선택적 매개변수와
params선언도 함께 확인하세요.
공식 자료
최초 작성: 2015년 1월 6일 · 내용 및 예제 업데이트: 2026년 8월 24일
0 댓글