재구성 출제 고지: 이 편은 국가평생교육진흥원 독학학위제 컴퓨터과학 전공 3단계 「프로그래밍언어론」의 최신 출제기준(평가영역) 중 식·할당·단락 평가, 하위프로그램 구현, 병행성, 예외 처리, 함수형·논리형 언어 영역을 근거로 새로 구성한 코드·모델 중심 재구성 문항 24개입니다. 실제 특정 회차의 기출 문항을 그대로 옮기거나 암기해 재현한 것이 아니며, 1215·1923편에서 다룬 개념을 실행 결과 추적 형태로 재구성했습니다. 실제 응시 시 문항 수·배점·시험 시간은 그해 시행 공고를 반드시 확인하시기 바랍니다. 아래 의사코드는 특정 프로그래밍언어의 실제 문법이 아니라 개념 비교를 위한 교육용 표기입니다.
풀이 전략과 이 편의 구성
코드·모델형 문제는 답을 외워서 맞히는 것이 불가능합니다. 실행 순서를 한 줄씩 손으로 따라가며 변수·스택·메시지의 상태를 직접 적어 보는 습관이 유일한 대비법입니다. 아래 표는 24개 문항이 다루는 영역과, 풀이 시 반드시 확인해야 할 확인 포인트를 정리한 것입니다.
| 문항 번호 | 출제기준 영역 | 관련 편 | 풀이 시 확인 포인트 |
|---|---|---|---|
| 1–2 | 연산자 우선순위·결합법칙 | 12편 | 우선순위표를 암기가 아니라 유도로 확인 |
| 3–4 | l-value vs r-value, 할당 모델 | 12편 | 대입문 왼쪽·오른쪽의 역할 구분 |
| 5–7 | 단락 평가(short-circuit)와 부작용 | 12편 | 어느 피연산자가 실제로 평가되는지 |
| 8–9 | 활성화 레코드·재귀 스택 추적 | 15편 | 스택에 몇 개의 레코드가 동시에 있는지 |
| 10–11 | 세마포어·모니터 시나리오 | 19편 | P·V 순서, 조건변수 대기·신호 시점 |
| 12 | 메시지 전달 동기화 | 19편 | 메시지 전송·수신 순서 |
| 13–14 | 예외 처리(try-catch-finally)·전파 | 20편 | finally 실행 여부, 어느 핸들러가 잡는지 |
| 15 | 이벤트 핸들링 | 20편 | 콜백이 언제 호출되는지 |
| 16–17 | 람다·순수 함수·고차 함수 | 22편 | 부작용 유무, 함수를 값으로 전달하는지 |
| 18–19 | 불변성(immutability) | 22편 | 재할당 시도 시 어떤 일이 일어나는지 |
| 20–21 | Prolog 사실·규칙·단일화·백트래킹 | 23편 | 질의가 어떤 순서로 해를 찾는지 |
| 22–23 | 컴파일러·인터프리터의 오류 발견 시점 | 21편 | 정적 오류 vs 런타임 오류 |
| 24 | 재귀 vs 반복 종합 | 15·22편 | 스택 사용량과 실행 방식 비교 |
문제 1
문제 2
문제 3
다음 대입문에서 각 위치의 역할을 생각해 보자.
x = y + 1문제 4
문제 5
increment()는 호출될 때마다 전역 변수 count를 1씩 늘리고 true를 반환하는 하위프로그램이라고 하자.
전역 변수 count = 0
function increment():
count = count + 1
true를 반환한다
조건 = false and increment() // 단락 평가를 지원하는 언어문제 6
문제 5와 동일한 코드이지만, 이번에는 이 언어의 and 연산자가 단락 평가를 지원하지 않고 항상 양쪽 피연산자를 모두 평가한다고 가정한다.
문제 7
문제 8
다음 재귀 함수는 n부터 1까지의 합을 구한다.
function sumTo(n):
만약 n <= 0이면 0을 반환한다
아니면 n + sumTo(n - 1)을 반환한다
sumTo(3)을 호출한다문제 9
문제 10
두 프로세스 A, B가 공유 세마포어 S(초기값 1)를 이용해 임계 구역에 접근한다고 하자.
프로세스 A:
P(S)
임계 구역 실행
V(S)
프로세스 B:
P(S)
임계 구역 실행
V(S)문제 11
모니터 안에 조건 변수(condition variable) notFull이 있고, 생산자 프로세스가 버퍼가 가득 찬 경우 notFull.wait()으로 대기하고, 소비자 프로세스가 버퍼에서 항목을 꺼낸 뒤 notFull.signal()로 대기 중인 생산자를 깨운다고 하자.
문제 12
프로세스 P가 프로세스 Q에게 메시지를 보내고 응답을 기다리는 동기(synchronous) 메시지 전달 방식이 있다고 하자.
프로세스 P:
Q에게 요청 메시지를 보낸다
Q로부터 응답 메시지를 받을 때까지 기다린다
응답을 처리한다
프로세스 Q:
P로부터 요청 메시지를 받을 때까지 기다린다
요청을 처리한다
P에게 응답 메시지를 보낸다문제 13
다음과 같은 예외 처리 구조가 있다고 하자.
try:
1을 출력한다
0으로 나누기를 시도해 예외를 발생시킨다
2를 출력한다 // 예외 때문에 이 줄은 실행되지 않는다
catch (DivideByZeroException e):
3을 출력한다
finally:
4를 출력한다
5를 출력한다문제 14
다음은 세 겹으로 중첩된 하위프로그램 호출에서 예외가 발생하는 상황이다.
procedure outer():
try:
call middle()
catch (MyException e):
A를 출력한다
procedure middle():
call inner() // middle에는 이 예외를 처리하는 catch가 없다
procedure inner():
MyException을 발생시킨다문제 15
버튼 클릭 시 실행될 콜백 함수를 등록해 두는 이벤트 기반 프로그램이 있다고 하자.
버튼.onClick(콜백함수)로 등록해 둔다
(프로그램은 여기서 사용자의 입력을 기다린다)
... 시간이 흐른 뒤 사용자가 버튼을 클릭한다 ...문제 16
문제 17
고차 함수(higher-order function)의 대표적인 예로 리스트의 각 원소에 함수를 적용하는 map 연산이 있다. 리스트 [1, 2, 3]에 double 함수를 map으로 적용한다고 하자.
문제 18
불변(immutable) 값을 사용하는 함수형 스타일의 언어에서 다음과 같은 코드를 작성했다고 하자.
x = 5 // 한 번 값이 정해지면 다시 바꿀 수 없는 불변 바인딩
x = x + 1 // 같은 이름 x에 다시 대입을 시도문제 19
문제 20
다음과 같은 Prolog 스타일의 사실과 규칙이 있다고 하자.
사실: 부모(철수, 영희).
사실: 부모(영희, 민수).
규칙: 조부모(X, Y) :- 부모(X, Z), 부모(Z, Y).
질의: ?- 조부모(철수, 민수).문제 21
이번에는 사실이 다음과 같이 추가되어 영희가 두 사람의 부모인 경우를 생각한다.
사실: 부모(철수, 영희).
사실: 부모(영희, 민수).
사실: 부모(영희, 지수).
규칙: 조부모(X, Y) :- 부모(X, Z), 부모(Z, Y).
질의: ?- 조부모(철수, W).문제 22
문제 23
문제 24
참고 자료
- 국가평생교육진흥원 독학학위제 — https://bdes.nile.or.kr
- SWI-Prolog Reference Manual, Unification and backtracking — https://www.swi-prolog.org/pldoc/man?section=unify