Java 메서드 오버로딩과 재귀 호출
요약
Java 메서드 오버로딩(Overloading)의 개념과 재귀 호출(Recursion)을 알아봅니다. 같은 이름의 메서드가 매개변수 타입에 따라 다르게 호출되는 원리와, 오버로딩된 메서드 간 전환을 이해하여 정보처리기사 실기 문제를 풀어봅니다.
오버로딩 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 오버로딩 | 같은 이름, 다른 매개변수의 메서드 | calc(int) vs calc(String) |
| 호출 결정 기준 | 전달하는 인자의 타입 | calc(5) -> calc(int) 호출 |
| Integer.valueOf() | 문자열을 정수로 변환 | Integer.valueOf("5") -> 5 |
| 재귀 호출 | 메서드가 자기 자신을 호출 | return calc(n-1) + calc(n-2) |
메서드 오버로딩이란? 쌩기초
오버로딩(Overloading) 은 같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 하여 여러 개 정의하는 것입니다.
Overload는 over(더) + load(싣다), 즉 같은 이름에 메서드를 더 얹는다는 뜻입니다. 하나의 이름에 여러 메서드를 실어놓고, 매개변수 타입에 따라 골라 쓰는 것이므로 "오버로딩"입니다.

위 코드에서 calc(int value)와 calc(String str)는 이름은 같지만 매개변수 타입이 다릅니다. Java는 전달하는 인자의 타입에 따라 어떤 메서드를 호출할지 자동으로 결정합니다.

오버로딩 vs 오버라이딩
오버로딩과 오버라이딩은 이름이 비슷하지만 완전히 다른 개념입니다.
| 구분 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
|---|---|---|
| 의미 | 같은 이름의 메서드를 여러 개 정의 | 부모 메서드를 자식이 재정의 |
| 매개변수 | 다름 (타입 또는 개수) | 같음 |
| 클래스 관계 | 같은 클래스 내에서도 가능 | 부모-자식 간 |
| 결정 시점 | 컴파일 시 (인자 타입 기준) | 실행 시 (실제 객체 기준) |
Integer.valueOf() 쌩기초
Integer.valueOf()는 문자열을 정수로 변환하는 메서드입니다. 자세한 설명은 기본 제공 클래스 페이지를 참고하세요.
재귀 호출이란? 기초
재귀 호출(Recursion) 은 메서드가 자기 자신을 다시 호출하는 것입니다. 종료 조건이 없으면 무한히 호출되므로 반드시 종료 조건이 필요합니다.
재귀 호출 추적 방법
재귀 호출은 작은 값부터 먼저 계산하면 쉽게 풀 수 있습니다.
오버로딩 + 재귀: 메서드 전환 기초
시험에서 가장 중요한 패턴은 오버로딩된 메서드 사이에서 전환이 일어나는 경우입니다.
핵심: calc(String)에서 calc(int)로 전환
calc(String str) 메서드 안에서 calc(value - 1)을 호출할 때, value는 int 타입입니다.
| 코드 | 인자 타입 | 호출되는 메서드 |
|---|---|---|
calc("5") | String | calc(String str) |
calc(value - 1) | int | calc(int value) |
calc(value - 3) | int | calc(int value) |
calc(String)은 한 번만 호출되고, 그 안에서 calc(int)로 전환됩니다. 이후로는 calc(int) 메서드끼리만 재귀 호출합니다.
컴파일타임 바인딩 심화
오버로드 선택은 컴파일 시점에 선언 타입을 기준으로 결정됩니다. 26년1회 실기에서 처음 출제된 핵심 패턴이며, 자세한 동작 원리와 단계별 풀이는 Java 컴파일타임 바인딩 페이지에서 다룹니다.
문제 풀이 전략 심화
풀이 순서
- 메서드 구분: 같은 이름의 메서드가 여러 개면 매개변수 타입 확인
- 첫 호출 확인: 전달하는 인자 타입에 따라 어떤 메서드가 호출되는지 확인
- 메서드 전환 확인: 메서드 내부에서 다른 타입의 인자로 호출하면 다른 메서드로 전환
- 재귀 추적: 작은 값부터 계산하여 결과 도출
자주 하는 실수
| 실수 | 올바른 이해 |
|---|---|
| calc(value - 1)이 calc(String)을 호출한다고 생각 | value는 int이므로 calc(int) 호출 |
| calc("5")에서 재귀가 계속 calc(String)이라고 생각 | Integer.valueOf() 이후 int로 전환 |
| 큰 값부터 계산하려고 함 | 작은 값(0, 1)부터 순서대로 구하기 |