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) 은 같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 하여 여러 개 정의하는 것입니다.
쉽게 말하면, "같은 이름이지만 받는 것이 다르면 다른 메서드" 입니다.
위 코드에서 calc(int value)와 calc(String str)는 이름은 같지만 매개변수 타입이 다릅니다. Java는 전달하는 인자의 타입에 따라 어떤 메서드를 호출할지 자동으로 결정합니다.

오버로딩 vs 오버라이딩
오버로딩과 오버라이딩은 이름이 비슷하지만 완전히 다른 개념입니다.
| 구분 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
|---|---|---|
| 의미 | 같은 이름의 메서드를 여러 개 정의 | 부모 메서드를 자식이 재정의 |
| 매개변수 | 다름 (타입 또는 개수) | 같음 |
| 클래스 관계 | 같은 클래스 내에서도 가능 | 부모-자식 간 |
| 결정 시점 | 컴파일 시 (인자 타입 기준) | 실행 시 (실제 객체 기준) |
Integer.valueOf()
Integer.valueOf()는 문자열을 정수로 변환하는 메서드입니다.
| 입력 | 결과 | 설명 |
|---|---|---|
Integer.valueOf("5") | 5 | 문자열 "5" -> 정수 5 |
Integer.valueOf("123") | 123 | 문자열 "123" -> 정수 123 |
Integer.valueOf("0") | 0 | 문자열 "0" -> 정수 0 |
재귀 호출이란?
재귀 호출(Recursion) 은 메서드가 자기 자신을 다시 호출하는 것입니다.
재귀 호출에는 반드시 두 가지가 필요합니다.
| 요소 | 설명 | 위 코드에서 |
|---|---|---|
| 종료 조건 | 더 이상 호출하지 않는 조건 | if (value <= 1) return value |
| 재귀 호출 | 자기 자신을 다시 호출 | calc(value - 1) + calc(value - 2) |
종료 조건이 없으면 무한히 호출하다가 프로그램이 멈춥니다.
재귀 호출 추적 방법
재귀 호출은 작은 값부터 먼저 계산하면 쉽게 풀 수 있습니다.
| 호출 | 계산 과정 | 결과 |
|---|---|---|
| calc(0) | 0 <= 1이므로 0 반환 | 0 |
| calc(1) | 1 <= 1이므로 1 반환 | 1 |
| calc(2) | calc(1) + calc(0) = 1 + 0 | 1 |
| calc(3) | calc(2) + calc(1) = 1 + 1 | 2 |
| calc(4) | calc(3) + calc(2) = 2 + 1 | 3 |
| calc(5) | calc(4) + calc(3) = 3 + 2 | 5 |
오버로딩 + 재귀: 메서드 전환
시험에서 가장 중요한 패턴은 오버로딩된 메서드 사이에서 전환이 일어나는 경우입니다.
핵심: 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) 메서드끼리만 재귀 호출합니다.
실전 예제: 문제 풀이 과정
25년 1회 기출문제와 동일한 구조로 단계별 풀이를 연습합니다.
1단계: 메서드 구조 파악
| 메서드 | 매개변수 타입 | 종료 조건 | 재귀 호출 |
|---|---|---|---|
calc(int value) | int | value <= 1이면 value 반환 | calc(value-1) + calc(value-2) |
calc(String str) | String | value <= 1이면 value 반환 | calc(value-1) + calc(value-3) |
2단계: calc("5") 실행 - String 메서드 진입
calc(String str) 메서드 내부:
3단계: calc(int) 재귀 추적
이제 calc(int) 메서드만 추적합니다. 작은 값부터 구합니다.
| 호출 | 계산 과정 | 결과 |
|---|---|---|
| calc(0) | 0 <= 1이므로 0 반환 | 0 |
| calc(1) | 1 <= 1이므로 1 반환 | 1 |
| calc(2) | calc(1) + calc(0) = 1 + 0 | 1 |
| calc(3) | calc(2) + calc(1) = 1 + 1 | 2 |
| calc(4) | calc(3) + calc(2) = 2 + 1 | 3 |
4단계: 최종 결과
전체 실행 흐름
문제 풀이 전략
풀이 순서
- 메서드 구분: 같은 이름의 메서드가 여러 개면 매개변수 타입 확인
- 첫 호출 확인: 전달하는 인자 타입에 따라 어떤 메서드가 호출되는지 확인
- 메서드 전환 확인: 메서드 내부에서 다른 타입의 인자로 호출하면 다른 메서드로 전환
- 재귀 추적: 작은 값부터 계산하여 결과 도출
자주 하는 실수
| 실수 | 올바른 이해 |
|---|---|
| calc(value - 1)이 calc(String)을 호출한다고 생각 | value는 int이므로 calc(int) 호출 |
| calc("5")에서 재귀가 계속 calc(String)이라고 생각 | Integer.valueOf() 이후 int로 전환 |
| 큰 값부터 계산하려고 함 | 작은 값(0, 1)부터 순서대로 구하기 |