관련 이론 및 문법

(Exception 참고)

http://kkikkodev.tistory.com/173


문제 의도

StackOverflowError 를 야기시킬 가능성이 있는 보기를 2 개 고르는 문제입니다.


답안

D, F


풀이 방법

보기 A 는 5 개의 요소를 가지는 int 형 배열을 선언했는데 for 문에서 y 가 0 에서 5 까지 변경이 되면서 배열에 접근하는데 배열은 4 번째 까지 밖에 존재하지 않으므로 이 범위를 넘어선 번째에 접근하려고 해서 ArrayIndexOutOfBoundsException 이 발생하게 됩니다. 따라서 답안 후보에서 제외합니다.


보기 B 도 마찬가지로 4 개의 요소를 가지는 int 형 static 배열을 static 구문에서 변경하려고 하는데 범위를 벗어난 곳에 접근하려고 하다보니 ArrayIndexOutOfBoundsException 이 발생하게 되고 static 변수 혹은 static 구문의 초기화에서 예외가 발생한 경우에는 ExceptionInInitializerError 가 추가적으로 발생하게 됩니다. 따라서 답안 후보에서 제외합니다.


보기 C 는 doStuff 라는 메소드의 정의부가 외부의 다른곳에 있다고 가정하고 for 문을 보면 y 는 10 으로 초기화되고, y 는 10 보다 작은 동안 반복하므로 거짓이 되어 for 문을 한번도 실행하지 못하게 됩니다. 따라서 아무런 일도 일어나지 않아서 아무 오류도 발생하지 않게 됩니다. 따라서 답안 후보에서 제외합니다.


보기 D 는 doOne, doTwo, doThree 메소드를 정의하고 각 메소드에서 서로의 메소드를 순환적으로 호출하도록 구성되어 있습니다. 만약 외부에서 doOne 메소드를 호출한다고 가정하면, doOne 메소드에서는 doTwo 메소드를 호출하고 doTwo 메소드에서는 doThree 메소드를 호출하고 doThree 메소드에서는 doTwo 메소드를 호출하고 계속해서 메소드가 종료되지 않고 순환적으로 호출하여 스택 메모리를 채우게 되어 StackOverflowError 를 발생시킵니다. 따라서 D 는 답안이 됩니다.


보기 E 는 무수히 많이 doStuff 메소드를 호출하는 문장인데, 어차피 doStuff 메소드가 끝나고 난 후 할당받았던 스택 메모리를 다시 반환한 후, 또 doStuff 메소드가 호출되는 것이기 때문에 다시 스택 메모리를 할당하더라도 상관이 없게 됩니다. 따라서 아무런 오류가 나지 않으므로 답안 후보에서 제외합니다.


보기 F 는 counter 메소드 안에서 counter 메소드를 재귀호출하고 있습니다. 여기서는 종료조건이 없으므로 스택 메모리를 모두 채우게 되고 StackOverflowError 를 발생시킵니다. 따라서 F 는 답안이 됩니다.


결과적으로 D 와 F 가 답안이 됩니다.


by kkikkodev 2016. 11. 13. 01:19