
눈으로만 봤을 때.. 이 자식들이..? 싶은 문제.
String str="null";
은 진짜 null이 아니라 그냥 진짜 글자 그대로 "null"이라고 쓴 것이다.
따라서 if문은 false로 else if, else로 넘어간다.
그런데 else if가 없네?
그럼 compile error가 생긴다.
답은 D.

복잡해보여도, main으로 가서 잘 흘러가는대로 print 시키면 되는 문제.
main에서 먼저 Mountain();으로 가라고 하니 Mountain class로 간다.
Mountain();을 살펴보면 super("granite");를 먼저 보게 된다.
super는 extends된 Rock으로 가야하니 class Rock으로 가보면?
얘도 마찬가지로 Atom으로 extends 되어 있으므로 가장 먼저 print되는 것은
atom
그리고 다시 Rock을 보면 type이라고 변수에 granite가 들어가게 된다.
지금까지 프린트 된 것은
atom granite
이제 다시 Mountain(); 속 new Rock("granite")를 해결하러 가보자.
그럼 또다시 방법이 반복되어 print 되는 것은
atom granite atom granite
답은 F.

private ExtendedA(int numberOfInstances) {
super(numberOfInstances);
}
만약 ExtendedA의 생성자가 밖에 있었더라면 private이 문제가 되겠지만, main이 현재 연관이 있으므로 문제가 없다.
이 문제 또한 코드가 굴러가는대로 따라가면 그만인 문제.
error는 없다.
답은 A.

A가 B, C의 조상이라는 걸 먼저 명시하고 시작하자.
ClassB IS-A ClassA.
ClassC IS-A ClassA.
이 문제는 자식이 조상을 참조할 수 있는가, 조상이 자식을 참조할 수 있는가,를 물어보는 문제인 듯 하다. 업캐스팅은 문제 없이 이루어지지만, 다운캐스팅은 다른 방도를 사용해야 하는데, 여기엔 그런 방도가 보이지 않는다.
따라서, 업캐스팅 되고 있는 상황만 valid하게 될 것이다.
업캐스팅이란, 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것이다.
p0는 ClassA 참조이고, p1은 ClassB 객체입니다. ClassB는 ClassA의 서브클래스이므로, ClassB 객체를 ClassA 참조에 할당하는 것은 유효하다.
p1, p2는 서로 자식 부모 관계가 아니다.
ClassC 객체를 ClassA 참조에 할당하는 것은 유효하지만, ClassC 객체를 ClassC 참조에 할당하는 것은 중복되어 유효하지 않다.
p1을 ClassC로 캐스팅하려고 한다. 하지만 ClassB는 ClassC의 자식 클래스가 아니기 때문에, ClassB 객체를 ClassC 객체로 변환할 수 없다.
p3는 ClassA 참조로, 실제로 ClassB 객체를 참조합니다. p3를 ClassB로 캐스팅하는 것은 안전하므로 유효하다.
p4는 ClassA 참조로, 실제로 ClassC 객체를 참조합니다. (ClassC)p4는 유효하므로 할당도 유효하다.
답은 A, E, F

multiply 메서드는 static 메서드이다. 따라서 super.multiply(a, b)를 호출할 수 없다. static 메서드는 인스턴스에 종속되지 않으며, 부모 클래스의 static 메서드에 접근하기 위해서는 클래스 이름을 사용해야 한다.
답은 E