관련 이론 및 문법

(Thread 클래스 참고)

http://kkikkodev.tistory.com/141


(Runnable 인터페이스 참고)

http://kkikkodev.tistory.com/121


문제 의도

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


답안

A, C


풀이 방법

주어진 소스코드를 살펴보면 Threads1 이라는 클래스가 있고, 그 안에 멤버 변수로 int 형 x 가 0 으로 초기화되어 있습니다. 그리고 inner class 로 Runner 클래스가 안에 있습니다. 이 class 는 Runnable 인터페이스를 상속하고 있고, 따라서 run 메소드를 overriding 하고 있습니다. run 메소드에서는 int 형 current 변수를 하나 선언하고, for 문을 4 번 돌면서 current 에 x (Threads1 의 멤버변수) 를 대입하고 화면에 출력한 뒤 다시 current + 2 한 값을 x 에 대입하고 있습니다. (inner class 에서는 outer class 의 멤버들을 자유롭게 접근할 수 있습니다.) 18 라인의 go 메소드에서는 Runner 객체를 하나 생성하고, 이를 토대로 Thread 를 2 개 생성하여 start 하고 있습니다. 즉, 같은 Runnable 객체를 가지는 2 개의 다른 Thread 가 실행되는 것입니다.


각각 다른 2 개의 Thread 가 시작될 것이고, run 메소드를 실행할 것이므로, 각 Thread 당 4 번의 for 문을 돌면서 화면에 출력하게 될 것입니다. 따라서 순서는 어떻게 될지 모르지만, 총 출력 개수는 8 개 (4 개 + 4 개) 이어야 할 것입니다. 따라서 출력 개수가 8 개가 아닌, 보기 D 와 E 는 답안 후보에서 제외합니다.


14 라인의 main 메소드가 호출되어, 그 안에서 Threads1 객체를 생성하여 go 메소드를 호출되었다고 가정하겠습니다. 그러면 go 메소드에서는 Runner inner class 객체를 생성하고 이를 토대로 Thread 를 2 개 (thread1, thread2 라고 가정하겠습니다.) 생성하여 start 메소드를 호출하게 됩니다. 그러면 각 Thread 의 run 메소드를 호출하게 됩니다. run 메소드의 실행 과정을 두 Thread 각 어떻게 실행하는지 살펴보도록 하겠습니다. 


먼저 보기 A 를 살펴보겠습니다. 먼저 thread1 이 for 문의 2 번의 loop 를 실행합니다. i 는 0 -> 1 -> 2 가 되고, current 는 0 -> 2 가 됩니다. 또한 멤버 변수 x 는 0 -> 2 -> 4 가 됩니다. 화면에는 current 값인 "0, 2, " 가 출력됩니다. 그다음에 3 번째 loop 에서는 8 번 라인까지만 실행을 합니다. 그러면 i 는 그대로 2 이고, current 는 4 가 되고, 화면 최종 출력은 "0, 2, 4, " 가 됩니다. 그 다음 thread2 가 총 4 번의 loop 를 실행합니다. i 는 0 -> 1 -> 2 -> 3 -> 4 가 되고, current 는 4 -> 6 -> 8 -> 10 이 됩니다. 또한 멤버 변수 x 는 4 -> 6 -> 8 -> 10 이 됩니다. 화면 최종 출력은 "0, 2, 4, 4, 6, 8, 10, " 이 됩니다. thread2 는 4 번 loop 를 마치고 run 메소드를 종료하고, thread1 의 3 번째의 loop 에서 9 번 라인을 실행하고 마지막 loop 를 실행하면, i 는 2 -> 3 -> 4 가 되고, current 는 4 -> 6 이 되고, 멤버 변수 x 는 10 -> 6 -> 8 이 됩니다. 화면 최종 출력은 "0, 2, 4, 4, 6, 8, 10, 6" 이 됩니다. 따라서 가능한 출력 시퀀스라서 A 는 답안이 됩니다.


보기 B 를 살펴보겠습니다. 먼저 thread1 이 for 문의 1 번의 loop 를 실행합니다. i 는 0 -> 1 이 되고, current 는 0 이 됩니다. 또한 멤버 변수 x 는 0 -> 2 이 됩니다. 화면에는 current 값인 "0, " 이 출력됩니다. 그 다음 thread2 가 총 4 번의 loop 를 실행합니다. i 는 0 -> 1 -> 2 -> 3 -> 4 가 되고, current 는 0 -> 2 -> 4 -> 6 -> 8 이 됩니다. 또한 멤버 변수 x 는 2 -> 4 -> 6 -> 8 -> 10 이 됩니다. 화면 최종 출력은 "0, 2, 4, 6, 8, " 이 됩니다. thread2 는 4 번 loop 를 마치고 run 메소드를 종료하고, thread1 의 2 번째의 loop 를 실행할 차례가 됩니다. 보기의 출력대로라면, 이제 "10, 2, 4, " 가 출력되어야 하는데, 10 까지는 출력되지만, 그 이후로 2 를 출력하게 할 방법이 없으므로 보기 B 는 답안 후보에서 제외됩니다. 


보기 C 를 살펴보겠습니다. 먼저 thread1 이 4 번의 for 문을 실행합니다. i 는 0 -> 1 -> 2 -> 3 -> 4 가 되고, current 는 0 -> 2 -> 4 -> 6 이 됩니다. 멤버 변수 x 는 0 -> 2 -> 4 -> 6 -> 8 이 됩니다. 화면 출력은 "0, 2, 4, 6, " 이 됩니다. 그 다음, thread2 가 4 번의 for 문을 실행합니다. i 는 0 -> 1 -> 2 -> 3 -> 4 가 되고, current 는 6 -> 8 -> 10 -> 12 이 됩니다. 멤버 변수 x 는 8 -> 10 -> 12 -> 14 -> 16 이 됩니다. 화면 출력은 "0, 2, 4, 6, 8, 10, 12, 14, " 이 됩니다. 따라서 가능한 출력 시퀀스라서 C 는 답안이 됩니다.


결과적으로 A 와 C 가 답안이 됩니다.


by kkikkodev 2016. 11. 5. 12:28