본문 바로가기
Java

[Java] 오버로딩(Method Overloading)

by 세류오 2026. 1. 11.

[오버로딩이란?]

같은 이름의 메서드를 매개변수(parameter)의 "구조"를 다르게 해서 여러 개 정의하는 것

오버로딩이란 한줄로 요약하자면 "같은 이름, 다른 모양"이라고 할 수 있다

System.out.println("Hello");
System.out.println(123);
System.out.println(3.14);

위 println은 보면 문자열도 되고, 숫자도 되고, 실수도 모두 표기할 수 있다.

이게 마로 메서드 오버로딩의 기능이다.

 

 

[오버로딩을 이해해 보자]

void print(int a)
void print(int a, int b)
void print(String s)
void print(double d)

위 코드를 보자. 

동일한 print메서드에 다양한 매개변수를 주고 있다.

메서드 오버로딩은 같은 메서드에 매개변수를 다르게 사용하는 것을 의미한다.

 

[오버로딩이 되는 경우와  안 되는경우는 무엇일까?]

📝 오버로딩이 되는 경우

 

1. 매개변수 개수가 다를 때

void add(int a)
void add(int a, int b)

 

2. 매개변수의 타입이 다를 때

void add(int a, double b)
void add(double a, int b)

add(10, 20); // ❌ 애매함 (컴파일 에러)

 

3. 매개변수의 순서가 다를 때

void add(int a, double b)
void add(double a, int b)

 

📝 오버로딩이 안 되는 경우

 

1. 리턴 타입만 다른 경우

int add(int a, int b)
double add(int a, int b) // 컴파일 에러

자바는 메서드를 호출할 때 리턴 타입을 보지 않는다.

호출시점에서 구분 불가하기 때문에 에러가 발생할 수 있다.

 

[자바는 어떻게 오버로딩 메서드를 고르는가?]

add(10, 20);

add라는 메서드를 자바가 가지고 있다. 이 때 자바 내부에서는 다음과 같은 흐름을 가지게 된다.

 

1. add라는 이름의 메서드를 전부 찾기

2. (int, int) 매개변수와 정확히 일치하는게 있나?

➡️ 존재한다면 실행

3. 없으면 자동 형 변환 가능한 메서느가 있는가?

➡️ 존재한다면 실행

4. 없으면 컴파일 에러

 

이러한 흐름으로 메서드를 분석하기 때문에 아래와 같은 경우가 생긴다.

void add(double a, double b)

add(10, 20); // OK (int → double 자동 형변환)
void add(int a, double b)
void add(double a, int b)

add(10, 20); // ❌ 애매함 (컴파일 에러)

 

add메서드가 두개 존재할 때 어느 메서드를 호출하는 지 정확하지 않기 때문에 에러가 난다.