정보처리기사 필기
시험 직전 요약장
판단 기준과 헷갈리는 개념, 대표 예제를 짧게 확인하세요.
Java 상속·동적 바인딩·오버로딩·오버라이딩
원래 이론 →판단 기준
상위 타입 변수로 인스턴스 메서드를 호출하더라도, 선택된 시그니처가 하위 클래스에서 오버라이딩되어 있으면 실행 시 실제 객체의 구현이 호출된다.
JAVA좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
Animal animal = new Cat();
System.out.println(animal.sound()); // meow
컴파일 시에는 Animal 형에 sound()가 존재하고 접근 가능한지 확인한다. 실행 시에는 실제 객체가 Cat이므로 Cat.sound()를 찾는다. 이처럼 같은 상위 타입 호출식이 실제 객체에 따라 다른 구현을 실행하는 성질이 다형성의 핵심이다.
Dog도 sound()를 오버라이딩했다고 가정하면 다음과 같이 한 배열에서 서로 다른 구현을 호출할 수 있다.
JAVA좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
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()가 실행된다.
헷갈리는 개념
표를 좌우로 밀어 나머지 열을 확인하세요. 키보드: ←·→, Home·End
| 호출 대상 | 선택 시점 | 선택 기준 | 상속 관계의 이름 |
|---|---|---|---|
| 오버라이드 가능한 인스턴스 메서드 | 컴파일 시 시그니처 결정 후 실행 시 구현 결정 | 실제 객체 형 | 오버라이딩 |
static 메서드 | 컴파일 시 | 수신 표현식의 선언된 타입 또는 명시한 클래스 | 숨김 |
| 인스턴스 필드 | 컴파일 시 | 필드 접근 표현식의 형 | 숨김 |
super로 호출한 인스턴스 메서드 | 컴파일 시 지정 | 직접 상위 구현 | 동적 오버라이딩 선택 안 함 |
대표 계산·예제
JAVA좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
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();
}
}
실행 결과:
예시·텍스트좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
parent-field
child-method
parent-static
child-static
child-field
child-only
parent-method
결과를 다음 순서로 해석한다.
ref.label은ref의 선언된 타입Parent를 기준으로Parent.label을 읽는다.ref.speak()는 컴파일 시Parent.speak()시그니처를 선택하지만, 실행 시 실제 객체가Child이므로Child.speak()를 호출한다.Parent.kind()와Child.kind()는 각각 명시한 클래스의 정적 메서드를 호출한다.- 다운캐스팅한
child.label은Child형을 기준으로Child.label을 읽는다. child.parentSpeak()안의super.speak()는Parent.speak()를 직접 호출한다.
내 최근 연습 오답
현재 브라우저의 연습 채점 기록에서 공개된 단원과 연결된 오답을 확인합니다.
오답 기록을 확인하고 있습니다.