본문 바로가기
CS/프로그래밍언어론

방송대 프로그래밍 언어론 기출문제 오답률 높은 문제들 정리 및 해설

by Renechoi 2023. 12. 8.

(1~2) BNF로 표현된 다음 구문을 예제로 질문에 답하시오. (2014 출석)

<수> ::= <숫자〉 | <수><숫자>
<숫자>::=0|1|2|3|4|5|6|7|8|9

1. 위 구문에 대한 설명으로 올바른 것은 무엇인가?

  1. <수〉는 비단말 기호임
  2. |는 메타 기호로 연결을 의미
  3. 서로 다른 비단말 기호가 다섯 번 나옴
  4. 단말기호는 1,2,3,4,5,6,7,8,9 밖에 없음

정답: 1

해설:
<수>는 비단말 기호로, 숫자의 연속을 나타내는 규칙을 정의한다. BNF에서 비단말 기호는 재귀적으로 정의될 수 있는 기호로, 이 경우 <수>는 하나 이상의 <숫자>로 구성될 수 있다.

오답 선지 해설:

  • 2번: "|" 기호는 선택을 의미하는 메타 기호이며, 연결을 나타내는 것은 아니다.
  • 3번: 서로 다른 비단말 기호는 두 개(<수>, <숫자>)뿐이다.
  • 4번: 단말기호는 0부터 9까지의 숫자들이며, 이는 <숫자>의 정의에 명시되어 있다.

2. 위 구문에서 <수>를 EBNF로 올바르게 나타낸 것은?

  1. <수>::= <숫자〉[<숫자>]
  2. <수>::= <숫자〉{<숫자〉}
  3. <수〉::= [<숫자>]
  4. <수〉::= {<숫자>}

정답: 2

해설:
EBNF에서 <수>는 하나의 <숫자> 뒤에 0개 이상의 <숫자>가 올 수 있음을 의미한다. 이는 옵션(괄호 안의 내용이 있거나 없을 수 있음)과 반복(괄호 안의 내용이 여러 번 반복될 수 있음)을 나타내는 중괄호 "{}"를 사용하여 표현된다. 따라서 "<수>::= <숫자>{<숫자>}"가 올바른 표현이다.

오답 선지 해설:

  • 1번: "[<숫자>]"는 <숫자>가 0번 또는 1번 등장할 수 있음을 의미하지만, 여러 번 반복될 수는 없다.
  • 3번과 4번: 둘 다 괄호 내의 <숫자>가 옵션으로 표현되어 있으며, 반복을 나타내지 않는다.

3. 파스 트리에 대한 설명으로 틀린 것은?

  1. 주어진 BNF에 의해 어떤 표현이 생성될 수 있는지 확인하기 위해 작성하는 트리
  2. 비단말 노드의 나열이 주어진 BNF로 생성 가능한 표현임
  3. 주어진 표현에 대한 파스 트리가 존재하면 그 표현은 주어 진 BNF에 의해 작성된 표현으로 결정
  4. 모호한 문법인 경우 주어진 표현에 대해 서로 다른 파스 트 리가 존재

정답: 2

해설:
파스 트리는 주어진 문법으로 생성된 표현의 구조를 나타내는 트리 형태의 도구이다. 이 트리는 주어진 문법에 의해 생성 가능한 표현을 확인하기 위해 사용된다. 비단말 노드와 단말 노드가 트리 형태로 배열되어, 주어진 문법으로 생성된 표현의 구조를 나타낸다.

오답 선지 해설:

  • 2번: 파스 트리의 비단말 노드 나열이 주어진 BNF로 생성 가능한 표현이라는 것은 잘못된 주장이다. 비단말 노드는 규칙을 나타내지만, 단말 노드까지 포함한 전체 구조가 문법에 의해 생성된 표현을 나타낸다.
  • 4번: 모호한 문법의 경우, 주어진 표현에 대해 다른 파스 트리가 존재할 수 있다는 것은 올바른 주장이다.

4. 다음 현수 else 문제 해결방안 중 의미가 다른 것은?

  1. if cond1 then begin if cond2 then S1 end else S2
  2. if cond1 then if cond2 then S1 fi else S2 fi
  3. if cond1 then if cond2 then S1 else S2
  4. if cond1 then if cond2 then S1 else else S2

정답: 3

해설: 이 문제에서 올바른 구문은 중첩된 if-else 문을 사용하여 다양한 조건에 따라 다른 명령어를 실행하도록 하는 것이다. 1, 2, 4번은 모두 'cond1'이 참일 때만 'cond2'를 확인하고, 그 결과에 따라 S1 또는 S2를 실행한다. 하지만 3번은 'cond1'이 참일 때 'cond2'와 관계없이 항상 S1을 실행하고, 'cond1'이 거짓일 때만 S2를 실행한다. 이는 나머지 선지와 구조적으로 다르다.

오답 선지 해설:

  1. 이 구문은 'cond1'과 'cond2'가 모두 참일 때만 S1을 실행하고, 'cond2'가 거짓일 때 S2를 실행한다.
  2. 이 구문도 'cond1'과 'cond2'가 모두 참일 때만 S1을 실행하고, 그렇지 않을 때 S2를 실행한다.
  3. 이 구문은 구문적 오류를 포함하고 있지만, 의도적으로 'cond1'이 참이고 'cond2'가 거짓일 때만 S2를 실행하도록 설계되었다고 볼 수 있다.

5. 다음 중 컴파일 기법의 구성요소가 아닌 것은 무엇인가?

  1. 프리프로세서
  2. 어셈블러
  3. 링커
  4. 인터프리터

정답: 4

해설: 컴파일러는 소스 코드를 기계어로 변환하는 과정을 포함하며, 이 과정에는 프리프로세서, 어셈블러, 링커 등이 포함된다. 프리프로세서는 전처리 과정을 담당하고, 어셈블러는 어셈블리 언어를 기계어로 변환한다. 링커는 여러 개의 오브젝트 파일을 하나로 결합한다. 반면, 인터프리터는 소스 코드를 직접 실행하며, 컴파일 과정을 거치지 않는다. 따라서 인터프리터는 컴파일 기법의 구성요소가 아니다.

오답 선지 해설:

  1. 프리프로세서는 컴파일 과정의 초기 단계에서 매크로 처리와 파일 포함 등을 담당한다.
  2. 어셈블러는 소스 코드를 기계어 코드로 변환하는 중요한 역할을 한다.
  3. 링커는 컴파일된 여러 코드 조각을 하나의 실행 파일로 결합한다.

6. 변수의 네 가지 요소에 해당하지 않는 것은 무엇인가?

  1. 자료값
  2. 식별자
  3. 명령어
  4. 자료속성의 집합

정답: 3

해설: 변수는 프로그래밍에서 데이터를 저장하기 위한 공간으로, 주로 자료값, 식별자, 자료속성의 집합 등으로 구성된다. 자료값은 변수에 저장된 실제 값이고, 식별자는 변수를 구분하는 데 사용되는 이름이다. 자료속성의 집합은 변수의 타입, 범위 등을 정의한다. 반면, 명령어는 변수의 요소가 아니라 프로그램을 실행하는 데 사용되는 지시사항이다. 따라서 '명령어'는 변수의 네 가지 요소에 해당하지 않는다.

오답 선지 해설:

  1. 자료값은 변수에 저장된 실제 데이터를 말한다.
  2. 식별자는 변수를 구별하기 위한 고유한 이름이다.
  3. 자료속성의 집합은 변수의 타입, 범위 등을 정의하는 요소들을 포함한다.

7. 바인딩 시간의 종류와 거리가 먼 것은 무엇인가?

  1. 실행 시간
  2. 디버깅 시간
  3. 언어의 구현 시간
  4. 언어의 정의 시간

정답: 2

해설: 바인딩 시간은 프로그램의 변수나 함수 등이 실제 값이나 메모리 주소와 연결되는 시점을 의미한다. 실행 시간(1), 언어의 구현 시간(3), 언어의 정의 시간(4) 등은 바인딩이 발생할 수 있는 다양한 시점을 나타낸다. 그러나 디버깅 시간(2)은 바인딩과 직접적인 관련이 없는 시간으로, 프로그램의 오류를 찾고 수정하는 과정을 말한다.

오답 선지 해설: 1번의 실행 시간은 프로그램이 실행되는 동안 변수 등이 특정 값이나 주소와 연결되는 시간이므로 바인딩과 관련이 깊다. 3번 언어의 구현 시간과 4번 언어의 정의 시간도 언어가 설계되고 구현되는 과정에서 바인딩이 이루어질 수 있어 바인딩과 관련이 있다.

8. 다음 중 할당문에 해당하는 것은 무엇인가?

  1. A == B
  2. A >= B
  3. A ? B : C
  4. A++

정답: 4

해설: 할당문은 변수에 값을 할당하는 문장을 의미한다. A++(4)는 A에 1을 더해서 다시 A에 할당하는 표현으로, 할당문에 해당한다.

오답 선지 해설: 1번 A == B는 비교 연산자를 사용한 조건문이며, 할당이 아니다. 2번 A >= B도 비교 연산자를 사용한 조건문이다. 3번 A ? B : C는 조건 연산자를 사용한 조건문으로, 이 역시 할당문이 아니다.

(9〜10) EBNF로 표현된 다음 구문을 예제로 질문에 답하시오. (2015 출석)

<BNF-rule> ::= <left-part> '::=' <right-part> 
<right-part> ::= <RPE> | <right-part> '|' <RPE>

9. 위 구문에 대한 설명으로 올바른 것은 무엇인가?

  1. <BNF-rule>은 단말 기호임
  2. '::='는 메타 기호로 정의를 의미
  3. | 는 비단말 기호임
  4. 서로 다른 비단말 기호가 네가지 있음

정답: 4

해설: 이 문제는 EBNF 표기법에 대한 이해를 묻는 것이다. EBNF(Extended Backus-Naur Form)는 문법을 정의하는 데 사용되는 표기법이다. 주어진 구문에서 <BNF-rule>은 하나의 문법 규칙을 정의한다. '::='는 대입을 의미하는 메타기호이며, '|' 기호는 선택을 의미한다. 이 문제의 정답은 "서로 다른 비단말 기호가 네 가지 있음"을 의미하는 4번이다. 이는 <BNF-rule>, <left-part>, <right-part>, <RPE> 네 가지 비단말 기호가 사용되었기 때문이다.

오답 선지 해설: 1번 "<BNF-rule>은 단말 기호임"은 잘못되었으며, <BNF-rule>은 비단말 기호이다. 2번 "::=는 메타 기호로 정의를 의미"는 맞는 설명이지만 이 문제의 정답이 아니다. 3번 "|는 비단말 기호임" 역시 잘못된 설명이며, '|'는 선택을 나타내는 메타기호이다.

10. 위 구문의 <right-part>와 정의가 동일한 것은 무엇인가?

  1. <right-part>::= <RPE> [ '|' <RPE> ]
  2. <right-part> ::= <RPE> { '|' <RPE> }
  3. <right-part> ::= [ <RPE> ]
  4. <right-part> ::= { <RPE> }

정답: 2

해설: 이 문제는 EBNF 표기법의 이해를 묻는 것으로, 주어진 문법에서 <right-part>의 정의는 "<RPE>" 또는 "<right-part> '|' <RPE>" 중 하나이다. 이를 간결하게 표현하면, "<RPE> 뒤에 0개 이상의 "'|' <RPE>"가 올 수 있다는 것을 의미한다. 이에 해당하는 선택지는 2번 "<right-part> ::= <RPE> { '|' <RPE> }"이다. 여기서 중괄호 {}는 0회 이상 반복을 의미한다.

오답 선지 해설: 1번은 옵셔널(optional) 표현을 사용하고 있으나, 이는 오직 한 번만 '| <RPE>'를 허용한다. 3번과 4번은 각각 옵셔널과 반복을 나타내지만, 주어진 문법의 의미와는 다르다.

11. 컴파일 기법에 대한 설명이 으t난 것은 무엇인가?

  1. 추가 기억장소가 필요 없음
  2. 반복 처리가 많은 프로그램에 효율적
  3. 실행 시간이 중요한 경우에 적합
  4. 한번 번역된 코드는 다시 번역할 필요 없음

정답: 1

해설: 컴파일 기법은 고급 언어로 작성된 프로그램을 기계어 코드로 변환하는 과정을 말한다. 이 과정은 소스 코드를 한 번에 전체적으로 번역하기 때문에, 번역된 코드는 실행 시 다시 번역할 필요가 없다. 따라서 정답은 "한번 번역된 코드는 다시 번역할 필요 없음"을 의미하는 4번이다.

오답 선지 해설: 1번 "추가 기억장소가 필요 없음"은 컴파일러의 특성과 관련이 없다. 2번 "반복 처리가 많은 프로그램에 효율적"과 3번 "실행 시간이 중요한 경우에 적합"은 컴파일된 프로그램의 특성이기는 하나, 이 문제에서 묻는 컴파일 기법의 정의와는 직접적인 관련이 없다.

12. 변수의 네 가지 요소에 해당하지 않는 것은 무엇인가?

  1. 식별자
  2. 자료속성의 집합
  3. 주소
  4. 예약어

정답: 4

해설: 변수의 네 가지 주요 요소는 식별자, 자료형, 주소, 그리고 값이다. 예약어는 이 중 어떤 것에도 해당하지 않으며, 프로그래밍 언어에서 특정한 목적을 위해 미리 지정된 단어이다.

오답 선지 해설:

  1. 식별자는 변수를 구별하는 데 사용되는 이름이다.
  2. 자료속성의 집합은 변수의 자료형을 의미하며, 변수가 어떤 종류의 데이터를 저장할 수 있는지 결정한다.
  3. 주소는 메모리에서 변수가 위치한 곳을 나타낸다.

13. 바인딩 시간과 예가 올바르게 짝지어진 것은 무엇인가?

  1. 동적 바인딩 - 변수의 값
  2. 정적 바인딩 - 변수의주소
  3. 언어의 구현 시간 - 프로그램 내의 상수를 10진수로 간주
  4. 언어의 정의 시간-정수의자릿수

정답: 1

해설: 동적 바인딩은 프로그램 실행 중에 변수의 값이 결정되는 것을 의미한다. 이는 변수가 실행 시간에 값이 할당되거나 변경될 수 있음을 뜻한다.

오답 선지 해설:
2. 정적 바인딩은 컴파일 시간에 변수의 주소가 결정되는 것을 말한다.
3. 언어의 구현 시간 바인딩은 프로그램이 컴파일되는 시점에 결정되는 것들을 의미한다.
4. 언어의 정의 시간 바인딩은 언어가 정의될 때 결정되는 요소들, 예를 들어 연산자의 의미, 수의 의미 같은 것들을 의미한다.

14. 선언문의 목적과 거리가 먼 것은 무엇인가?

  1. 주기억장치 사용의 효율성
  2. 주기억장치 접근방법의 효율성
  3. 동적형 검사 가능
  4. 주기억장치 경영의 효율성

정답: 3

해설: 선언문은 변수나 함수 등의 식별자에 대한 정보를 컴파일러에 제공하기 위해 사용된다. 주기억장치 사용의 효율성, 주기억장치 접근방법의 효율성, 주기억장치 경영의 효율성 등은 모두 메모리 관리와 관련이 있다. 반면, 동적형 검사는 실행 시간에 타입을 확인하는 방법이므로 선언문과의 직접적인 관련성이 적다.

오답 선지 해설:

  1. 주기억장치 사용의 효율성: 선언문은 변수의 타입과 크기를 정의하여 메모리 사용을 최적화하는 데 도움을 준다.
  2. 주기억장치 접근방법의 효율성: 타입에 따라 최적의 메모리 접근 방식을 결정하는 데 선언문이 기여한다.
  3. 주기억장치 경영의 효율성: 선언문은 메모리 할당과 해제를 관리하는 데 중요한 역할을 한다.

15. 할당문의 종류와 예가 올바르게 짝지어진 것은 무엇인가?

  1. 단순 할당문: A+=B
  2. 다중 목적 변수 할당문: A,B=C
  3. 복합 할당 연산자: A++
  4. 혼합형 할당문: flag?A:B=C

정답: 2

해설: 할당문의 종류 중에서 다중 목적 변수 할당문은 한 번의 할당으로 여러 변수에 값을 할당하는 것을 의미한다. "A,B=C"는 C의 값을 A와 B에 동시에 할당하는 다중 목적 변수 할당문의 예시이다.

오답 선지 해설:

  1. 단순 할당문: A+=B는 복합 할당 연산자의 예시로, 단순 할당문이 아니다.
  2. 복합 할당 연산자: A++는 증가 연산자로, 복합 할당 연산자가 아니다.
  3. 혼합형 할당문: flag?A:B=C는 조건부 할당문의 예로, 혼합형 할당문의 정의와는 다르다.

16. 프로그래밍 언어의 구조에 대한 설명이 잘못 짝지어진 것은?

  1. 문자-영어 알파벳과 아라비아 숫자를 주로이용
  2. 어휘-프로그래밍 언어 문자로 구성된단어
  3. 토큰-한 개 이상의 어휘를 이용한 구문적으로 허용된 구조
  4. 구문-프로그래밍 언어로 프로그램을 작성하는 규칙

정답: 3

해설:
토큰은 프로그래밍 언어에서 구문적으로 의미 있는 최소 단위이다. 이는 하나 이상의 문자로 구성되지만, '한 개 이상의 어휘를 이용한'이라고 설명하는 것은 정확하지 않다. 보통 토큰은 키워드, 연산자, 식별자, 리터럴 등으로 분류되며, 단일 어휘로도 토큰이 될 수 있다.

오답 선지 해설:

  1. 문자는 프로그래밍 언어의 기본 구성 요소로, 대부분의 언어가 영어 알파벳과 아라비아 숫자를 사용한다.
  2. 어휘는 프로그래밍 언어의 문자로 구성된 단어를 의미하며, 이는 토큰을 형성하는 기본 요소이다.
  3. 구문은 프로그래밍 언어에서 프로그램을 작성하기 위한 규칙과 구조를 정의한다. 이는 프로그램의 문법적인 틀을 제공한다.

17. BNF에 대한 설명으로 바른 것은?

  1. 구문에 대한 형식 정의를 하는 방법
  2. 생성 규칙의 오른쪽 부분은 정의될 대상임
  3. 생성 규칙의 왼쪽 부분은 정의될 대상에 대한 정의임
  4. {x}는 표가 나타나지 않거나 한번 나타날 수 있음

정답: 1

해설:
BNF(Backus-Naur Form)는 컴퓨터 언어의 구문을 정의하기 위한 형식적인 표기법이다. 구문 규칙을 명시적으로 표현하는 데 사용되며, 컴파일러 설계와 프로그래밍 언어의 문법을 명확히 정의하는 데 중요한 역할을 한다.

오답 선지 해설:
2. 생성 규칙의 오른쪽 부분은 정의될 대상의 형식이나 구조를 명시한다.
3. 생성 규칙의 왼쪽 부분은 정의될 대상, 즉 비터미널 심볼을 나타낸다.
4. {x}는 BNF에서 'x'가 0번 또는 여러 번 반복될 수 있음을 의미한다. '표가 나타나지 않거나 한번 나타날 수 있음'이라는 설명은 '{x}'의 의미를 정확히 반영하지 않는다.

18. BNF 표기법에 대한 설명으로 잘못된 것은?

  1. 비단말기호 - 각괄호 < > 로 묶인 기호
  2. 단말기호 - 각 괄호로 묶이지 않은 기호로 예약어 등 존재
  3. 메타기호::= - 정의
  4. 메타기호 | - 반복

정답: 4

해설: BNF(Backus-Naur Form) 표기법에서 메타기호 '|'는 선택을 나타내며, 반복을 나타내지 않는다. 반복은 일반적으로 순환 정의를 통해 표현된다.

오답 선지 해설: 4번 선지에서 언급된 메타기호 '|'는 BNF에서 여러 대안 중 하나를 선택할 때 사용된다. 예를 들어, <문자열> ::= <문자> | <문자><문자열>에서 '|'는 '<문자>'와 '<문자><문자열>' 중 하나를 선택하라는 의미이다. 반복을 나타내는 것이 아니므로 4번이 잘못된 설명이다.

19. 구문 도표에 대한 설명으로 바른 것은?

  1. 구문에 대한 형식 정의를 하는 유일한 방법
  2. 순서도와 비슷하며,EBNF 선언과 바로 대응시킬 수 있음
  3. 비단말 기호는 원으로 표시
  4. 단말 기호는 사각형으로 표시

정답: 2

해설: 구문 도표는 프로그래밍 언어의 구문을 시각적으로 표현하는 도구로, 순서도와 유사한 형태를 띠며 EBNF(Extended Backus-Naur Form) 표기법에 대응하여 사용된다. 이는 구문의 흐름과 구조를 명확하게 보여주는데 유용하다.

오답 선지 해설: 1번 선지는 구문 도표가 구문에 대한 형식 정의를 하는 유일한 방법이라고 주장하는데, 이는 사실이 아니다. 구문 도표 외에도 BNF, EBNF 같은 다른 방법들도 구문 정의에 사용된다. 3번과 4번 선지는 비단말 기호와 단말 기호를 어떻게 표시하는지에 대해 정확한 정보를 제공한다.

20. 선언에 대한 설명과 거리가 먼 것은?

  1. 바인딩을 제공하는 중요한 방법
  2. 실행시 사용 될 자료의 속성을 컴파일러 등에게 알려주는것
  3. 묵시적 선언만 존재
  4. 정적형 검사를 가능하게 함

정답: 3

해설: 프로그래밍에서 선언은 변수나 함수 등의 식별자에 대한 특성을 정의하고, 이를 컴파일러에게 알려주는 역할을 한다. 이는 명시적 선언과 묵시적 선언 두 가지 형태로 존재한다.

오답 선지 해설: 3번 선지는 오직 '묵시적 선언만 존재한다'고 주장하는데, 이는 사실과 다르다. 선언은 명시적과 묵시적 두 형태 모두를 포함한다. 명시적 선언은 개발자가 직접 타입이나 범위 등을 지정하는 것을 말하며, 묵시적 선언은 컴파일러나 인터프리터가 자동으로 타입을 결정하는 경우를 의미한다.

21. 구문 도표에 대한 설명으로 바른 것은?

  1. 구문에 대한 형식 정의를 하는 방법
  2. BNF와는 대응되지만 EBNF와는 대응이 안됨
  3. BNF의 | 는 세 갈래의 화살표와 대응
  4. EBNF의 [ ] 는 반복이 가능한 원형의 화살표와 대응

정답: 1

해설: 구문 도표는 프로그래밍 언어의 구문을 도식적으로 나타내는 방법이다. 이는 프로그래밍 언어의 구조를 보다 직관적으로 이해할 수 있도록 도와준다. 구문 도표는 일반적으로 BNF(Backus-Naur Form) 또는 EBNF(Extended Backus-Naur Form)와 같은 형식 정의 방법을 사용하여 구문을 정의한다. 구문 도표를 통해 개발자들은 프로그래밍 언어의 구조적 요소들을 더 명확하게 파악하고, 올바른 문법 구조를 더 쉽게 이해할 수 있다.

오답 선지 해설:
2. BNF와 EBNF 모두 구문 정의에 사용되는 표기법이며, 구문 도표는 두 방법과 모두 대응할 수 있다. BNF는 간단한 구문 정의에 적합한 반면, EBNF는 보다 복잡한 구문 구조를 나타내는 데 유용하다.
3. BNF의 '|' 기호는 선택을 나타내며, 이는 구문 도표에서 선택적 경로를 의미하는 분기 화살표로 표현될 수 있다. '|' 기호는 여러 대안 중 하나를 선택할 수 있음을 나타낸다.
4. EBNF의 '[]' 기호는 선택적 요소를 나타내며, 구문 도표에서는 이를 선택적 경로나 조건부 경로로 표현할 수 있다. '[]' 내의 요소는 있어도 되고 없어도 되는 선택적인 부분임을 의미한다.

22. 다음 프로그램 문장에서 각 요소에 대한 반인딩 시각을 바르게 설명한 것은?

B = 1;
B = B +2;
A = B + 10;
  1. 변수 A의 값(13) - 실행 시간
  2. 변수 B의 값(3) - 번역 시간
  3. 상수 10의 진법(10진법) - 실행 시간
  4. 기호 +의 의미(덧셈) - 번역 시간

정답: 1

해설: 이 프로그램 문장에서 변수 AB의 값은 실행 시간에 결정된다. 변수 B는 처음에 1로 초기화되고, 그 다음 문장에서 2가 더해져 최종적으로 3이 된다. 이후 A = B + 10; 문장에서 B의 값(3)에 10을 더해 변수 A의 값은 13이 된다. 따라서 변수 A의 값은 실행 시간에 결정되며, 그 값은 13이다.

오답 선지 해설:
2. 변수 B의 값은 번역 시간에 결정되는 것이 아니라 실행 시간에 결정된다. B = 1;에서 초기화되고, B = B + 2;에서 수정되어 최종적으로 3이 된다.
3. 상수 10의 진법은 프로그램의 소스 코드가 작성될 때 결정되며, 실행 시간에 영향을 받지 않는다. 상수 10은 항상 10진법으로 표현되며, 이는 실행 시간과 무관하다.
4. 기호 '+'의 의미는 번역 시간에 결정된다. 이 기호는 프로그램이 컴파일되는 동안 해석되어 덧셈 연산을 나타내며, 실행 시간에는 이미 그 의미가 정해져 있다.

23. 중간 코드 실행 기법에 대한 설명으로 바른 것은?

  1. 인터프리트를 먼저 적용한 후 컴파일 하여 실행
  2. Java는 중간 코드 실행 기법을 이용
  3. 컴파일 기법의 언어보다 프로그램 실행 속도가 빠름
  4. 운영 체제가 바뀌면 컴파일을 다시 해야 함

정답: 2

해설: 중간 코드 실행 기법은 프로그램을 직접 기계어로 컴파일하는 대신, 중간 단계의 코드로 변환하고, 이를 실행 시간에 기계어로 번역해 실행하는 방식이다. Java는 이 기법을 이용하여, 소스 코드를 바이트코드라는 플랫폼 독립적인 중간 형태로 컴파일한 후, JVM(Java Virtual Machine)에서 이 바이트코드를 실행 시간에 특정 플랫폼의 기계어로 변환하여 실행한다. 이 접근 방식은 다양한 운영 체제와 하드웨어에서 Java 프로그램을 실행할 수 있게 해준다.

오답 선지 해설:

  1. 이 설명은 인터프리터와 컴파일러의 결합 형태인 JIT(Just-In-Time) 컴파일러의 동작 방식을 잘못 설명한 것이다. JIT 컴파일러는 프로그램을 실행할 때 바이트코드를 기계어로 변환한다. 인터프리트를 먼저 적용한 후 컴파일하는 것은 정확한 기술적 설명이 아니다.
  2. 중간 코드 실행 기법을 사용하는 언어가 컴파일 기법의 언어보다 항상 프로그램 실행 속도가 빠르다고 할 수 없다. 실제 실행 속도는 여러 요인에 의해 달라지며, 경우에 따라서는 직접 기계어로 컴파일된 프로그램이 더 빠를 수 있다.
  3. 중간 코드 실행 기법을 사용하는 Java와 같은 언어에서는 운영 체제가 바뀌어도 소스 코드를 다시 컴파일할 필요가 없다. 바이트코드는 플랫폼 독립적이므로, 다른 운영 체제에서도 JVM이 해당 플랫폼의 기계어로 바이트코드를 변환하여 실행할 수 있다.

24. 어셈블리 언어를 저급 언어(목적 언어)로 만들어 주는 번역기는?

  1. 컴파일러
  2. 어셈블러
  3. 링커
  4. 로더

정답: 2

해설: 어셈블러는 어셈블리 언어를 저급 언어, 즉 기계어로 번역하는 프로그램이다. 이 과정에서 어셈블리 언어의 명령어가 기계가 이해할 수 있는 바이너리 코드로 변환된다. 따라서 어셈블러는 개발자가 작성한 어셈블리 코드를 컴퓨터가 실행할 수 있는 목적 코드로 변환하는 중요한 역할을 한다.

오답 선지 해설:

  1. 컴파일러는 고급 언어를 저급 언어로 번역하지만, 어셈블리 언어는 아니다.
  2. 링커는 여러 개의 객체 파일을 하나의 실행 파일로 결합하지만 번역은 하지 않는다.
  3. 로더는 컴퓨터 메모리에 프로그램을 적재하는 역할을 하며 번역과는 관련이 없다.

25. 포인터 자료형에 대한 설명으로 바른 것은 무엇인가?

  1. 초기화된 후에 다른 변수를 참조하도록 변경될 수 없음
  2. 묵시적으로 항상 역참조되는 상수 포인터
  3. 객체를 참조하기 위한 기억장치 주소를 값으로 취함
  4. 여러 자료를 묶어서 하나의 단위로 처리할 수 있으나 자료 형이 동일해야 함

정답: 1,2,3 (복수 개)

해설: 포인터는 메모리 주소를 값으로 가지는 변수로, 다른 변수나 객체의 위치를 가리키는 데 사용된다. 포인터는 역참조를 통해 가리키는 객체의 값을 얻을 수 있으며, 프로그램에서 동적으로 메모리를 할당하고 관리하는 데 필수적인 역할을 한다.

오답 선지 해설:

  1. 포인터는 초기화 이후에도 다른 변수를 참조하도록 변경할 수 있다.
  2. 모든 포인터가 상수 포인터는 아니다. 상수 포인터는 값을 변경할 수 없는 특수한 형태의 포인터이다.
  3. 포인터는 여러 자료를 묶어서 처리하는 것이 아니라, 단일 메모리 주소를 가리키는 역할을 한다.

26. 모든 변수의 수명이 프로그램의 수명과 동일한 언어는 무엇인가?

  1. Fortran
  2. Algol 60
  3. C
  4. Java

정답: 1

해설: Fortran 언어는 초기 버전에서 모든 변수의 수명이 프로그램의 수명과 동일하다. 이는 변수들이 프로그램 시작 시 할당되고, 프로그램 종료 시 해제되는 정적 할당 방식을 사용하기 때문이다. 이와 달리 다른 언어들은 동적 할당을 지원하여, 변수의 수명이 프로그램의 수명보다 짧을 수 있다.

오답 선지 해설:
2. Algol 60은 블록 구조를 지원하여, 변수의 수명이 블록 내에서만 유효하다.
3. C 언어는 동적 메모리 할당을 통해 변수의 수명을 제어할 수 있다.
4. Java 역시 가비지 컬렉션과 같은 메커니즘을 통해 동적으로 메모리를 관리한다.

27. 단위 활성화에 대한 설명으로 잘못된 것은?

  1. 실행 시간에 한 단위 프로그램이 표현된 상태
  2. 코드부와 활성화 레코드로 구성
  3. 코드부의 내용은 프로그램의 실행 동안 변하지 않음
  4. 퐐성화 레코드는 고정된 크기임

정답: 4

해설: 단위 활성화 레코드의 크기는 고정되어 있지 않다. 활성화 레코드는 함수나 프로시저의 호출 시 마다 생성되며, 매개변수, 지역 변수, 반환 주소 등의 정보를 저장한다. 이러한 정보는 호출될 때마다 달라질 수 있어 활성화 레코드의 크기는 고정되지 않는다.

오답 선지 해설:

  1. 실행 시간에 한 단위 프로그램이 표현된 상태는 활성화 레코드의 정의에 부합한다.
  2. 코드부와 활성화 레코드로 구성되어 있는 것이 맞다.
  3. 코드부의 내용은 프로그램 실행 동안 일반적으로 변하지 않는다.

28. 다음이 설명하는 변수는?

- 활성화 레코드의 크기는 정적 바인딩
- 기억장소 할당은 동적 바인딩
  1. 정적 변수
  2. 준정적 변수
  3. 준동적 변수
  4. 동적 변수

정답: 2

해설: 준정적 변수는 활성화 레코드의 크기가 정적 바인딩을 통해 결정되며, 기억장소 할당이 동적 바인딩을 통해 이루어진다. 이는 변수의 메모리 할당 시점과 관련이 있는데, 준정적 변수는 컴파일 시점에 크기가 결정되지만, 실행 시점에 실제 메모리 할당이 이루어진다. 이러한 특성 때문에 준정적 변수는 정적 변수와 동적 변수의 중간적 성격을 가진다고 할 수 있다.

오답 선지 해설:

  1. 정적 변수: 정적 변수는 프로그램 실행 전에 메모리 크기와 위치가 결정되고, 프로그램이 종료될 때까지 그 위치와 크기가 변하지 않는다. 따라서 주어진 문제의 조건과 일치하지 않는다.
  2. 준동적 변수: 준동적 변수는 활성화 레코드의 크기나 기억장소 할당 방식에 있어서 동적인 성질을 띤다. 그러나 이는 정적 바인딩에 의해 크기가 결정되는 준정적 변수의 특성과 다르다.
  3. 동적 변수: 동적 변수는 프로그램 실행 중에 메모리 할당이 이루어지며, 할당된 메모리의 크기와 위치가 실행 중에 변경될 수 있다. 이는 정적 바인딩을 통한 활성화 레코드의 크기 결정이라는 주어진 문제의 조건과 맞지 않는다.

(29~30) 아래 프로그램에 대해 문제의 해답을 구하시오.

#includ <stdio.h>

int i, A[3];

void function1 (int a) 
{ 
A[i] - 3;
i = 2;
printf("%d", a);
}

main() { 
    i = 1; 
    A[1] =2;
    A[2] = 4;
    function1 (A[i]);
    printf("%d", A[i]);
    }

29. 값호출을 사용하는 프로그래밍 언어에서 위 프로그램의 출력 결과는?

  1. 3 4
  2. 2 4
  3. 4 3
  4. 4 4

정답: 2

해설: 이 프로그램은 C 언어로 작성되었으며, C 언어는 값호출(call by value) 방식을 사용한다. 값호출에서는 함수에 인자로 전달된 값의 복사본이 생성되어 함수 내에서 사용된다. 이 프로그램에서 function1(A[i]) 호출 시, i의 값은 1이고 A[1]의 값은 2이다. 따라서 function1 함수에는 2가 전달된다. 함수 내에서 i의 값이 2로 변경되지만, 이는 main 함수의 A[i]에 영향을 미치지 않는다. function1 함수에서는 전달받은 인자 a (값이 2)를 출력하고, main 함수에서는 변경되지 않은 A[i] (값이 4)를 출력한다. 그래서 최종 출력 결과는 2 4가 된다.

오답 선지 해설:

  1. 3 4: 이 선택지는 function1에서 A[i] 값을 수정하는 것을 가정하나, 실제로는 A 배열의 값이 변경되지 않는다.
  2. 4 3: 이 선택지는 function1에서 a 값이 4로 출력되고 main에서 A[i] 값이 3으로 출력되는 것을 가정하지만, 실제로는 function1에서 a의 값이 2이고 main에서 A[i]의 값이 4이다.
  3. 4 4: 이 선택지는 함수 호출 전과 후에 i의 값이 변하지 않는 것을 가정하지만, 실제로 function1 함수 내에서 i의 값이 2로 변경된다.

30. 참조호출을 사용하는 프로그래밍 언어에서 위 프로그램의 출력 결과는?

  1. 3 4
  2. 2 4
  3. 4 3
  4. 4 4

정답: 1
해설: 참조호출(call by reference) 방식에서는 함수에 인자로 전달된 변수의 참조(또는 주소)가 전달된다. 이 경우, 함수 내에서 변수의 값을 변경하면 호출한 함수에서도 해당 변수의 값이 변경된다. 만약 이 프로그램이 참조호출 방식을 사용하는 언어로 작성되었다면, function1 함수에서 A[i]의 값을 변경하는 코드가 main 함수에도 영향을 미친다. 그러나 현재 코드에는 A[i]의 값을 변경하는 코드가 없다. 대신, i의 값이 2로 변경되므로 main 함수에서 A[i]를 출력할 때 A[2]의 값인 4가 출력된다. 따라서 함수의 출력 결과는 2 4가 되어야 하지만, 이 프로그램의 코드는 이를 지원하지 않는다.

오답 선지 해설:

  1. 3 4: 이 선택지는 function1에서 A[i]의 값을 변경한다고 가정하지만, 실제로는 A[i]의 값이 변경되지 않는다.
  2. 2 4: 이 선택지는 값호출 방식의 결과와 동일하다. 참조호출에서는 함수 내에서 변수의 값이 변경되면 호출한 함수에도 영향을 미친다.
  3. 4 4: 이 선택지는 function1 함수 호출 전후로 i의 값이 변하지 않는 것을 가정하지만, 실제로 function1 함수 내에서 i의 값이 변경된다.

31. 다음 다양한 언어의 조건문 중 A에 3이 할당 되는 것은 무엇인가?

1 Pascal: if 2 > 1 then if 0>1 then A=2 else A=3
2 Pascal: if 2 > 1 then if 0>1 then A=2 else else A=3
3 Algol68: if 2 > 1 then if 0>1 then A=2 fi else A=3 fi
4 Algol68: if 2 > 1 then begin if 0>1 then A=2 end else A=3

정답: 1

해설: 이 문제에서 정답은 1번이다. Pascal 언어에서 if 2 > 1 then if 0 > 1 then A=2 else A=3 구문은 먼저 2 > 1이 참이므로 첫 번째 조건문 안으로 들어간다. 그 다음 0 > 1이 거짓이므로 else 부분이 실행되어 A에 3이 할당된다.

오답 선지 해설:
2번은 Pascal 언어의 문법 오류를 포함하고 있다. else else는 올바른 구문이 아니다.

3번은 Algol68 언어에서 if 2 > 1 then if 0 > 1 then A=2 fi else A=3 fi 구문이다. 여기서 2 > 1은 참이고, 0 > 1은 거짓이므로 else A=3이 실행된다. 그러나 이 구문은 올바른 Algol68 문법이 아니며, fi 키워드의 사용이 잘못되었다.

4번은 Algol68 언어에서 if 2 > 1 then begin if 0 > 1 then A=2 end else A=3 구문이다. 여기서 2 > 1은 참이나, 0 > 1은 거짓이므로 else A=3 부분이 실행되어야 하지만, beginend 키워드의 사용이 올바르지 않아 구문이 잘못되었다.

32. 다음 중 인터프리트 기법에 대한 설명은 무엇인가?

  1. 주어진 프로그램을 기계어 프로그램으로 번역
  2. 추가 기억 장소가 많이 필요
  3. 직접 고수준의 프로그램을 실행
  4. 실행 시간이 중요한 경우에 적합

정답: 3

해설: 인터프리트 기법은 고수준의 프로그래밍 언어로 작성된 코드를 기계어로 번역하지 않고 직접 실행하는 방식이다. 이 방식은 소스 코드를 한 줄씩 읽으면서 즉시 실행하므로 별도의 컴파일 과정이 필요 없다. 이 때문에 개발 과정에서 코드 수정 후 빠른 테스트가 가능하며, 다양한 플랫폼에서의 호환성도 높다. 그러나 이 방식은 코드를 기계어로 미리 번역하는 컴파일 방식에 비해 실행 속도가 느릴 수 있다는 단점이 있다.

오답 선지 해설:

  1. 이 선지는 컴파일 기법을 설명하고 있다. 컴파일 기법은 소스 코드 전체를 기계어로 번역하는 과정을 거친 후에 실행한다.
  2. 추가 기억 장소가 많이 필요한 것은 인터프리트 기법의 특징이 아니다. 오히려 컴파일된 프로그램이 실행 파일을 생성하기 때문에 더 많은 저장 공간을 필요로 할 수 있다.
  3. 실행 시간이 중요한 경우에는 컴파일 기법이 적합하다. 컴파일 기법은 프로그램을 미리 기계어로 번역해 놓기 때문에 실행 속도가 빠르다. 반면, 인터프리트 기법은 실행 시마다 소스 코드를 해석해야 하므로 상대적으로 실행 속도가 느리다.

33. 다음 중 할당문과 거리가 먼 것은 무엇인가?

  1. S++
  2. flag ? N : M = 0
  3. S + 2
  4. S <- T

정답: 3

해설: 할당문은 변수에 값을 저장하는 연산을 말한다. 선택지 3인 'S + 2'는 할당 연산이 아니라 단순한 산술 연산이다. 이는 변수 S에 2를 더하는 연산으로, 결과값이 어떤 변수에도 저장되지 않는다. 반면 다른 선택지들은 모두 할당 연산의 형태를 가진다.

오답 선지 해설:

  1. 'S++'는 증감 연산자를 사용하여 S의 값을 1 증가시키고 그 값을 S에 다시 할당한다.
  2. 'flag ? N : M = 0'는 조건부 할당으로, flag가 참일 경우 N을, 거짓일 경우 M에 0을 할당한다.
  3. 'S <- T'는 T의 값을 S에 할당하는 연산으로, 할당 연산의 한 형태이다.

34. 다음 중 강 자료형(strong type)에 대한 설명은 무엇인가?

  1. 자료형에 관한 모든 특성들이 실행시간에 확정됨
  2. 일부 변수의 선언만 번역시간에 확정
  3. 프로그램의 유지보수성을 증진시킴
  4. 프로그램의 가독성이낮아짐

정답: 3

해설:
강 자료형(strong type)에 대한 설명으로 3번 "프로그램의 유지보수성을 증진시킴"이 정답이다. 강 자료형 시스템은 변수들이 명시적으로 선언되어야 하며, 자료형에 따라 엄격한 규칙을 따라야 한다. 이러한 특성 덕분에 코드가 더 명확해지고, 오류를 더 쉽게 발견할 수 있게 되어 프로그램의 유지보수성이 향상된다.

오답 선지 해설:

  1. 자료형에 관한 모든 특성들이 실행시간에 확정됨 - 이는 동적 타이핑(dynamic typing)에 가까움.
  2. 일부 변수의 선언만 번역시간에 확정 - 이는 약한 자료형(weak typing) 시스템의 특징이다.
  3. 프로그램의 가독성이 낮아짐 - 오히려 강 자료형 시스템은 가독성을 향상시킨다.

35. 다음 중 올바른 설명은 무엇인가?

  1. 배열은이질형자료의집합체임
  2. 레코드는 동질형 자료의 집합체임
  3. 배열은 식별자로 원소를 구별함
  4. 배열과 레코드는 여러자료를 묶어서 하나의 단위로 처리할 수 있음

정답: 4

해설:
4번 "배열과 레코드는 여러 자료를 묶어서 하나의 단위로 처리할 수 있음"이 정답이다. 배열은 동일한 타입의 여러 요소를 순서대로 저장하는 반면, 레코드는 서로 다른 타입의 데이터를 하나의 단위로 묶어 관리할 수 있다. 두 구조 모두 여러 데이터를 효율적으로 관리하고 조작할 수 있게 해준다.

오답 선지 해설:

  1. 배열은 이질형 자료의 집합체임 - 배열은 동질형(같은 타입)의 자료를 저장한다.
  2. 레코드는 동질형 자료의 집합체임 - 레코드는 이질형(다른 타입)의 자료를 저장한다.
  3. 배열은 식별자로 원소를 구별함 - 배열은 인덱스를 사용하여 원소를 구별한다.

36. 기억장소 회수 방법에 대한 올바른 설명은?

1 명시적 해제는 기억장소를 실행시간 내내 할당하다가 주프로그램 종료 시 회수하는 방법임
2 동적 할당 회수는 new 명령을 이용하여 회수하는 방법임
3 정적 할당 회수는 할당된 기억장소를 해제하는 명시적 명령어를 제공하는 방법임
4 쓰레기 수집은 프로그램에서 더이상 참조가 없더라도 계속 기억장소에 존재할 수 있는 방법임

정답: 4

해설: 쓰레기 수집(Garbage Collection)은 사용되지 않는 기억장소를 자동으로 회수하는 메커니즘이다. 프로그램이 기억장소를 할당한 후, 그 기억장소에 대한 모든 참조가 없어질 때, 쓰레기 수집기는 그 기억장소를 회수한다. 이 방법은 프로그래머가 기억장소를 수동으로 관리할 필요가 없어 프로그래밍의 복잡성을 줄여준다.

오답 선지 해설:

  1. 명시적 해제는 프로그래머가 직접 메모리 해제 함수를 호출하여 기억장소를 회수하는 방식이다. 프로그램 종료 시 자동으로 메모리가 해제되는 것은 아니다.
  2. 동적 할당 회수는 'new' 명령을 사용하여 메모리를 할당하는 것이 아니라, 'delete'나 비슷한 메모리 해제 명령을 사용하여 할당된 메모리를 회수하는 방식이다.
  3. 정적 할당 회수는 프로그램의 실행이 끝날 때 운영체제에 의해 자동으로 이루어진다. 프로그래머가 명시적으로 메모리를 해제하는 명령어를 제공하지 않는다.

37. 정적 체인 사용 기법에 대한 설명으로 잘못된 것은 무엇인가?

1 모든 활성화레 코드에 정적 링크를 할당
2 검색 시간이 짧아 실제로 많이 사용함
3 비지역변수에 대한 참조시 정적체인을 따라검색
4 정적 체인은 현재 활성화 레코드로부터 연결된 정적 링크의 순서임

정답: 2

해설:정적 체인 사용 기법은 프로그래밍에서 비지역 변수를 참조할 때 사용한다. 이 기법은 각 함수의 활성화 레코드에 정적 링크를 할당하여, 해당 함수가 비지역 변수에 접근할 수 있도록 한다. 비지역 변수는 다른 함수의 지역 변수로, 현재 함수와는 다른 활성화 레코드에 존재한다. 정적 체인을 사용하면, 함수가 자신의 활성화 레코드를 벗어나 비지역 변수가 있는 활성화 레코드로 이동할 수 있다. 이때 정적 체인은 현재 활성화 레코드로부터 연결된 정적 링크의 순서를 따라간다. 그러나 이 방법은 검색 시간이 길어질 수 있으므로, 실제로는 많이 사용되지 않는다.

오답 선지 해설:
1번 선지에서는 모든 활성화 레코드에 정적 링크를 할당한다는 사실이 잘못된 것은 아니다. 이것은 정적 체인 사용 기법의 기본 원칙 중 하나이다. 3번 선지는 비지역 변수에 대한 참조 시 정적 체인을 따라 검색한다는 내용으로, 이 역시 정적 체인 사용의 정의와 일치한다. 4번 선지는 정적 체인이 현재 활성화 레코드로부터 연결된 정적 링크의 순서라는 설명으로, 이 역시 올바른 설명이다. 오답인 2번 선지는 검색 시간이 짧아 실제로 많이 사용된다는 주장이 잘못되었다는 점을 강조해야 한다. 실제로는 정적 체인을 사용할 때 검색 시간이 길어질 수 있으며, 이는 이 기법이 널리 사용되지 않는 이유 중 하나이다.

38. 매개변수 전달 기법에 대한 설명으로 올바른 것은?

1 값호출: 실매개 변수의 값이 변할수없음
2 결과호출: 실매개 변수의 값이 어떠한 경우라도 변하지않음
3 참조호출: 실매개 변수의 값만 형식 매개변수에 보냄
4 이름호출: 다른 매개변수 전달 기법에 비하여 구현이 쉽고 최근에 설계된 중요 프로그래밍 언어에서도 많이 사용됨

정답: 1

해설:
값 호출(Call by Value)은 실제 매개변수의 값이 형식 매개변수로 복사되어 함수 내에서 사용된다. 함수 내에서 형식 매개변수의 값이 변경되더라도 실제 매개변수의 값에는 영향을 주지 않는다. 따라서 함수 외부에서 실제 매개변수의 값이 변할 수 없다는 특징을 가진다. 이는 가장 기본적인 매개변수 전달 방식이며, 많은 프로그래밍 언어에서 사용된다.

오답 선지 해설:
2. 결과호출(Call by Result)은 함수의 실행이 끝난 후에 형식 매개변수의 최종 값이 실제 매개변수로 복사된다. 함수 실행 동안에는 실제 매개변수의 값이 변하지 않지만, 함수 종료 후에는 값이 변할 수 있다.

  1. 참조호출(Call by Reference)은 실제 매개변수의 주소를 형식 매개변수에 전달하여, 함수 내에서 형식 매개변수를 통해 실제 매개변수를 직접 조작할 수 있게 한다. 이 방식을 사용하면, 함수 내에서의 변경사항이 실제 매개변수에도 반영된다.
  2. 이름호출(Call by Name)은 매개변수를 그 이름 그대로 함수 내에 전달하고, 함수가 호출될 때 매번 실제 매개변수를 평가한다. 이 방식은 구현이 복잡하고, 최근에 설계된 중요 프로그래밍 언어에서는 일반적으로 사용되지 않는다.

39. 단위 프로그램에서 선언된 지역변수와 사용가능한 비지역변수로 구성된 단위 활성화에 관련된 정보는?

  1. 코드부
  2. 참조 환경
  3. 활성화 상태
  4. 활성화 레코드

정답: 2

해설:
참조 환경은 단위 프로그램이 실행될 때 해당 프로그램에 접근 가능한 모든 변수들, 즉 지역변수와 비지역변수를 포함하는 환경을 말한다. 이 환경은 프로그램이 어떤 변수에 접근할 수 있는지, 어떻게 접근해야 하는지 결정하는 데 중요한 역할을 한다. 따라서, 참조 환경은 단위 활성화와 밀접하게 연관되어 있다.

오답 선지 해설:

  1. 코드부는 프로그램의 실제 코드가 저장되는 부분을 말하며, 지역변수나 비지역변수의 정보와는 직접적인 관련이 없다.
  2. 활성화 상태는 프로그램이나 함수가 현재 실행 중인지 여부를 나타내는 상태이지만, 변수들의 정보와는 직접적인 연관이 없다.
  3. 활성화 레코드는 함수나 프로시저가 호출될 때 생성되는 레코드로, 매개변수, 지역변수, 반환 주소 등의 정보를 포함하지만, 비지역변수에 대한 정보는 일반적으로 포함하지 않는다.

(40~43). 아래 프로그램을 예제로 주어진 문제를 푸세요.

void swap(int a, int b) { 
    int temp;
    temp = a;
    a = b;
    b = temp; 
}

main() { 
    int x, y;
    x = 1; y = 3; 
    swap(x,y);
    printf("%d, %d", x, y);

40. 값 호출을 사용하는 언어인 경우 출력 결과는?

  1. 1,3
  2. 3,3
  3. 1,1
  4. 3,1

정답: 1

해설: 이 프로그램에서 swap 함수는 값 호출(call by value) 방식을 사용하므로, 함수에 전달된 변수의 복사본이 만들어진다. swap 함수 내에서 ab의 값이 서로 바뀌지만, 이는 복사된 지역 변수에만 영향을 미친다. 따라서 메인 함수의 xy 변수에는 아무런 변화가 없어 출력 결과는 x, y의 원래 값인 1, 3이 된다.

오답 선지 해설: 2, 3, 4번 선지는 참조 호출, 이름 호출 또는 결과 호출과 같은 다른 호출 방식을 고려했을 때의 결과로 오해할 수 있다. 이 경우에는 변수의 원본이 아닌 복사본이 사용되기 때문에 주어진 코드에서는 1, 3이 출력된다.

41. 참조 호출을 사용하는 언어인 경우 출력 결과는?

  1. 1,3
  2. 3,3
  3. 1,1
  4. 3,1

정답: 4

해설: 참조 호출(call by reference) 방식을 사용할 경우, 함수에 변수의 참조(또는 주소)가 전달된다. 따라서 swap 함수 내에서 ab의 값이 서로 바뀌면 메인 함수의 x, y 변수 값도 바뀐다. 이 경우, xy의 값은 3, 1로 바뀌어 출력 결과는 3, 1이 된다.

오답 선지 해설: 1번 선지는 값 호출의 결과를 나타내며, 2번과 3번 선지는 프로그램의 로직과 일치하지 않아 발생할 수 없는 결과들이다.

42. 이름 호출을 사용하는 언어인 경우 출력 결과는?

  1. 1,3
  2. 3,3
  3. 1,1
  4. 3,1

정답: 4

해설: 이름 호출(call by name) 방식에서는 함수에 실제 변수 대신 변수의 이름이 전달된다. 이 경우, swap 함수 내의 abxy를 직접 참조한다. 그러나, 이 예제에서는 이름 호출이 swap 함수 내부의 로직에 영향을 미치지 않으므로 결과는 참조 호출과 같게 3, 1이 된다.

오답 선지 해설: 1번 선지는 값 호출의 결과를 나타내며, 2번과 3번 선지는 프로그램의 로직과 일치하지 않아 발생할 수 없는 결과들이다.

43. 결과 호출을 사용하는 언어인 경우 출력 결과는?

  1. 1,3
  2. 3,3
  3. 1,1
  4. 3,1

정답: 4

해설: 결과 호출(call by result) 방식에서는 함수가 종료될 때 함수의 매개변수에 저장된 값이 호출자의 변수로 복사된다. 이 경우, swap 함수가 종료될 때 ab의 값이 xy로 복사된다. 따라서 xy의 값은 3, 1로 바뀌며, 출력 결과는 3, 1이 된다.

오답 선지 해설: 1번 선지는 값 호출의 결과를 나타내며, 2번과 3번 선지는 프로그램의 로직과 일치하지 않아 발생할 수 없는 결과들이다.

44. 자료형에 대한 정적 형 검사는 언제 수행되는가?

  1. 언어의 정의 시간
  2. 언어의 구현 시간
  3. 컴파일 시간
  4. 실행 시간

정답: 3

해설: 정적 형 검사는 컴파일 시간에 수행된다. 이는 프로그램이 실행되기 전에 컴파일러가 소스 코드를 분석하여 타입 오류를 찾아내는 과정이다. 컴파일 시간에 자료형 검사를 수행함으로써 실행 시간에 발생할 수 있는 오류를 미리 방지할 수 있다.

오답 선지 해설:

  1. 언어의 정의 시간에는 언어의 문법과 규칙이 정의되며, 이는 자료형 검사와 직접적인 관련이 없다.
  2. 언어의 구현 시간은 프로그래밍 언어가 실제로 구현되는 시기를 말하며, 이 시기에도 자료형 검사가 이루어지지 않는다.
  3. 실행 시간에는 이미 컴파일된 코드가 실행되며, 정적 형 검사는 이 시기가 아닌 컴파일 시간에 이루어진다.

45. 식별자의 영역이 동적 영역 규칙을 따르는 경우에 대한 설명과 거리가 먼 것은?

  1. 변칙 현상이 생기지 않음
  2. 일반적인 인터프리터 언어
  3. 식별자의 영역이 번역 시간에 결정됨
  4. 자유 변수 문제는 프로그램의 실행 순서로 해결

정답: 3

해설: 동적 영역 규칙을 따르는 식별자의 영역은 프로그램의 실행 시간에 결정된다. 이 경우 식별자의 범위는 프로그램이 실제로 실행될 때 동적으로 결정되며, 식별자의 값이 호출된 문맥에 따라 달라질 수 있다.

오답 선지 해설:

  1. 변칙 현상은 동적 영역 규칙에서 일반적으로 발생하지 않는다.
  2. 일반적인 인터프리터 언어에서는 식별자의 영역이 실행 시간에 결정되는 경우가 많다.
  3. 식별자의 영역이 번역 시간에 결정되는 것은 정적 영역 규칙에 해당한다. 동적 영역 규칙에서는 실행 시간에 결정된다.
  4. 자유 변수 문제는 프로그램의 실행 순서에 따라 다르게 해결될 수 있으며, 이는 동적 영역 규칙의 특징 중 하나이다.

46. 다음 중 설명이 바르지 않은 것은?

  1. 영역 - 식별자의 사용이 허락되는 프로그램 범위
  2. 지역 변수 - 블록에서 선언된 변수와 형식 매개변수
  3. 전역 변수 - 블록을 내포하고 있는 외부 블록에서 선언된 변수
  4. 자유 변수 - 현 블록에서 정의된 변수

정답: 4

해설: 자유 변수란 현재 블록 외부에서 정의된 변수를 말한다. 따라서 4번 선지의 '자유 변수 - 현 블록에서 정의된 변수'라는 설명은 올바르지 않다. 자유 변수는 현재 블록 바깥에 위치한 블록에서 정의되며, 현재 블록에서는 선언 없이 사용할 수 있다.

오답 선지 해설: 1번 선지는 영역이 프로그램에서 식별자가 유효한 범위를 나타내는 것으로 정확하다. 2번 지역 변수는 특정 블록 내에서 선언되고 사용되는 변수를 의미하며, 이 또한 정확한 설명이다. 3번 전역 변수는 프로그램의 어느 곳에서나 접근할 수 있는 변수를 말하며, 이는 특정 블록에 국한되지 않고 외부 블록에서 선언되어 사용된다.

47. 단위 활성화에 대한 설명으로 바른 것은?

  1. 코드부와 활성화 레코드로 구성
  2. 코드부의 내용은 프로그램의 실행 동안 변함
  3. 활성화 레코드는 고정된 크기임
  4. 비지역 변수는 자신의 활성화 레코드에 저장되어 있음

정답: 1

해설: 단위 활성화는 코드부와 활성화 레코드로 구성된다. 코드부는 프로그램의 지시사항들을 포함하고 있으며, 활성화 레코드는 실행 시 필요한 데이터와 제어 정보를 담고 있다. 1번 선지가 정확한 설명을 제공한다.

오답 선지 해설: 2번 선지의 '코드부의 내용은 프로그램의 실행 동안 변함'은 잘못된 설명이다. 코드부는 프로그램의 실행 동안 변하지 않는다. 3번 '활성화 레코드는 고정된 크기임' 역시 정확하지 않다. 활성화 레코드는 함수의 호출에 따라 크기가 변할 수 있다. 4번 '비지역 변수는 자신의 활성화 레코드에 저장되어 있음'도 잘못된 설명이다. 비지역 변수는 다른 활성화 레코드에 저장되어 있으며, 현재 활성화 레코드에서는 참조만 가능하다.

48. 수식 7-5-에 대한 파스 트리를 다음 문법으로 만들 때, 계산 결과로 가능한 값을 모두 포함하는 것은?

<exp> ::= <exp> - <exp> | <digit>
<digit> ::= 0 | 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 
  1. 0
  2. 4
  3. 0, 4
  4. 없음

정답: 3

해설:
이 문제는 주어진 문법에 따라 수식 7-5-2를 파싱했을 때 나올 수 있는 모든 결과를 찾는 것이다. 문법에 따라, '<exp> ::= <exp> - <exp> | <digit>'는 표현식이 숫자이거나 두 표현식의 차이라는 것을 의미한다. '<digit>'은 0, 1, 3, 4, 5, 6, 7, 8, 9 중 하나이다. 수식 7-5-2를 이 문법으로 파싱하면, 여러 가지 방식으로 나눌 수 있다. 예를 들어, 7-(5-2)와 같이 파싱할 경우 결과는 4가 되고, (7-5)-2와 같이 파싱할 경우 결과는 0이 된다. 따라서 가능한 값은 0과 4, 두 가지이다.

오답 선지 해설:

  1. 0만 포함하는 경우: 이 선택지는 (7-5)-2와 같이 파싱했을 때의 결과만 고려한 것이다. 하지만 7-(5-2)와 같이 파싱하면 결과가 4가 되므로, 이 선택지는 모든 가능한 결과를 포함하지 않는다.
  2. 4만 포함하는 경우: 이 선택지는 7-(5-2)와 같이 파싱했을 때의 결과만 고려한 것이다. 하지만 (7-5)-2와 같이 파싱하면 결과가 0이 되므로, 이 선택지도 모든 가능한 결과를 포함하지 않는다.
  3. 없음: 이 선택지는 문제의 조건을 만족하는 결과가 전혀 없다고 가정한다. 그러나 실제로는 0과 4 두 가지 결과가 나올 수 있으므로 이 선택지는 정확하지 않다.

49. 자유 변수에 대한 설명으로 바른 것은?

  1. 현 블록에서 정의된 변수
  2. 정적 영역 규칙에서는 현 블록을 내포하고 있는 가장 바깥쪽의 블록부터 조사
  3. 동적 영역 규칙에서는 프로그램의 실행 순서로 해결
  4. 선언을 찾지 못하면 0으로 초기화

정답: 3. 동적 영역 규칙에서는 프로그램의 실행 순서로 해결

해설: 자유 변수는 현재 실행 중인 함수나 블록 외부에서 정의되고 사용되는 변수를 의미한다. 동적 영역 규칙에 따르면, 이러한 변수는 프로그램의 실행 순서에 따라 결정된다. 즉, 변수가 사용되는 시점에서 가장 최근에 정의된 값에 접근한다. 이는 함수나 블록이 실행될 때 정의된 환경이 아니라, 실제로 함수가 호출될 때의 환경을 반영한다는 의미이다.

오답 선지 해설:

  1. 현 블록에서 정의된 변수는 지역 변수로, 자유 변수와는 다르다. 자유 변수는 현 블록 외부에서 정의된다.
  2. 정적 영역 규칙은 변수가 코드 상에서 정의된 위치를 기반으로 결정되는 규칙을 의미한다. 자유 변수는 동적 영역 규칙에 따라 처리되므로, 이 선지는 자유 변수에 해당하지 않는다.
  3. 선언을 찾지 못한 경우 0으로 초기화되는 것은 일반적인 변수 초기화 규칙이지만, 자유 변수의 정의나 동작 방식과는 직접적인 관련이 없다. 자유 변수는 외부 정의에 의존한다.

50. 단위 활성화에 대한 설명으로 바른 것은?

  1. 코드부, 실행부, 활성화 레코드로 구성
  2. 코드부의 내용은 프로그램의 실행 동안 변하지 않음
  3. 실행부는 고정된 크기임
  4. 지역 변수는 자신의 활성화 레코드에 저장되지 않음

정답: 2

해설:코드부에는 실행할 프로그램 코드가 포함되어 있으며, 이 내용은 프로그램 실행 동안 변하지 않는다. 실행부는 프로그램 실행 시 필요한 데이터와 명령어들로 구성되며, 활성화 레코드는 함수 호출과 관련된 정보를 저장하는데 사용된다. 여기에는 매개변수, 반환 주소, 지역 변수 등이 포함될 수 있다.

오답 선지 해설:

  1. 코드부, 실행부, 활성화 레코드로 구성된다고 설명하는 것은 맞지만, 이 세 부분이 모두 단위 활성화의 구성 요소라는 것을 명확히 하지 않는다.
  2. 실행부는 고정된 크기를 가진다고 하는 것은 잘못되었다. 실행부는 프로그램 실행에 따라 필요한 데이터와 명령어들의 양에 따라 크기가 변할 수 있다.
  3. 지역 변수는 활성화 레코드 내에 저장된다. 이는 함수 내에서 선언된 지역 변수들이 해당 함수의 활성화 레코드 내에서 관리되기 때문이다.

51. 활성화 레코드에 대한 설명으로 바른 것은?

  1. 동적 링크는 호출한 단위 활성화로 되돌아갈 주소값을 저장하는 포인터로 코드부를 가리킴
  2. 반환 주소는 호출한 활성화 레코드를 가리키는 주소
  3. 매개 변수, 정적링크 등을 포함
  4. 활성화 레코드의 크기는 변하지 않음

정답: 3

해설: 활성화 레코드는 함수 호출 시 생성되는 레코드로, 매개변수, 지역 변수, 반환 주소, 동적 링크 등의 정보를 포함한다. 동적 링크는 이전 활성화 레코드로의 링크를 제공하고, 반환 주소는 함수 호출이 끝난 후 돌아갈 주소를 저장한다. 매개 변수와 지역 변수는 해당 함수의 실행에 필요한 데이터를 제공한다.

오답 선지 해설:

  1. 동적 링크는 코드부를 가리키는 것이 아니라, 이전 활성화 레코드를 가리킨다. 이는 함수 호출이 끝난 후 이전 상태로 돌아갈 수 있도록 도와주는 역할을 한다.
  2. 반환 주소는 호출한 활성화 레코드를 가리키는 것이 아니라, 함수 호출이 끝난 후 돌아갈 주소를 저장한다. 이는 함수 실행이 끝난 후 프로그램 흐름이 올바른 위치로 돌아갈 수 있도록 하는 역할을 한다.
  3. 활성화 레코드의 크기는 고정된 것이 아니다. 함수의 매개변수, 지역 변수의 수와 크기에 따라 활성화 레코드의 크기는 변할 수 있다.

52. 디스플레이 사용기법에 대한 설명으로 바른 것은?

  1. 지역변수들의자료값에대한참조시간을줄이기위한구현 기법
  2. 정적체인사용기법과달리어떤지역변수에대한참조 시간도 동일
  3. 디스플레이라는 1차원 가변 배열을 사용
  4. 지역 변수들의 사용이 증가할 경우 매력적

정답: 3

해설: 디스플레이 사용기법은 지역 변수들의 참조를 효율적으로 관리하기 위해 사용되는 1차원 가변 배열이다. 이 배열은 각 프로시저의 지역 변수들에 대한 포인터를 저장하며, 프로시저의 호출과 복귀에 따라 동적으로 변화한다. 이를 통해 프로시저 내에서 다른 프로시저의 지역 변수에 대한 접근이 용이해지며, 참조 시간을 단축시킬 수 있다.

오답 선지 해설:

  1. 이 선지는 디스플레이 기법의 주요 목적을 잘못 설명하고 있다. 디스플레이 사용기법의 주 목적은 지역 변수들의 참조 시간을 줄이는 것이 아니라, 지역 변수들에 대한 효율적인 접근과 관리를 가능하게 하는 것이다.

  2. 정적 체인 사용 기법은 지역 변수에 접근할 때 상위 프로시저로의 연결 과정을 필요로 한다. 반면, 디스플레이 기법은 지역 변수들을 1차원 배열에 저장함으로써, 어떤 지역 변수든 동일한 시간에 접근할 수 있다는 점에서 차이가 있다.

  3. 지역 변수들의 사용이 증가한다고 해서 디스플레이 사용기법이 반드시 매력적인 것은 아니다. 디스플레이 기법의 효율성은 프로그램의 구조와 프로시저 호출의 복잡성에 따라 달라질 수 있다. 따라서, 지역 변수의 사용 증가는 디스플레이 기법의 적합성을 결정하는 유일한 요인이 아니다.

53. 부프로그램이 실행되는 동안 호출자가 보내준 식 또는 다른 이름 을 대신하여 그 프로그램에서 사용되는 이름을 일컫는 용어는?

  1. 실 매개변수
  2. 형식 매개변수
  3. 원본 매개변수
  4. 프로시저

정답: 2

해설: 부프로그램 내에서 사용되는 이름인 '형식 매개변수'는 호출자가 전달한 실제 값을 대신하여 사용되는 변수를 의미한다. 이는 부프로그램이 실행될 때 호출자로부터 받은 실 매개변수의 값을 받아 사용하게 된다. 이러한 형식 매개변수는 부프로그램의 독립성을 유지하고 재사용성을 높이는 데 중요한 역할을 한다.

오답 선지 해설:

  1. '실 매개변수'는 부프로그램에 실제로 전달되는 값을 담는 변수를 의미한다. 이는 형식 매개변수와 반대되는 개념이다.
  2. '원본 매개변수'는 프로그래밍 용어로 일반적으로 사용되지 않는다.
  3. '프로시저'는 특정 작업을 수행하는 일련의 명령어들의 집합으로, 매개변수 자체를 의미하지는 않는다.

54.한 개체가 두 가지 이상의 개념으로 사용되는 것을 의미하는 용어는?

  1. 별명
  2. 중복정의
  3. 부작용
  4. 포인터

정답: 2

해설: '중복정의'는 하나의 개체가 두 개 이상의 의미 또는 역할을 가질 때 사용되는 용어이다. 특히 프로그래밍에서는 같은 이름의 함수나 메서드가 다른 매개변수를 가지고 여러 번 정의될 때 이를 '중복정의'라고 한다. 이를 통해 동일한 함수명으로 다양한 형태의 입력을 처리할 수 있는 유연성을 제공한다.

오답 선지 해설:

  1. '별명'은 프로그래밍에서 특정 개체에 대한 다른 이름을 의미한다.
  2. '부작용'은 프로그램에서 예상치 못한 결과나 변경을 일으키는 것을 의미하며, 중복정의와는 다른 개념이다.
  3. '포인터'는 메모리 주소를 저장하는 변수를 의미하며, 중복정의와는 관련이 없다.

55. 다음 구문 도표를 EBNF로 올바르게 표현한 것은?

                |---------------0------------|

<ex> -----| |------->
|-------(--->ex1----->)-----|

  1. <ex> ::= 0 | ( ex1 )
  2. <ex> ::= 0 | ( <ex1> )
  3. <ex> ::= <0> | (ex1)
  4. <ex> ::= 0 | '(' <ex1> ')'

*정답: 4

해설:

  • 동그라미로 감싸져 있는 0은 하나의 선택 가능한 요소를 나타낸다. EBNF에서는 이러한 선택 요소를 특별한 괄호 없이 바로 사용할 수 있다.

  • 네모로 감싸져 있는 ex1은 다른 요소를 참조하고 있음을 나타낸다. EBNF에서는 이를 <>로 둘러싸서 표현한다.

  • 괄호 ()는 문자 그대로의 괄호를 의미한다. EBNF에서는 이들을 문자열로 표현하기 위해 따옴표 '''`로 감싸야 한다.

  • <ex> ::= 0 | '(' <ex1> ')'

2번 선택지 <ex> ::= 0 | ( <ex1> )가 올바르지 않은 이유:

  • EBNF에서는 괄호 ()를 문자 그대로의 괄호로 사용하려면, 따옴표 '''`로 감싸야 한다. 이는 괄호가 문법의 일부로 해석되지 않고 문자 그대로 해석되도록 한다. 2번 선택지에서는 괄호가 따옴표로 감싸져 있지 않기 때문에, 이 괄호들은 EBNF 문법의 일부로 해석될 수 있으며, 이는 원래 구문 도표의 의도와 다르다.
  • 구문 도표에서 ex1이 네모로 감싸져 있다는 것은 ex1이 다른 요소를 참조한다는 것을 의미한다. EBNF에서는 이런 참조를 <ex1>과 같이 꺾쇠 괄호로 표현한다. 2번 선택지는 이를 올바르게 표현하고 있지만, 문제는 괄호의 표현 방식에 있다.

따라서 올바른 EBNF 표현은 괄호를 문자열로 취급하고, 참조를 꺾쇠 괄호로 표현하는 4번 <ex> ::= 0 | '(' <ex1> ')'가 된다.

56. 바인딩 시간과 예시가 바르게 짝지어진 것은?

  1. 언어의정의시간-레코드의각항목의형확정
  2. 언어의구현시간-수의기계내에서의표기법확정
  3. 번역시간-변수의값확정
  4. 실행시간-정수의자릿수확정

정답: 2

해설: 바인딩 시간은 프로그래밍 언어의 요소들이 결정되는 시간을 의미한다. '언어의 구현시간'은 프로그래밍 언어가 구현되는 시점을 말하며, 이때 수의 기계 내에서의 표기법(예를 들어, 정수나 부동소수점 수의 내부 표현 방식)이 확정된다. 따라서 2번 선지가 정답이다. 이는 프로그래밍 언어의 구현 단계에서 기본 데이터 유형의 표현 방식이 결정되는 것과 관련이 있다.

오답 선지 해설:

  1. '언어의 정의시간'은 프로그래밍 언어가 정의되는 시점이며, 이때 레코드의 각 항목의 형이 확정되는 것이 아니라, 레코드와 같은 데이터 구조의 구성 및 작동 원리가 정의된다.
  2. '번역시간'은 소스 코드가 기계 코드로 번역되는 시점을 의미하며, 여기서는 변수의 타입이나 범위가 결정되지, 변수의 값이 확정되는 것은 아니다. 변수의 값은 대체로 실행 시간에 결정된다.
  3. '실행시간'은 프로그램이 실제로 실행되는 시점을 말하며, 이때 정수의 자릿수가 확정되는 것이 아니라, 실시간 계산이나 데이터 처리 과정에서 변수의 값이나 상태가 결정된다. 정수의 자릿수는 보통 언어의 구현시간에 결정된다.

57. 명시적 선언을 통해 얻을 수 있는 이점은?

  1. 동적 형 검사가 가능해짐
  2. 정적바인딩을제공할수있음
  3. 자료형의 표현 범위가 넓어짐(2바이트 —4바이트)
  4. 한변수가동시에다양한자료형을표현할수있음

정답: 2

해설: 명시적 선언은 변수나 함수의 자료형을 프로그램이 실행되기 전에 결정하는 것을 말한다. 정적 바인딩은 이러한 명시적 선언을 통해 가능해진다. 정적 바인딩이란 프로그램 실행 전에 변수의 타입이 결정되고, 이 타입에 맞는 메모리 할당 및 관련 연산이 이루어지는 것을 의미한다. 이를 통해 실행 시간이 단축되고 타입 안정성이 향상된다.

오답 선지 해설:

  1. 동적 형 검사는 프로그램 실행 시 변수의 타입을 확인하는 것으로, 명시적 선언과는 반대 개념이다. 명시적 선언은 정적 타입 시스템에 해당하며, 변수의 타입이 미리 결정된다.
  2. 자료형의 표현 범위는 명시적 선언과 직접적인 관련이 없다. 표현 범위는 해당 언어나 시스템의 자료형 정의에 의해 결정된다.
  3. 한 변수가 동시에 다양한 자료형을 표현하는 것은 다형성이나 동적 타이핑 특징에 해당하며, 명시적 선언은 이와 반대로 정적 타입 시스템의 특징을 나타낸다.

58. 키에 의해 접근되는,순서를 갖지 않는 자료의 집합체는?

  1. 배열
  2. 레코드
  3. 포인터
  4. 연상배열

정답: 4

해설: 연상배열(associative array)은 키와 값의 쌍으로 이루어진 자료구조이다. 각 키는 고유하며, 이를 사용하여 저장된 데이터에 접근할 수 있다. 배열이나 리스트와 달리, 연상배열은 데이터에 순서가 없으며 키를 기반으로 데이터를 저장하고 검색한다. 이러한 특성으로 인해 검색, 삽입, 삭제 등의 작업을 빠르게 수행할 수 있다.

오답 선지 해설:

  1. 배열은 인덱스에 의해 접근되는 순차적인 자료구조이다. 각 요소는 고정된 크기의 연속적인 메모리 공간에 저장된다.
  2. 레코드는 필드의 집합으로 구성된 자료구조이다. 각 필드는 다른 타입의 데이터를 저장할 수 있지만, 키에 의해 접근되지는 않는다.
  3. 포인터는 메모리 주소를 저장하는 변수이다. 자료구조 자체는 아니며, 다른 변수나 객체의 위치를 가리키는 데 사용된다.

59. 정적 기억장소 할당에 대한 설명으로 바른 것은?

  1. 실행중배열의크기변화가능
  2. 단순하여 쉽게 구현 가능
  3. 재귀호출이 허용됨
  4. 프로그래밍 언어에 대한 유연성이 많음

정답: 2

해설: 정적 기억장소 할당(static memory allocation)은 프로그램 실행 전에 필요한 메모리 공간이 결정되는 방식이다. 컴파일 시점에 모든 메모리 크기와 위치가 결정되므로, 메모리 관리가 단순하고 구현하기 쉬운 특징이 있다. 이는 동적 메모리 할당과 대비되며, 런타임 중에 메모리 크기를 변경할 수 없는 제한이 있다.

오답 선지 해설:

  1. 정적 기억장소 할당에서는 실행 중 배열의 크기 변경이 불가능하다. 메모리 크기와 위치가 컴파일 시점에 이미 결정되기 때문에, 런타임에 배열 크기를 조정하는 것이 불가하다.
  2. 재귀 호출은 메모리 스택을 사용하는데, 정적 할당에서는 고정된 메모리 크기 때문에 깊은 재귀 호출이 스택 오버플로를 일으킬 위험이 있다. 동적 할당 방식이 이러한 문제를 해결하는 데 더 적합하다.
  3. 정적 기억장소 할당은 프로그래밍 언어의 유연성을 제한한다. 메모리 크기와 위치가 고정되어 있기 때문에, 런타임에 데이터 구조를 조정하거나 확장하는 것이 어렵다. 동적 할당은 이런 유연성을 제공한다.
반응형