5급 공채 2차

2023년 5급 공채 기술 2차 프로그래밍언어론

문제 5개 · 50점. 참고 답안·채점 기준은 앱에서 볼 수 있습니다.

제1문 (10점)

다음 재귀함수(recursive function)에 대한 물음에 답하시오. (총 10점)
int factorial(int n) {
if (n == 0)
return 1;
return n * factorial(n - 1);
}
int main() {
factorial(5);
return 0;
}
  1. (1) 위 재귀함수를 꼬리재귀(tail recursion)로 바꾸기 위해 다음과 같이 변형하고자 한다. 밑줄 (A)에 들어갈 코드를 완성하시오. (3점)
    int fact_tail(int p, int n) {
    if (n == 0)
    return p;
    return (A) ;
    }
    int main() {
    fact_tail(1, 5);
    return 0;
    }
  2. (2) 위 fact_tail() 함수와 동일한 결과를 리턴하는 fact_iter() 함수를 반복문을 사용하여 완성하시오. (4점)
    int fact_iter(int p, int n) {

    }
    int main() {
    fact_iter(1, 5);
    return 0;
    }
  3. (3) 1)과 같이 재귀함수를 꼬리재귀로 바꾸었을 때 코드 최적화 관점에서 장점을 서술하시오. (3점)

제2문 (10점)

다음 C 프로그램에 대한 물음에 답하시오. (총 10점)
struct A
{
int i;
char j;
};
struct B
{
int i;
char j;
};
struct A x, *p;
struct B y, *q;

int main() {
(가)

return 0;
}
(가)
  1. (1) (가)의 문장이
    x = y;
    일 때, 컴파일 오류 발생 여부와 그 이유를 설명하시오. (2점)
  2. (2) (가)의 문장이
    x = (struct A) y;
    일 때, 컴파일 오류 발생 여부와 그 이유를 설명하시오. (4점)
  3. (3) (가)의 문장이
    p = (struct A*) q;
    일 때, 컴파일 오류 발생 여부와 그 이유를 설명하시오. (4점)

제3문 (10점)

다음 C 프로그램에 대한 물음에 답하시오. (총 10점)
1 #include <stdio.h>
2
3 int g_NoOfCalls = 0;
4
5 int func(int *n1, int *n2) {
6 g_NoOfCalls++;
7 if ( *n1 <= 0 ) return 0;
8 *n2 = *n2 / 2;
9 printf("%d %d\n", *n1, *n2);
10 return *n1 + func(n1, n2);
11 }
12
13 int main() {
14 int value = 9;
15 printf("1: %d\n", func(&value, &value));
16 printf("2: %d\n", value);
17 printf("3: %d\n", g_NoOfCalls);
18 return 0;
19 }
  1. (1) 위 코드를 실행할 때 라인 15의 수행 결과로 출력되는 내용을 작성하시오. (4점)
  2. (2) 위 코드를 실행할 때 라인 16, 17의 수행 결과로 출력되는 내용을 각각 작성하시오. (2점)
  3. (3) 위 코드에서 main()과 func()가 서로 동일한 주소의 메모리를 접근하기 위해 사용한 기법 두 가지를 설명하시오. (4점)

제4문 (10점)

다음 C 프로그램에 대한 물음에 답하시오. (총 10점)
#include <stdio.h>
int FuncA(int x, int y)
{
return x + y;
}

float FuncA(double x, double y)
{
return x + y;
}

int main()
{
printf("%d \n", FuncA(3, 5));
printf("%f \n", FuncA(3.5, 8.7));
return 0;
}
  1. (1) 위 프로그램을 C 컴파일러로 컴파일 및 실행할 때, 정상적으로 실행되는 경우에는 출력 결과를 작성하고, 오류가 발생하는 경우에는 오류의 원인과 오류를 수정하는 방법을 설명하시오. (3점)
  2. (2) 위 프로그램을 C++컴파일러로 컴파일 및 실행할 때, 정상적으로 실행되는 경우에는 출력 결과를 작성하고, 오류가 발생하는 경우에는 오류의 원인과 오류를 수정하는 방법을 설명하시오. (3점)
  3. (3) 위 프로그램에 아래와 같이 동일한 이름의 함수를 추가하고 C++컴파일러로 컴파일 및 실행할 경우 그 결과와 이유를 설명하시오. (4점)
    float FuncA(double x, double y, int z=0)
    {
    return x + y - z;
    }

제5문 (10점)

다음 Java 프로그램에 대한 물음에 답하시오. (총 10점)
1 class Student {
2 protected int jumSu = 0;
3 public Student(int grade) {
4 jumSu = grade;
5 }
6 public int study() {
7 return jumSu++;
8 }
9 public int study(int grade) {
10 return jumSu + grade;
11 }
12 }
13 class UniversityStudent extends Student {
14 private int grade = 10;
15 public UniversityStudent() {
16 grade = study(grade);
17 }
18 }
19 class University {
20 public static void main(String args[]) {
21 UniversityStudent us = new UniversityStudent();
22 }
23 }
  1. (1) 위 프로그램에서 발생하는 컴파일 오류의 원인을 설명하시오. (5점)
  2. (2) 위 프로그램에서 컴파일 오류가 발생하지 않도록 Student 클래스를 수정하시오. (5점)