본문 바로가기

개발/정보처리기사

[수제비 출처] 2020년 기사 실기 출제예상 문제[Daily 141-150번]

141. 다음은 C++ 코드이다. 출력결과를 쓰시오.

#include <iostream>
int fn1(){
  return 5;
}

int fn2(){
  return fn1()+20;
}

int fn3(){
  return fn1()+fn2();
}

void main(){
  std::cout << fn3();
}

정답) 30

참고) 수제비 정보처리기사 실기 10-20페이지

해설) 소스 코드는 main에서 시작하는데, std::cout을 보면 fn3()을 출력하라고 하고 있습니다. fn3()함수는 fn1()+fn2()를 반환해야하는데, 여기서 fn2()는 fn1()+20을 반환합니다. fn1()은 5를 반환하므로 fn2()는 fn1()+20=5+20=25가 됩니다.

fn3()은 fn1()+fn2()를 반환해야 한다고 했는데, fn1()은 5를, fn2()는 25를 반환하므로 fn1()+fn2()=5+25=30이 출력됩니다.

※ return과 출력에 대해서 혼돈하는 경우가 많은데, return은 함수가 종료되었을 때 반환하는 값입니다. 출력은 printf, cout, print 함수를 통해서 수행한다는 점도 꼭 기억하시기 바랍니다!!


142. 다음은 C언어 코드이다. 출력 결과를 쓰시오.

#include <stdio.h>

void main(){
 int a[5] = {2, 4, 1, 3, 0};
 printf("%d %d", a[a[4]], a[3]+a[1]);
}

정답) 2 7

해설) 배열 인덱스를 통해 나온 값을 인덱스로 넣었을 때 결과를 묻는 문제입니다.

a[4]는 0이므로 a[a[4]]는 a[0]이고, a[0]은 2이므로 printf의 첫 번째 %d는 2가 출력 됩니다.

a[3]는 3이고, a[1]는 4이므로 a[3]+a[1]=3+4=7입니다.


143. 다음은 자바 코드이다. 다음 물음에 답하시오.

class A{
  public void fn(){}
}

class B ( ① ) A{ // B는 A를 상속받음
  public void fn(){}
}

...(생략)...

(1) 위의 코드에서 ①에 들어가는 키워드는 무엇인가?

(2) 위의 코드의 fn처럼 하위 클래스에서 상위 클래스 메서드를 재정의 할 수 있는 기능을 무엇이라고 하는가?

정답)

(1) extends

(2) 오버라이딩

참고) 수제비 정보처리기사 10-76, 10-77페이지


144. 다음은 비밀키 암호화 알고리즘에 대한 설명이다. 괄호( ) 안에 들어갈 암호화 알고리즘을 쓰시오.

( ① ) : 고급 암호화 표준이라고 불리는 암호 알고리즘이며 블록 크기는 128비트이며, 키 길이에 따라 128비트, 192비트, 256비트로 분류할 수 있고, 암호화와 복호화 과정에서 동일한 키를 사용하는 대칭 키 알고리즘이다.
( ② ) : KISA, ETRI에서 개발하고 TTA에서 인증한 안전성, 신뢰성이 우수한 고속 블록 단위의 128비트 대칭 키 암호화 알고리즘이다.
( ③ ) : 56bit의 키를 이용, 64bit의 평문 블록을 64bit의 암호문 블록으로 만드는 블록 방식의 암호화 알고리즘이다.

정답)

AES(Advanced Encryption Standard)

SEED

DES(Data Encryption Standard)


145. 다음은 C++ 코드이다. 출력 결과를 쓰시오.

#include <iostream>
using namespace std;
class A{
public:
  A( ){
    cout << "A" << endl;
  };
  A(int a){
    cout << "B" << endl;
  };
  ~A( ){
    cout << "C" << endl;
  };
  void fn( ){
    cout << "D" << endl;
  }
};

void main( ){
  A a = A(5);
  a.fn( );
}

정답)

B

D

C

해설) 클래스 A가 있는데 메서드로 A(), A(int a)가 있습니다. 클래스명과 동일한 이름을 가진 메서드가 생성자입니다. 그리고 ~가 붙어있으면서 클래스 A와 이름이 동일한 ~A() 메서드가 있는데, 이것은 생성자와 정반대의 기능을 하는 소멸자입니다.

main 함수에서 A a = A(5);라고 되어 있기 때문에 A(int a)라는 생성자를 호출하게 되고, B를 출력하게 됩니다. 그 다음 a.fn()은 A클래스의 fn()메서드를 호출하므로 D가 출력이 됩니다.

main함수가 종료되면 a라는 변수가 사라지게 되는데, 이 때 소멸자가 호출이 됩니다. 소멸자가 호출이 되면 ~A()가 불리고, C가 호출되면서 프로그램이 종료하게 됩니다.

생성자는 주로 클래스 내의 변수들을 초기화, 동적 메모리 할당 등을 할 때 사용하고, 소멸자는 주로 클래스 내의 동적할당 되어 있는 메모리들을 해제시킬 때 사용합니다.


145. 다음은 C++ 코드이다. 출력 결과를 쓰시오.

#include <iostream>
using namespace std;
class A{
public:
  A( ){
    cout << "A" << endl;
  };
  A(int a){
    cout << "B" << endl;
  };
  ~A( ){
    cout << "C" << endl;
  };
  void fn( ){
    cout << "D" << endl;
  }
};

void main( ){
  A *a = new A(5);
  a->fn();
}

정답)

B

D

해설)

A a = A(5);와 A* a = new A(5);의 차이를 알고 계시라고 낸 문제입니다.

int a;라고 하면 정수형 변수를 저장할 수 있는 a라는 이름의 변수가 만들어집니다.

int *a;라고 하면 정수형 포인터를 가리키는 a라는 이름의 포인터 변수가 만들어집니다.

마찬가지로 A a;라고 하면 A클래스를 저장할 수 있는 a라는 이름의 변수가 만들어집니다.

다시 돌아와서 A *a라고 하면 A 클래스를 저장하고 있는 공간을 가리키는 a라는 이름의 포인터 변수가 만들어집니다.

A *a = new A(5);에 대해서 다시 설명을 하면 new A(5);라는 것은 메모리 어딘가에 A클래스에 해당하는 내용(정확히는 인스턴스라고 표현)을 할당합니다. 이 내용의 주소 값을 A *a를 통해 a라는 변수에 저장합니다. 즉, new A(5)로 만들어진 메모리 공간의 주소를 a가 가지고 있는 것입니다.

어쨌든 포인터로 선언하면 new가 선언될 때 생성자가 호출됩니다.

그리고 포인터 변수에 new를 했으면 delete를 해주어야 메모리가 해제됩니다. 해당 코드에서는 delete를 따로 안해주었기 때문에 프로그램이 종료해도 메모리는 할당된 상태가 됩니다.(이걸 메모리 누수라고 합니다.)

만약 코드에서 delete a; 문장이 있었다면 소멸자가 생성되어 어제 데일리 문제 값과 동일하게 나오게 됩니다.

추가로 어제 데일리 문제처럼 일반 변수일 때는 a.fn()으로 메서드 접근을 하고, 오늘 데일리 문제처럼 포인터 변수일 때는 a->fn()으로 메서드 접근을 합니다.

어제와 동일한 결과를 내려면 main 함수가 다음과 같아야 합니다.

void main( ){
  A *a = new A(5);
  a->fn();
  delete a; ///// delete를 해주면 소멸자가 호출됩니다.
}

147. 다음은 파이썬 코드이다. 생성자(①)와 소멸자(파괴자)(②) 키워드를 쓰시오

class A:
  def __init__(self):
    print("생성자")
  def __del__(self):
    print("소멸자")

a = A()
del a

정답)

① __init__

② __del__

해설) 145, 146번 문제에서는 C++의 생성자/소멸자라면 이번에는 파이썬의 생성자/소멸자입니다.

C++과 기능은 똑같은데, 키워드가 다르다는 것을 확인해두시면 좋을 것 같습니다.

문법은 다음과 같습니다.(참고로 파이썬은 매개변수로 무조건 self를 선언해 주어야 합니다.

구분 문법
생성자 class 클래스명:
 def __init__(self):
  명령어
소멸자(파괴자) class 클래스명:
 def __del__(self):
  명령어

추가로 출력 결과는

생성자

소멸자


148. 다음은 소프트웨어 테스트의 원리중 하나이다. 괄호안에 들어갈 내용으로 가장 알맞은 용어를 쓰시오.

( ① ) 동일한 테스트 케이스에 의한 반복적 테스트는 새로운 버그를 찾지 못함
테스트 케이스의 정기적 리뷰와 개선 및 다른 시각에서의 접근이 필요
( ② ) 요구사항을 충족시켜 주지 못한다면 결함이 없다고 해도 품질이 높다고 볼 수 없음

답)

살충제 패러독스

오류-부재의 궤변

정답 및 해설) 소프트웨어 테스트의 원리 7가지는 기억해 두시기 바랄게요

소프트웨어 테스트의 원리는 교재 7-2를 참고해 주세요


149. 다음 SQL문장의 실행 결과에 들어갈 알맞은 용어를 쓰시오.

성적 테이블

학번 과목 성적
1000 보안 A
1001 운영체제 B
1002 통계 A+
1003 암호학 B+
1005 알고리즘 A
1006 보안 A+

SQL문

select 과목 from ( select 과목, count(과목) from 성적 group by 과목 having count(과목) > 1 ) a;

실행결과

과목
( )

답) 보안

정답 및 해설)

먼저 아래의 쿼리가 실행이 된다.

​select 과목, count(과목)

from 성적

group by 과목

having count( 과목) > 1;
-- group by 를 이용하여 과목별로 건수(count)를 집계한 후, 과목의 건수가 1보다 큰 데이터만 추출한다.
MariaDB [test2]> select 과목, count(과목)
    -> from 성적
    -> group by 과목
    -> having count(과목) > 1;

+--------+---------------+
| 과목   | count(과목)   |
+--------+---------------+
| 보안   |             2 |
+--------+---------------+
1 row in set (0.00 sec)

위 결과를 다시 select 명령으로 과목만 추출한다.

MariaDB [test2]> select 과목
    -> from
    -> (
    ->     select 과목, count(과목)
    ->     from 성적
    ->     group by 과목
    ->     having count( 과목) > 1
    -> ) a;
+--------+
| 과목   |
+--------+
| 보안   |
+--------+
1 row in set (0.00 sec)

150. 다음은 UML에 대한 설명이다. 괄호( ) 안에 들어갈 용어를 쓰시오.

- ( ① ) : 동작에 참여하는 객체들이 주고받는 메시지를 표현하고, 메시지뿐만 아니라 객체 간의 연관(관계)까지 표현하는 다이어그램
- ​( ② ) : 하나의 객체가 자신이 속한 클래스의 상태 변화 혹은 다른 객체와의 상호 작용에 따라 상태가 어떻게 변화하는지 표현하는 다이어그램

정답)

커뮤니케이션 다이어그램

상태 다이어그램