Java 오버로딩·오버라이딩·숨김
오버로딩 선택과 오버라이딩 실행을 두 단계로 푼다.
실기 학습 목표
오버로딩 선택과 오버라이딩 실행을 두 단계로 푼다.
핵심 이론
오버로딩은 이름이 같고 매개변수 목록이 다른 메서드다. 반환형만 다르게 해서는 오버로딩이 되지 않는다. 컴파일 시 인수의 선언 타입과 적용 가능한 변환으로 호출 서명을 선택한다.
오버라이딩은 상속받은 인스턴스 메서드를 재정의하는 것이다. 선택된 서명에 대해 실행 시 실제 객체 타입의 구현이 호출된다.
필드 접근과 static 메서드 숨김은 인스턴스 메서드의 동적 디스패치와 다르다. Parent p=new Child()에서 p.field와 p.method()를 같은 규칙으로 풀지 않는다.
super.method()는 상위 구현을 직접 호출한다. private 메서드는 상속받아 재정의하는 대상이 아니며 final 메서드는 재정의할 수 없다. 형변환은 실제 객체를 새 객체로 바꾸지 않는다.
개념 도식
메서드 선택을 두 단계로 나눈다
오버로딩은 이름은 같지만 매개변수 목록이 다른 메서드 중 무엇을 부를지 고르는 것이다. 컴파일 시 표현식의 선언 타입으로 후보를 선택한다. 오버라이딩은 선택된 인스턴스 메서드의 구현을 실제 객체 타입에 따라 실행하는 것이다. 이름이 비슷해도 판단 시점이 다르다.
Parent p=new Child()일 때 다음 기준을 적용한다.
| 대상 | 판단에 쓰는 타입 | 의미 |
|---|---|---|
| p.field | 참조의 선언 타입 Parent | 필드 숨김은 다형적 호출이 아님 |
| p.staticMethod() | 선언 타입 Parent | static 메서드 숨김 |
| p.instanceMethod() | 실제 객체 Child | 해당 시그니처가 오버라이딩됐다면 Child 구현 |
예를 들어 f(Object)와 f(String)이 있고 Object x="A"를 f(x)에 전달하면 먼저 f(Object)를 선택한다. x 안의 값이 문자열이라는 이유로 f(String)을 선택하지 않는다. 이후 선택된 시그니처가 상속 계층에서 오버라이딩됐는지를 별도로 확인한다.
풀이에서는 호출 위치의 참조 타입, 인수 표현식의 타입, 선택된 매개변수 목록, 실제 객체의 구현을 한 줄씩 기록한다. 강제 형변환이 있으면 그 표현식의 정적 타입도 갱신한다. 반환형만 다르게 해서 오버로딩할 수는 없다. 복잡한 제네릭 타입 소거와 결합된 특수 사례는 기본 학습에서 제외한다.
풀이 예시
다음 Java 17 프로그램이 표준 출력에 기록하는 내용을 쓰시오. 마지막 줄바꿈의 유무는 답안에서 구별하지 않는다.
public class Main {
static class Base {
String call(Number n) { return "B"; }
}
static class Extra extends Base {
String call(Number n) { return "E"; }
String call(Integer n) { return "I"; }
}
public static void main(String[] args) {
Base[] items = {new Base(), new Extra()};
Number value = Integer.valueOf(2);
String result = "";
for (Base item : items) result += item.call(value);
Extra e = (Extra)items[1];
result += e.call((Integer)value);
System.out.println(result);
}
}
예시 정답
BEI
풀이 과정
반복문에서 호출 대상의 선언 타입은 Base, 인수의 선언 타입은 Number라 call(Number)가 선택된다. 실제 객체가 Base일 때 B, Extra일 때 재정의된 메서드가 E를 반환한다. 마지막에는 Extra와 Integer로 명시적으로 캐스트하여 call(Integer)가 선택되므로 I를 붙인다.
답안 점검
위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.