4.1) OCJP/1Z0-851 / 2012-08-28

OCJP (1Z0-851 / 2012-08-28 / Exam C) - 3 번

kkikkodev 2016. 10. 29. 17:40



관련 이론 및 문법

(기본 생성자, 상속시 부모 생성자 호출, super 참고)

http://kkikkodev.tistory.com/87


문제 의도

주어진 소스코드를 컴파일한 후, 실행한 결과를 고르는 문제입니다.


답안

A


풀이 방법

소스코드를 살펴보면, SimpleCalc 클래스와 MultiCalc 클래스가 정의되어 있는 것을 볼 수 있습니다. 


먼저, SimpleCalc 클래스는 멤버 변수로 int 형 value 를 가지고 있고, 메소드로 calculate 를 갖고 있습니다. 이 calculate 메소드에서는 멤버 변수인 value 에 7 을 누적합니다.



MultiCalc 클래스는 SimpleCalc 클래스를 상속하고 있습니다. 메소드로, calculate 메소드를 2 개 가지고 있는데, 2 번 라인의 calculate 메소드는 SimpleCalc 클래스의 calculate 메소드를 overriding 한 것입니다. 메소드에서는 멤버 변수 value 에서 3 을 빼고 있습니다. 3 번 라인의 calculate 메소드는 매개변수로 int 형 multiplier 를 받고 있습니다. 2 번 라인의 매개변수 없는 calculate 메소드를 overloading 한 것입니다. 메소드 내에서는, 먼저, 매개변수가 없는 calculate 메소드를 호출하고, 그 다음에, 부모의 (SimpleCalc) calculate 메소드를 호출합니다. 부모의 메소드가 자식에서 overriding 되어 있다면, 자식 클래스의 메소드에서, super 를 붙이지 않고, overriding 된 메소드를 호출하면, 자식의 메소드가 호출되고, super.메소드명(); 의 형태로 호출하면, 부모의 메소드가 호출됩니다. 그 다음에, value 에 매개변수로 받은 multiplier 를 곱합니다.


8 번 라인의 main 메소드가 실행되면, 9 번 라인에서 MultiCalc 형의 변수 calculator 를 생성합니다. (멤버 변수 value 의 값은 0) 10 번 라인에서 calculator.calculate(2); 문장을 통해서, 3 번 라인의 calculate 메소드를 호출합니다. (매개변수로 2 를 넘기면서) 그러면, 4 번 라인의 calculate(); 문장을 통해서 MultiCalc 클래스 안의 2 번 라인의 calculate 메소드를 호출합니다. 그러면 현재 value 의 값인 0 에서 3 을 뺀 -3 으로 바뀌게 됩니다. 그 다음에, 5 번 라인의 super.calculate(); 문장을 호출하여 부모 클래스인 SimpleCalc 의 3 번 라인의 calculate 메소드를 호출합니다. 그러면 현재 value 의 값인 -3 에서 7 을 더한 4 로 바뀌게 됩니다. 마지막으로, 6 번 라인의 value *= multiplier; 문장을 실행하여, 현재 value 의 값인 4 에 multiplier 의 값인 2 를 곱하여, 8 로 바뀌게 됩니다. 메소드가 종료되어, main 메소드의 11 번 라인으로 돌아오게 되고, calculator.value 값을 출력하면, 8 이 출력이 됩니다. 따라서 답안은 A 가 됩니다.