Java 상속 문제는 클래스 이름을 따라가다 보면 쉽게 틀립니다. 한 객체를 볼 때 참조변수에 적힌 타입과 실제로 생성된 객체의 타입을 먼저 분리하세요. 그다음 접근 대상이 인스턴스 메서드인지, 필드나 정적 메서드인지 확인하면 호출 결과를 안정적으로 추적할 수 있습니다.

참조 타입과 실제 객체 타입을 한 줄에 같이 적습니다

Parent x = new Child();에서 x의 참조 타입은 Parent이고 실제 객체 타입은 Child입니다. 참조 타입은 컴파일 시점에 어떤 멤버를 호출할 수 있는지 제한하고, 실제 객체 타입은 오버라이딩된 인스턴스 메서드가 어느 구현으로 실행될지 결정합니다.

객체 옆에 적을 두 줄
  1. 참조 타입변수 선언의 왼쪽 타입을 적는다.
  2. 실제 타입new 뒤에서 생성한 클래스 타입을 적는다.
  3. 멤버 종류인스턴스 메서드, 필드, 정적 메서드 중 무엇인지 표시한다.
  4. 최종 호출규칙을 적용한 뒤 실행되는 클래스와 반환값을 적는다.

오버라이딩된 인스턴스 메서드는 실제 객체를 따라갑니다

부모 클래스와 자식 클래스에 시그니처가 같은 인스턴스 메서드가 있으면 자식 메서드가 부모 메서드를 오버라이딩합니다. 부모 타입 변수로 자식 객체를 가리켜도 호출 시점에는 실제 객체의 구현이 선택됩니다. 이를 동적 메서드 디스패치 관점에서 이해하세요.

필드와 정적 메서드는 같은 규칙으로 풀지 않습니다

접근 대상판단 기준
인스턴스 메서드오버라이딩됐다면 실제 객체 타입의 구현을 호출
인스턴스 필드참조변수의 선언 타입을 기준으로 이름을 해석
정적 메서드오버라이딩이 아니라 숨김이며 참조 타입 기준으로 선택
부모 구현super로 부모의 필드·메서드·생성자에 접근

출력 문제에서 필드와 메서드가 같은 이름을 사용하면 두 결과가 다를 수 있습니다. “상속이면 모두 자식 것을 호출한다”는 한 줄 암기는 버리세요.

오버로딩은 호출 시점이 아니라 매개변수 조합을 봅니다

메서드 이름은 같지만 매개변수 목록이 다른 것이 오버로딩입니다. 컴파일러는 호출식에서 확인할 수 있는 타입을 바탕으로 적용 가능한 메서드를 고릅니다. 따라서 실제 객체의 타입만 보고 오버로드 결과를 정하면 틀릴 수 있습니다.

같은 시그니처인지 확인했는가참조 타입과 실제 타입을 분리했는가필드를 메서드처럼 동적 선택하지 않았는가정적 메서드를 오버라이딩으로 부르지 않았는가오버로드 후보의 매개변수 타입을 비교했는가형변환이 호출 후보를 바꾸는지 확인했는가

생성자는 부모에서 자식 순서로 실행 흔적을 적습니다

자식 객체를 만들 때 부모 부분도 먼저 초기화됩니다. 생성자 첫 문장에 다른 생성자 호출이 명시되지 않았다면 컴파일러가 가능한 경우 super()를 삽입합니다. 인스턴스 초기화와 생성자 출력이 섞인 문제는 클래스별 실행 순서를 세로로 적으세요.

Java만 별도로 외우지 말고 같은 변수표 방식으로 다른 언어도 추적해야 합니다. 세 언어의 공통 풀이 흐름은 정보처리기사 실기 프로그래밍 공부법에서 확인할 수 있습니다.