
왜 이 글을 쓰는가
바로 어제 2026년도 1회차 정처기 실기를 보고 왔다.
시험을 보자마자 나와서 시험 후기와 모르는 문제들의 개념을 찾아보았다.
그중 Java 코드 문제에서 메서드를 제대로 보지 못하고 답을 적었던 문제가 있어서 다시 찾아 보게되었다.
이후 시험 복기를 찾아보니 문제를 제대로 읽었더라도 개념을 100% 이해하지 못했다면 틀렸을 가능성이 높은 문제였다.
그래서 이 문제를 통해 오버로딩, 오버라이딩, 그리고 참조 타입과 실제 객체의 관계를 다시 정리해보려고 한다.
문제
class A {
String f(Object x) { return "1"; }
String g() { return f("a"); }
}
class B extends A {
String f(Object x) { return "2"; }
String f(String x) { return "3"; }
}
public class Soojebi {
public static void main(String[] args) {
A a = new B();
System.out.println(a.g());
}
}
정답
정답: 2
한 줄 요약
- 오버로딩은 컴파일 시점에 결정된다.
- 오버라이딩은 실행 시점에 결정된다.
A a = new B();에서 참조 타입은A, 실제 객체는B이다.
이 문제의 핵심 개념
1. 오버로딩(Overloading)
같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 해서 여러 개 정의하는 것이다.
어떤 메서드가 선택될지는 컴파일 시점에 결정된다.
2. 오버라이딩(Overriding)
부모 클래스의 메서드를 자식 클래스에서 같은 형태로 다시 정의하는 것이다.
실제로 어떤 메서드가 실행될지는 실행 시점에 결정된다.
3. 참조 타입과 실제 객체 타입
A a = new B(); 에서 변수 a의 참조 타입은 A이고, 실제 생성된 객체는 B이다.
컴파일러는 참조 타입 기준으로 볼 수 있는 메서드를 판단하고, 실행할 때는 실제 객체 기준으로 오버라이딩된 메서드를 호출한다.
실행 과정 따라가기
1단계
A a = new B(); 이므로 참조 변수 a는 A 타입으로 선언되어 있지만 실제 객체는 B이다.
2단계
먼저 컴파일 단계에서 a.g()를 호출하면 g()는 A 클래스에 정의되어 있으므로 A의 g()가 실행된다.
3단계
이때 컴파일러는 A 기준에서 f()를 찾는다. A에는 f(Object)만 있으므로, 오버로딩 판단 결과 f("a")는 f(Object)로 연결된다.
4단계
실행 시점에는 실제 객체가 B이므로, A의 f(Object)가 아니라 오버라이딩된 B의 f(Object)가 실행된다.
따라서 최종 결과는 "2"가 출력된다.
다음에 다시 보면 좋을 기준
- 참조 변수 타입 먼저 보기
- 실제 객체 타입 확인하기
- 오버로딩인지 오버라이딩인지 구분하기
- 메서드가 호출되는 위치를 기준으로 어떤 메서드 후보가 보이는지 확인하기
정리
이 문제의 핵심은 오버로딩은 컴파일 시점, 오버라이딩은 실행 시점에 결정된다는 것이다.
비슷한 문제가 다시 나오면 참조 변수 타입 → 실제 객체 타입 → 컴파일 시점 메서드 선택 → 실행 시점 메서드 실행 순서로 보려고 한다.

When I Meet The Star : 별을 만나기 위한 개발 여정
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!