정보처리기사 필기

시험 직전 요약장

판단 기준과 헷갈리는 개념, 대표 예제를 짧게 확인하세요.

이론 목록

Java 상속·동적 바인딩·오버로딩·오버라이딩

원래 이론 →

판단 기준

상위 타입 변수로 인스턴스 메서드를 호출하더라도, 선택된 시그니처가 하위 클래스에서 오버라이딩되어 있으면 실행 시 실제 객체의 구현이 호출된다.

JAVA
Animal animal = new Cat();
System.out.println(animal.sound());  // meow

컴파일 시에는 Animal 형에 sound()가 존재하고 접근 가능한지 확인한다. 실행 시에는 실제 객체가 Cat이므로 Cat.sound()를 찾는다. 이처럼 같은 상위 타입 호출식이 실제 객체에 따라 다른 구현을 실행하는 성질이 다형성의 핵심이다.

Dog도 sound()를 오버라이딩했다고 가정하면 다음과 같이 한 배열에서 서로 다른 구현을 호출할 수 있다.

JAVA
class Dog extends Animal {
    @Override
    String sound() {
        return "woof";
    }
}

Animal[] animals = {new Cat(), new Dog()};
for (Animal value : animals) {
    System.out.println(value.sound());
}

배열 원소를 읽는 식의 형은 모두 Animal이지만 각 원소가 가리키는 실제 객체에 따라 Cat.sound() 또는 Dog.sound()가 실행된다.

이 부분의 원문 →

헷갈리는 개념

호출 대상선택 시점선택 기준상속 관계의 이름
오버라이드 가능한 인스턴스 메서드컴파일 시 시그니처 결정 후 실행 시 구현 결정실제 객체 형오버라이딩
static 메서드컴파일 시수신 표현식의 선언된 타입 또는 명시한 클래스숨김
인스턴스 필드컴파일 시필드 접근 표현식의 형숨김
super로 호출한 인스턴스 메서드컴파일 시 지정직접 상위 구현동적 오버라이딩 선택 안 함
이 부분의 원문 →

대표 계산·예제

JAVA
public class DispatchDemo {
    public static void main(String[] args) {
        Parent ref = new Child();

        System.out.println(ref.label);
        System.out.println(ref.speak());
        System.out.println(Parent.kind());
        System.out.println(Child.kind());

        if (ref instanceof Child) {
            Child child = (Child) ref;
            System.out.println(child.label);
            System.out.println(child.onlyChild());
            System.out.println(child.parentSpeak());
        }
    }
}

class Parent {
    String label = "parent-field";

    String speak() {
        return "parent-method";
    }

    static String kind() {
        return "parent-static";
    }
}

class Child extends Parent {
    String label = "child-field";

    @Override
    String speak() {
        return "child-method";
    }

    static String kind() {
        return "child-static";
    }

    String onlyChild() {
        return "child-only";
    }

    String parentSpeak() {
        return super.speak();
    }
}

실행 결과:

예시·텍스트
parent-field
child-method
parent-static
child-static
child-field
child-only
parent-method

결과를 다음 순서로 해석한다.

  1. ref.label은 ref의 선언된 타입 Parent를 기준으로 Parent.label을 읽는다.
  2. ref.speak()는 컴파일 시 Parent.speak() 시그니처를 선택하지만, 실행 시 실제 객체가 Child이므로 Child.speak()를 호출한다.
  3. Parent.kind()와 Child.kind()는 각각 명시한 클래스의 정적 메서드를 호출한다.
  4. 다운캐스팅한 child.label은 Child 형을 기준으로 Child.label을 읽는다.
  5. child.parentSpeak() 안의 super.speak()는 Parent.speak()를 직접 호출한다.
이 부분의 원문 →

내 최근 연습 오답

현재 브라우저의 연습 채점 기록에서 공개된 단원과 연결된 오답을 확인합니다.

학습 기록 →

오답 기록을 확인하고 있습니다.