2023년-정보처리기사실기-1회차
정보처리기사 실기 기출문제

2023년 정보처리기사실기 1회차

총 20문항 · 주관식 · A4 약 1장

1 / 1
A4정답 포함
정보처리기사 실기 기출문제모두CBT · moducbt.com

2023년 정보처리기사실기 1회차

총 20문항 · 주관식 · 정답·해설 포함
문제 1

23-1

아래 C 프로그램을 실행했을 때 출력 결과를 적으시오.

#include <stdio.h>

int main(void) {
    char w[] = "Moon";
    char *q = NULL;
    int i;

    q = w + 1;
    printf("%s\n", w);
    printf("%c\n", *q);
    printf("%c\n", *(w + 3));
    printf("%s\n", q);

    for (i = 3; i >= 0; i--)
        printf("%c", w[i]);
    return 0;
}
정답 및 해설

Moon
o
n
oon
nooM


[해설]

배열 이름 w는 첫 원소의 주소이고, q = w + 1은 두 번째 문자 'o'를 가리킨다.

  • %s와 w: 널 문자 전까지 전부 → Moon
  • %c와 *q: q가 가리키는 한 글자 → o
  • %c와 *(w + 3): w[3]과 같다 → n
  • %s와 q: 두 번째 문자부터 끝까지 → oon

마지막 for문은 인덱스 3부터 0까지 거꾸로 한 글자씩 찍으므로 nooM이 출력된다. 이 줄 끝에는 개행이 없다.

문제 2

23-1

관계 데이터베이스 용어에 대한 설명이다. 빈칸 ①~③에 알맞은 용어를 [보기]에서 골라 적으시오.

  • ( ① ): 표 형태로 본 릴레이션에서 가로 한 줄에 해당하며, 파일 시스템의 레코드에 대응한다.
  • ( ② ): 스키마라는 틀에 어느 순간 담겨 있는 값들, 즉 튜플의 모음을 말한다. 시간에 따라 계속 바뀌며 외연이라고도 부른다.
  • ( ③ ): 주어진 데이터 모음 안에서 겹치지 않는 값이 몇 개인지를 나타내는 수치이다.

[보기] 디그리(Degree), 릴레이션 스키마(Relation Schema), 릴레이션 인스턴스(Relation Instance), 애트리뷰트(Attribute), 카디널리티(Cardinality), 튜플(Tuple)

정답 및 해설

① 튜플(Tuple)

② 릴레이션 인스턴스(Relation Instance)

③ 카디널리티(Cardinality)


[해설]

릴레이션의 행은 튜플, 특정 시점에 담긴 튜플의 모음은 릴레이션 인스턴스, 서로 다른 값의 개수는 카디널리티다.

  • 튜플 — 표의 가로 한 줄로, 파일 시스템의 레코드에 해당한다.
  • 릴레이션 인스턴스 — 스키마(내포)라는 틀에 실제로 담긴 값의 집합(외연)이라 시간에 따라 바뀐다.
  • 카디널리티 — 겹치지 않는 값의 수이며, 릴레이션 전체로 보면 튜플의 수다.

혼동 주의: 디그리는 애트리뷰트(열)의 수이고, 릴레이션 스키마는 값이 아니라 구조를 가리킨다.

문제 3

23-1

아래 Java 프로그램은 배열을 내림차순으로 정렬해 8 6 3 2 1을 출력한다. 빈칸 ①, ②에 들어갈 알맞은 식별자를 적으시오. (단, 코드에 선언된 변수명으로 적는다.)

public class Main {
    static void exchange(int[] arr, int p, int q) {
        int tmp = arr[q];
        arr[q] = arr[p];
        arr[__①__] = tmp;
    }

    static void sortDesc(int[] arr, int n) {
        for (int r = 0; r < n - 1; r++) {
            for (int c = 0; c < n - 1 - r; c++) {
                if (arr[c] < arr[c + 1]) {
                    exchange(arr, c, c + 1);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = {3, 8, 2, 6, 1};
        int size = 5;
        sortDesc(nums, __②__);
        for (int x : nums) {
            System.out.print(x + " ");
        }
    }
}
정답 및 해설

① p

② size


[해설]

exchange는 tmp에 arr[q]를 보관하고, arr[q]에 arr[p]를 옮긴 뒤, 보관해 둔 값을 arr[p]에 넣어야 두 값이 맞바뀐다.

sortDesc의 두 번째 매개변수 n은 정렬할 원소 개수다. main에서 원소 개수를 담아 둔 변수는 size(5)이다.

sortDesc는 인접한 두 값을 비교해 앞이 작으면 바꾸는 버블 정렬이다. 한 바퀴마다 가장 작은 값이 뒤로 밀려 3 8 2 6 1이 8 6 3 2 1이 된다.

문제 4

23-1

다음은 악성 프로그램에 대한 설명이다. 빈칸 ①~③에 해당하는 것을 [보기]에서 골라 기호로 적으시오.

  • ( ① ): 쓸모 있는 프로그램처럼 위장해 사용자가 스스로 설치·실행하게 만든다. 스스로를 복제하거나 다른 파일을 감염시키지는 않지만, 실행되는 순간 숨겨진 악성 기능이 동작해 공격자에게 시스템 제어권을 넘겨줄 수 있다.
  • ( ② ): 다른 실행 파일이나 프로그램의 일부를 고쳐 자신을 끼워 넣는 방식으로 감염시킨다. 자기 자신이나 변형을 복사하지만, 감염된 파일이 옮겨지지 않는 한 네트워크를 통해 다른 컴퓨터로 스스로 퍼지지는 못한다.
  • ( ③ ): 숙주 파일 없이 독립적으로 실행되며, 운영체제·응용 프로그램의 취약점, 이메일, 공유 폴더, P2P 등을 이용해 네트워크 너머의 컴퓨터로 스스로 복제·확산된다.

[보기] ㉠ 바이러스(Virus) ㉡ 웜(Worm) ㉢ 트로이 목마(Trojan Horse)

정답 및 해설

① ㉢

② ㉠

③ ㉡


[해설]

세 가지는 자기 복제 여부와 스스로 전파하는지로 구분한다.

  • ① 정상 프로그램으로 위장하고 복제하지 않는다 → 트로이 목마
  • ② 다른 파일에 기생해 감염시키지만 스스로 네트워크 전파는 못 한다 → 바이러스
  • ③ 숙주 없이 네트워크를 통해 스스로 퍼진다 → 웜

웜은 대량 확산으로 네트워크 대역폭을 소모시키는 피해가 크고, 트로이 목마는 백도어 설치의 통로로 자주 쓰인다.

문제 5

23-1

아래 Java 프로그램의 실행 결과를 적으시오.

abstract class Device {
    String label;
    abstract public String info(int n);
    public String info() {
        return "Device:" + label;
    }
    public void setLabel(String s) {
        label = s;
    }
}

class Phone extends Device {
    public Phone(String s) {
        setLabel(s + "-X");
    }
    public String info(int n) {
        return "Phone:" + n;
    }
    public String info(String s) {
        return "Phone:" + s;
    }
}

public class Main {
    public static void main(String[] args) {
        Device d = new Phone("Nova");
        System.out.println(d.info());
        System.out.print(d.info(3));
    }
}
정답 및 해설

Device:Nova-X
Phone:3


[해설]

생성자에서 setLabel("Nova" + "-X")가 호출되어 label은 "Nova-X"가 된다.

d.info()는 매개변수가 없는 버전이다. Phone은 이 메서드를 재정의(오버라이딩)하지 않았으므로 Device의 구현이 실행되어 Device:Nova-X가 출력된다.

d.info(3)은 추상 메서드 info(int)를 Phone이 구현한 것이라 동적 바인딩으로 Phone:3이 된다. info(String)은 이름만 같은 오버로딩이며, Device 타입 참조로는 호출할 수 없다.

문제 6

23-1

다음은 어떤 모듈의 제어 흐름 그래프를 노드와 연결 관계로 정리한 표이다.

노드내용다음 노드
①flag = OFF②
②n > LIMIT ?참 → ③, 거짓 → ④
③flag = ON④
④n = n + 3⑤
⑤CALL CHECK(n, flag, res)⑥
⑥res > 0 ?참 → ① (반복), 거짓 → ⑦
⑦PRINT res종료

분기(결정) 커버리지 100%를 만족하도록 테스트 경로 두 개를 노드 번호 순서로 적으시오. (단, 각 경로는 ①에서 시작하며, ⑥의 참 분기는 ①로 돌아가는 지점에서 경로를 끝낸다.)

정답 및 해설

경로 1: ① → ② → ③ → ④ → ⑤ → ⑥ → ①

경로 2: ① → ② → ④ → ⑤ → ⑥ → ⑦

(③을 지나는 경로가 ⑦로 끝나고 ③을 건너뛰는 경로가 ①로 돌아가는 조합도 정답)


[해설]

분기 커버리지는 모든 판단 노드의 참과 거짓을 한 번 이상 실행해야 한다. 판단 노드는 ②와 ⑥ 두 개이므로 네 분기를 모두 지나야 한다.

  • 경로 1: ② 참(③ 경유), ⑥ 참(①로 복귀)
  • 경로 2: ② 거짓(③ 생략), ⑥ 거짓(⑦ 출력)

두 경로로 ②·⑥의 참·거짓 네 방향이 모두 채워진다. ②와 ⑥의 결과는 서로 독립이므로 ② 참 + ⑥ 거짓, ② 거짓 + ⑥ 참으로 짝을 바꿔도 된다.

문제 7

23-1

다음 C 프로그램의 출력 결과를 적으시오.

#include <stdio.h>

int main(void) {
    const char *x = "plant";
    const char *y = "apple";
    const char *p, *r;
    for (p = x; *p; p++) {
        for (r = y; *r; r++) {
            if (*p == *r)
                printf("%c", *p);
        }
    }
    return 0;
}
정답 및 해설

ppla


[해설]

바깥 반복이 x의 문자를 하나씩 잡고, 안쪽 반복이 y 전체를 훑으며 같은 문자를 만날 때마다 출력한다.

  • 'p': y에 p가 두 번 있어 "pp"
  • 'l': 한 번 → "l"
  • 'a': 한 번 → "a"
  • 'n', 't': y에 없어 출력 없음

순서대로 이어 붙이면 ppla다. 출력 순서는 y가 아니라 바깥 문자열 x의 순서를 따른다.

문제 8

23-1

ANSI/SPARC 3단계 데이터베이스 구조의 스키마에 대한 설명이다. 빈칸 ①~③에 알맞은 말을 [보기]에서 골라 적으시오.

  • ( ① ) 스키마: 저장 장치의 관점에서 본 구조로, 실제로 저장될 레코드의 형식, 데이터 항목의 표현 방법, 레코드의 물리적 순서 등을 정의한다.
  • ( ② ) 스키마: 개별 사용자나 응용 프로그램이 보는 데이터베이스의 논리적 구조로, 서브 스키마라고도 한다.
  • ( ③ ) 스키마: 조직 전체 관점의 논리적 구조로, 개체 간 관계, 제약조건, 접근 권한, 무결성과 보안 규칙을 정의한다. 데이터베이스마다 하나만 존재한다.

[보기] 개념, 내부, 외부

정답 및 해설

① 내부

② 외부

③ 개념


[해설]

물리적 저장 형식은 내부 스키마, 사용자별 뷰는 외부 스키마, 조직 전체의 논리 구조는 개념 스키마다.

3단계로 나누는 목적은 데이터 독립성이다. 내부 스키마가 바뀌어도 개념 스키마는 그대로인 것이 물리적 독립성, 개념 스키마가 바뀌어도 외부 스키마가 유지되는 것이 논리적 독립성이다.

문제 9

23-1

[학생] 테이블에서 이름이 '서준'인 튜플을 삭제하는 SQL 문을 작성하시오.

[학생]

학번학년이름
11012서준
11024하린
11031서윤
11043도현
정답 및 해설

DELETE FROM 학생 WHERE 이름 = '서준';


[해설]

테이블에서 행을 지우는 명령은 DML의 DELETE FROM 테이블 WHERE 조건이다.

WHERE 절이 없으면 모든 행이 삭제되므로 이름 조건을 반드시 붙인다. 문자열 값은 작은따옴표로 감싼다.

실행 후에는 1102 하린, 1103 서윤, 1104 도현의 세 행이 남는다. 테이블 구조까지 없애는 DROP TABLE과 혼동하지 않도록 한다.

문제 10

23-1

가상 사설망(VPN) 구축에 쓰이는 터널링 프로토콜에 대한 설명이다. 해당 프로토콜을 영문 약어로 적으시오.

  • Cisco의 L2F(Layer 2 Forwarding)와 Microsoft의 PPTP(Point-to-Point Tunneling Protocol)의 장점을 합쳐 만들었다.
  • 데이터 링크 계층(2계층)에서 인터넷 위의 두 지점 사이에 가상 터널을 만들어 PPP 프레임을 실어 나른다.
  • 자체 암호화 기능이 없어 보통 IPSec과 함께 사용한다.
정답 및 해설

L2TP


[해설]

L2F와 PPTP를 결합한 2계층 터널링 프로토콜은 L2TP(Layer 2 Tunneling Protocol)이다.

L2TP 자체는 터널만 만들고 기밀성을 보장하지 않는다. 그래서 암호화·무결성을 IPSec(IP Security)에 맡기는 L2TP/IPSec 조합으로 주로 쓰인다.

문제 11

23-1

아래 C 프로그램은 10진 정수 형태로 적은 2진수 110101을 10진수로 바꾸어 출력한다. 출력이 53이 되도록 빈칸 ①, ②에 알맞은 연산자와 값을 적으시오.

#include <stdio.h>

int main(void) {
    int bin = 110101;
    int weight = 1;
    int result = 0;

    while (bin > 0) {
        result += (bin __①__ __②__) * weight;
        weight *= 2;
        bin /= 10;
    }
    printf("%d", result);
    return 0;
}
정답 및 해설

① %

② 10


[해설]

정수 bin을 10으로 나눈 나머지(bin % 10)는 맨 끝 자릿수(0 또는 1)다. 그래서 연산자 칸에는 %, 값 칸에는 10이 들어간다.

끝자리에 가중치 weight(1, 2, 4, …)를 곱해 더하고, bin /= 10으로 끝자리를 떼어 낸다.
끝자리부터 1, 0, 1, 0, 1, 1
1×1 + 0×2 + 1×4 + 0×8 + 1×16 + 1×32
= 53

각 자릿수가 0 또는 1뿐이라 bin % 2나 bin & 1도 끝자리 값과 같아서 결과는 같다.

문제 12

23-1

다음 설명에 해당하는 디자인 패턴을 [보기]에서 골라 적으시오.

클라이언트가 진짜 객체를 곧바로 호출하지 않고, 똑같은 인터페이스를 갖춘 중간 대리인을 거치게 한다. 이 대리인이 요청을 받아 필요할 때 진짜 객체에 넘기거나 스스로 응답하며, 접근 권한 검사·무거운 객체의 지연 생성·원격 호출 등에 활용된다.

[보기] Abstract Factory, Adapter, Bridge, Builder, Composite, Decorator, Facade, Flyweight, Mediator, Observer, Prototype, Proxy, Singleton, Strategy, Visitor

정답 및 해설

Proxy


[해설]

같은 인터페이스를 가진 대리 객체가 실제 객체 대신 요청을 받는 것은 구조 패턴인 Proxy(프록시)이다.

  • 보호 프록시는 접근 권한을 검사한 뒤에만 실제 객체에 요청을 넘긴다.
  • 가상 프록시는 무거운 객체를 실제로 필요할 때 만든다(지연 생성).
  • 원격 프록시는 다른 주소 공간에 있는 객체를 로컬 객체처럼 호출하게 해 준다.

혼동 주의: Decorator도 같은 인터페이스로 객체를 감싸지만 목적은 기능 추가이고, Proxy의 목적은 접근 통제이다.

문제 13

23-1

[판매] 테이블을 품목별로 묶어, 평균 수량이 30 이상인 품목과 그 품목의 최소 수량·최대 수량을 조회하려 한다. [조건]을 지켜 SQL 문을 작성하시오.

[판매]

순번품목수량
1커피42
2녹차18
3커피38
4주스25
5녹차22
6주스31
7커피40

[결과]

품목최소수량최대수량
커피3842

[조건]

  • ISO/IEC 9075 표준 SQL로 작성한다.
  • WHERE 절은 쓰지 않는다.
  • GROUP BY와 HAVING을 반드시 사용한다.
  • 집계 함수를 사용하고, SELECT 절의 집계 결과에는 [결과]와 같은 별칭을 붙인다.
  • 문장 끝의 세미콜론(;)은 생략해도 된다.
정답 및 해설

SELECT 품목, MIN(수량) AS 최소수량, MAX(수량) AS 최대수량 FROM 판매 GROUP BY 품목 HAVING AVG(수량) >= 30;


[해설]

그룹 단위 조건은 WHERE가 아니라 GROUP BY 품목 HAVING AVG(수량) >= 30으로 건다. WHERE는 그룹을 만들기 전의 개별 행에만 적용된다.

  • 커피: (42+38+40)/3 = 40 → 조건 충족
  • 녹차: (18+22)/2 = 20 → 제외
  • 주스: (25+31)/2 = 28 → 제외

남은 커피 그룹에서 MIN(수량) AS 최소수량은 38, MAX(수량) AS 최대수량은 42다. AS는 생략해도 표준상 별칭으로 인정된다.

문제 14

23-1

다음 설명의 빈칸 ( ㉮ )에 공통으로 들어갈 기술을 영문 약어로 적으시오.

  • ( ㉮ )는 페이지 전체를 새로 받지 않고, 서버와 비동기로 데이터를 주고받아 화면의 필요한 부분만 갱신한다.
  • JavaScript와 XML(현재는 JSON도 흔히 쓰인다)을 조합해, HTML만으로는 구현하기 어려운 즉각적인 상호 작용을 웹 페이지에 제공한다.
  • 지도를 끌 때 주변 영역이 바로 채워지는 Google Maps, 입력 도중 추천어가 뜨는 Google 검색 제안 등이 ( ㉮ )의 대표적 활용 예이다.
정답 및 해설

AJAX


[해설]

비동기 통신으로 페이지 일부만 다시 불러오는 기법은 AJAX(Asynchronous JavaScript and XML)이다.

브라우저의 XMLHttpRequest(또는 fetch) 객체가 백그라운드에서 요청을 보내고, 응답이 오면 DOM의 해당 부분만 바꾼다. 사용자는 요청 중에도 화면을 계속 조작할 수 있다.

문제 15

23-1

아래 Java 프로그램을 실행했을 때 출력되는 내용을 줄 순서대로 적으시오.

class Counter {
    public int v = 7;
    static int shared = 0;
}

public class Main {
    public static void main(String[] args) {
        int v;
        v = 3;
        Counter.shared = v * 4;
        Counter c = new Counter();
        System.out.println(c.shared--);
        System.out.println(Counter.shared);
        System.out.println(v);
        System.out.print(c.v + Counter.shared);
    }
}
정답 및 해설

12
11
3
18


[해설]

static 필드 shared는 객체마다 따로 생기지 않고 클래스 전체가 하나를 공유한다. 그래서 Counter.shared와 c.shared는 같은 변수다.

  • Counter.shared = 3 * 4 = 12
  • println(c.shared--): 후위 연산이라 12를 먼저 출력한 뒤 11로 줄인다.
  • println(Counter.shared): 이미 줄어든 11
  • println(v): main의 지역 변수 v는 3이다. 인스턴스 필드 v(7)와는 이름만 같은 별개 변수다.
  • print(c.v + Counter.shared): 7 + 11 = 18

static 필드를 참조 변수(c.shared)로 접근해도 동작은 같지만, 보통은 클래스 이름으로 쓰는 것이 권장된다.

문제 16

23-1

패킷 교환 방식을 두 가지로 나눈 설명이다. 빈칸 ①, ②에 알맞은 방식의 이름을 적으시오.

  • ( ① ) 방식: 데이터를 보내기 전에 송신 측과 수신 측 사이에 논리적인 연결 경로를 먼저 정해 두고, 모든 패킷이 그 경로를 따라 차례대로 전달된다.
  • ( ② ) 방식: 연결 경로를 미리 맺지 않는다. 패킷 하나하나가 독립적으로 경로를 선택해 전달되므로 도착 순서가 보낸 순서와 다를 수 있다.
정답 및 해설

① 가상 회선

② 데이터그램


[해설]

패킷 교환 방식은 전송 전에 경로를 정하는지에 따라 가상 회선 방식과 데이터그램 방식으로 나뉜다.

  • 가상 회선(Virtual Circuit) 방식은 호 설정으로 논리 경로를 먼저 맺고 모든 패킷이 그 경로로 가므로 순서가 보장된다.
  • 데이터그램(Datagram) 방식은 경로를 미리 정하지 않고 패킷마다 따로 경로를 고르므로 도착 순서가 바뀔 수 있다.

외우는 요령: 연결을 먼저 맺으면 가상 회선(연결형), 맺지 않으면 데이터그램(비연결형)이다.

문제 17

23-1

아래 Java 프로그램의 출력 결과를 적으시오.

class Base {
    int v = 10;
    Base() {
        this(70);
    }
    Base(int v) {
        this.v = v * 2;
    }
    int getV() {
        return v;
    }
}

class Derived extends Base {
    int v = 300;
    Derived() {
        this(900);
    }
    Derived(int v) {
        this.v = v;
    }
}

public class Main {
    public static void main(String[] args) {
        Derived d = new Derived();
        System.out.print(d.getV() + " " + d.v);
    }
}
정답 및 해설

140 900


[해설]

new Derived()는 Derived()에서 this(900)으로 넘어가고, Derived(int)의 첫 줄에 생략된 super()가 먼저 실행된다.

  • Base(): this(70) 호출
  • Base(int): Base의 v = 70 * 2 = 140
  • Derived 필드 초기화: Derived의 v = 300
  • Derived(int): Derived의 v = 900

getV()는 Base에 정의되어 Base의 v를 돌려주므로 140이다. 필드는 오버라이딩되지 않고 숨겨질 뿐이라, d.v는 Derived 쪽 900이다.

문제 18

23-1

다음 조건을 모두 만족하는 원격 접속 프로토콜의 이름을 적으시오.

  • 기본 포트로 TCP 22번을 사용한다.
  • 통신 내용을 암호화하며, 사용자 인증·데이터 압축·무결성 검증 기능을 제공한다.
  • 평문으로 통신하는 Telnet, rlogin 등을 대체하는 안전한 원격 셸 접속 수단이다.
정답 및 해설

SSH


[해설]

22번 포트를 쓰는 암호화 원격 접속 프로토콜은 SSH(Secure Shell)이다.

Telnet(23번 포트)은 아이디·비밀번호까지 평문으로 보내 도청에 취약하다. SSH는 공개키 기반 인증과 세션 암호화로 이를 막으며, SFTP·SCP 같은 파일 전송도 SSH 위에서 동작한다.

문제 19

23-1

다음 Python 코드의 실행 결과를 적으시오.

s = {3, 1, 5}
s.add(7)
s.add(1)
s.remove(5)
s.update({2, 7, 4})
print(s)
정답 및 해설

{1, 2, 3, 4, 7}


[해설]

set은 중복을 허용하지 않는 자료형이라 이미 있는 값을 add·update해도 한 번만 남는다.

  • add(7) 후 {1, 3, 5, 7}이 된다.
  • add(1)은 이미 있어 변화가 없다.
  • remove(5)로 5가 빠져 {1, 3, 7}이 된다.
  • update({2, 7, 4})로 2와 4만 새로 들어가 {1, 2, 3, 4, 7}이 된다.

혼동 주의: remove는 없는 값을 지우면 KeyError가 나고, discard는 오류 없이 넘어간다.

문제 20

23-1

다음 설명에 해당하는 프로토콜을 영문 약어로 적으시오.

  • IP는 전송 중 문제가 생겨도 스스로 알리는 기능이 없어, 이를 보완하려고 오류 정보와 제어 메시지를 전달하는 네트워크 계층 프로토콜이다.
  • 목적지 도달 불가, 시간 초과 등의 메시지를 보내며, ping·traceroute 명령이 이 프로토콜을 이용한다.
  • 규정보다 큰 패킷을 조각내 보내 수신 측을 마비시키는 Ping of Death 공격에도 악용된다.
정답 및 해설

ICMP


[해설]

IP에 없는 오류 보고·제어 기능을 보완하는 네트워크 계층 프로토콜은 ICMP(Internet Control Message Protocol)이다.

ping은 ICMP Echo Request/Reply로 상대가 응답하는지 확인하고, traceroute는 Time Exceeded 메시지로 거쳐 가는 라우터를 확인한다.

Ping of Death는 최대 크기인 65,535바이트를 넘는 ICMP 패킷을 조각내 보내는 공격이다. 수신 측은 이 조각들을 재조립하는 과정에서 마비된다.

정보처리기사 실기 기출문제모두CBT · moducbt.com
2023년 정보처리기사실기 1회차
총 20문항 · 주관식 · 정답·해설 포함
문제 1

23-1

아래 C 프로그램을 실행했을 때 출력 결과를 적으시오.

#include <stdio.h>

int main(void) {
    char w[] = "Moon";
    char *q = NULL;
    int i;

    q = w + 1;
    printf("%s\n", w);
    printf("%c\n", *q);
    printf("%c\n", *(w + 3));
    printf("%s\n", q);

    for (i = 3; i >= 0; i--)
        printf("%c", w[i]);
    return 0;
}
정답 및 해설

Moon
o
n
oon
nooM


[해설]

배열 이름 w는 첫 원소의 주소이고, q = w + 1은 두 번째 문자 'o'를 가리킨다.

  • %s와 w: 널 문자 전까지 전부 → Moon
  • %c와 *q: q가 가리키는 한 글자 → o
  • %c와 *(w + 3): w[3]과 같다 → n
  • %s와 q: 두 번째 문자부터 끝까지 → oon

마지막 for문은 인덱스 3부터 0까지 거꾸로 한 글자씩 찍으므로 nooM이 출력된다. 이 줄 끝에는 개행이 없다.

문제 2

23-1

관계 데이터베이스 용어에 대한 설명이다. 빈칸 ①~③에 알맞은 용어를 [보기]에서 골라 적으시오.

  • ( ① ): 표 형태로 본 릴레이션에서 가로 한 줄에 해당하며, 파일 시스템의 레코드에 대응한다.
  • ( ② ): 스키마라는 틀에 어느 순간 담겨 있는 값들, 즉 튜플의 모음을 말한다. 시간에 따라 계속 바뀌며 외연이라고도 부른다.
  • ( ③ ): 주어진 데이터 모음 안에서 겹치지 않는 값이 몇 개인지를 나타내는 수치이다.

[보기] 디그리(Degree), 릴레이션 스키마(Relation Schema), 릴레이션 인스턴스(Relation Instance), 애트리뷰트(Attribute), 카디널리티(Cardinality), 튜플(Tuple)

정답 및 해설

① 튜플(Tuple)

② 릴레이션 인스턴스(Relation Instance)

③ 카디널리티(Cardinality)


[해설]

릴레이션의 행은 튜플, 특정 시점에 담긴 튜플의 모음은 릴레이션 인스턴스, 서로 다른 값의 개수는 카디널리티다.

  • 튜플 — 표의 가로 한 줄로, 파일 시스템의 레코드에 해당한다.
  • 릴레이션 인스턴스 — 스키마(내포)라는 틀에 실제로 담긴 값의 집합(외연)이라 시간에 따라 바뀐다.
  • 카디널리티 — 겹치지 않는 값의 수이며, 릴레이션 전체로 보면 튜플의 수다.

혼동 주의: 디그리는 애트리뷰트(열)의 수이고, 릴레이션 스키마는 값이 아니라 구조를 가리킨다.

문제 3

23-1

아래 Java 프로그램은 배열을 내림차순으로 정렬해 8 6 3 2 1을 출력한다. 빈칸 ①, ②에 들어갈 알맞은 식별자를 적으시오. (단, 코드에 선언된 변수명으로 적는다.)

public class Main {
    static void exchange(int[] arr, int p, int q) {
        int tmp = arr[q];
        arr[q] = arr[p];
        arr[__①__] = tmp;
    }

    static void sortDesc(int[] arr, int n) {
        for (int r = 0; r < n - 1; r++) {
            for (int c = 0; c < n - 1 - r; c++) {
                if (arr[c] < arr[c + 1]) {
                    exchange(arr, c, c + 1);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = {3, 8, 2, 6, 1};
        int size = 5;
        sortDesc(nums, __②__);
        for (int x : nums) {
            System.out.print(x + " ");
        }
    }
}
정답 및 해설

① p

② size


[해설]

exchange는 tmp에 arr[q]를 보관하고, arr[q]에 arr[p]를 옮긴 뒤, 보관해 둔 값을 arr[p]에 넣어야 두 값이 맞바뀐다.

sortDesc의 두 번째 매개변수 n은 정렬할 원소 개수다. main에서 원소 개수를 담아 둔 변수는 size(5)이다.

sortDesc는 인접한 두 값을 비교해 앞이 작으면 바꾸는 버블 정렬이다. 한 바퀴마다 가장 작은 값이 뒤로 밀려 3 8 2 6 1이 8 6 3 2 1이 된다.

문제 4

23-1

다음은 악성 프로그램에 대한 설명이다. 빈칸 ①~③에 해당하는 것을 [보기]에서 골라 기호로 적으시오.

  • ( ① ): 쓸모 있는 프로그램처럼 위장해 사용자가 스스로 설치·실행하게 만든다. 스스로를 복제하거나 다른 파일을 감염시키지는 않지만, 실행되는 순간 숨겨진 악성 기능이 동작해 공격자에게 시스템 제어권을 넘겨줄 수 있다.
  • ( ② ): 다른 실행 파일이나 프로그램의 일부를 고쳐 자신을 끼워 넣는 방식으로 감염시킨다. 자기 자신이나 변형을 복사하지만, 감염된 파일이 옮겨지지 않는 한 네트워크를 통해 다른 컴퓨터로 스스로 퍼지지는 못한다.
  • ( ③ ): 숙주 파일 없이 독립적으로 실행되며, 운영체제·응용 프로그램의 취약점, 이메일, 공유 폴더, P2P 등을 이용해 네트워크 너머의 컴퓨터로 스스로 복제·확산된다.

[보기] ㉠ 바이러스(Virus) ㉡ 웜(Worm) ㉢ 트로이 목마(Trojan Horse)

정답 및 해설

① ㉢

② ㉠

③ ㉡


[해설]

세 가지는 자기 복제 여부와 스스로 전파하는지로 구분한다.

  • ① 정상 프로그램으로 위장하고 복제하지 않는다 → 트로이 목마
  • ② 다른 파일에 기생해 감염시키지만 스스로 네트워크 전파는 못 한다 → 바이러스
  • ③ 숙주 없이 네트워크를 통해 스스로 퍼진다 → 웜

웜은 대량 확산으로 네트워크 대역폭을 소모시키는 피해가 크고, 트로이 목마는 백도어 설치의 통로로 자주 쓰인다.

문제 5

23-1

아래 Java 프로그램의 실행 결과를 적으시오.

abstract class Device {
    String label;
    abstract public String info(int n);
    public String info() {
        return "Device:" + label;
    }
    public void setLabel(String s) {
        label = s;
    }
}

class Phone extends Device {
    public Phone(String s) {
        setLabel(s + "-X");
    }
    public String info(int n) {
        return "Phone:" + n;
    }
    public String info(String s) {
        return "Phone:" + s;
    }
}

public class Main {
    public static void main(String[] args) {
        Device d = new Phone("Nova");
        System.out.println(d.info());
        System.out.print(d.info(3));
    }
}
정답 및 해설

Device:Nova-X
Phone:3


[해설]

생성자에서 setLabel("Nova" + "-X")가 호출되어 label은 "Nova-X"가 된다.

d.info()는 매개변수가 없는 버전이다. Phone은 이 메서드를 재정의(오버라이딩)하지 않았으므로 Device의 구현이 실행되어 Device:Nova-X가 출력된다.

d.info(3)은 추상 메서드 info(int)를 Phone이 구현한 것이라 동적 바인딩으로 Phone:3이 된다. info(String)은 이름만 같은 오버로딩이며, Device 타입 참조로는 호출할 수 없다.

문제 6

23-1

다음은 어떤 모듈의 제어 흐름 그래프를 노드와 연결 관계로 정리한 표이다.

노드내용다음 노드
①flag = OFF②
②n > LIMIT ?참 → ③, 거짓 → ④
③flag = ON④
④n = n + 3⑤
⑤CALL CHECK(n, flag, res)⑥
⑥res > 0 ?참 → ① (반복), 거짓 → ⑦
⑦PRINT res종료

분기(결정) 커버리지 100%를 만족하도록 테스트 경로 두 개를 노드 번호 순서로 적으시오. (단, 각 경로는 ①에서 시작하며, ⑥의 참 분기는 ①로 돌아가는 지점에서 경로를 끝낸다.)

정답 및 해설

경로 1: ① → ② → ③ → ④ → ⑤ → ⑥ → ①

경로 2: ① → ② → ④ → ⑤ → ⑥ → ⑦

(③을 지나는 경로가 ⑦로 끝나고 ③을 건너뛰는 경로가 ①로 돌아가는 조합도 정답)


[해설]

분기 커버리지는 모든 판단 노드의 참과 거짓을 한 번 이상 실행해야 한다. 판단 노드는 ②와 ⑥ 두 개이므로 네 분기를 모두 지나야 한다.

  • 경로 1: ② 참(③ 경유), ⑥ 참(①로 복귀)
  • 경로 2: ② 거짓(③ 생략), ⑥ 거짓(⑦ 출력)

두 경로로 ②·⑥의 참·거짓 네 방향이 모두 채워진다. ②와 ⑥의 결과는 서로 독립이므로 ② 참 + ⑥ 거짓, ② 거짓 + ⑥ 참으로 짝을 바꿔도 된다.

문제 7

23-1

다음 C 프로그램의 출력 결과를 적으시오.

#include <stdio.h>

int main(void) {
    const char *x = "plant";
    const char *y = "apple";
    const char *p, *r;
    for (p = x; *p; p++) {
        for (r = y; *r; r++) {
            if (*p == *r)
                printf("%c", *p);
        }
    }
    return 0;
}
정답 및 해설

ppla


[해설]

바깥 반복이 x의 문자를 하나씩 잡고, 안쪽 반복이 y 전체를 훑으며 같은 문자를 만날 때마다 출력한다.

  • 'p': y에 p가 두 번 있어 "pp"
  • 'l': 한 번 → "l"
  • 'a': 한 번 → "a"
  • 'n', 't': y에 없어 출력 없음

순서대로 이어 붙이면 ppla다. 출력 순서는 y가 아니라 바깥 문자열 x의 순서를 따른다.

문제 8

23-1

ANSI/SPARC 3단계 데이터베이스 구조의 스키마에 대한 설명이다. 빈칸 ①~③에 알맞은 말을 [보기]에서 골라 적으시오.

  • ( ① ) 스키마: 저장 장치의 관점에서 본 구조로, 실제로 저장될 레코드의 형식, 데이터 항목의 표현 방법, 레코드의 물리적 순서 등을 정의한다.
  • ( ② ) 스키마: 개별 사용자나 응용 프로그램이 보는 데이터베이스의 논리적 구조로, 서브 스키마라고도 한다.
  • ( ③ ) 스키마: 조직 전체 관점의 논리적 구조로, 개체 간 관계, 제약조건, 접근 권한, 무결성과 보안 규칙을 정의한다. 데이터베이스마다 하나만 존재한다.

[보기] 개념, 내부, 외부

정답 및 해설

① 내부

② 외부

③ 개념


[해설]

물리적 저장 형식은 내부 스키마, 사용자별 뷰는 외부 스키마, 조직 전체의 논리 구조는 개념 스키마다.

3단계로 나누는 목적은 데이터 독립성이다. 내부 스키마가 바뀌어도 개념 스키마는 그대로인 것이 물리적 독립성, 개념 스키마가 바뀌어도 외부 스키마가 유지되는 것이 논리적 독립성이다.

문제 9

23-1

[학생] 테이블에서 이름이 '서준'인 튜플을 삭제하는 SQL 문을 작성하시오.

[학생]

학번학년이름
11012서준
11024하린
11031서윤
11043도현
정답 및 해설

DELETE FROM 학생 WHERE 이름 = '서준';


[해설]

테이블에서 행을 지우는 명령은 DML의 DELETE FROM 테이블 WHERE 조건이다.

WHERE 절이 없으면 모든 행이 삭제되므로 이름 조건을 반드시 붙인다. 문자열 값은 작은따옴표로 감싼다.

실행 후에는 1102 하린, 1103 서윤, 1104 도현의 세 행이 남는다. 테이블 구조까지 없애는 DROP TABLE과 혼동하지 않도록 한다.

문제 10

23-1

가상 사설망(VPN) 구축에 쓰이는 터널링 프로토콜에 대한 설명이다. 해당 프로토콜을 영문 약어로 적으시오.

  • Cisco의 L2F(Layer 2 Forwarding)와 Microsoft의 PPTP(Point-to-Point Tunneling Protocol)의 장점을 합쳐 만들었다.
  • 데이터 링크 계층(2계층)에서 인터넷 위의 두 지점 사이에 가상 터널을 만들어 PPP 프레임을 실어 나른다.
  • 자체 암호화 기능이 없어 보통 IPSec과 함께 사용한다.
정답 및 해설

L2TP


[해설]

L2F와 PPTP를 결합한 2계층 터널링 프로토콜은 L2TP(Layer 2 Tunneling Protocol)이다.

L2TP 자체는 터널만 만들고 기밀성을 보장하지 않는다. 그래서 암호화·무결성을 IPSec(IP Security)에 맡기는 L2TP/IPSec 조합으로 주로 쓰인다.

문제 11

23-1

아래 C 프로그램은 10진 정수 형태로 적은 2진수 110101을 10진수로 바꾸어 출력한다. 출력이 53이 되도록 빈칸 ①, ②에 알맞은 연산자와 값을 적으시오.

#include <stdio.h>

int main(void) {
    int bin = 110101;
    int weight = 1;
    int result = 0;

    while (bin > 0) {
        result += (bin __①__ __②__) * weight;
        weight *= 2;
        bin /= 10;
    }
    printf("%d", result);
    return 0;
}
정답 및 해설

① %

② 10


[해설]

정수 bin을 10으로 나눈 나머지(bin % 10)는 맨 끝 자릿수(0 또는 1)다. 그래서 연산자 칸에는 %, 값 칸에는 10이 들어간다.

끝자리에 가중치 weight(1, 2, 4, …)를 곱해 더하고, bin /= 10으로 끝자리를 떼어 낸다.
끝자리부터 1, 0, 1, 0, 1, 1
1×1 + 0×2 + 1×4 + 0×8 + 1×16 + 1×32
= 53

각 자릿수가 0 또는 1뿐이라 bin % 2나 bin & 1도 끝자리 값과 같아서 결과는 같다.

문제 12

23-1

다음 설명에 해당하는 디자인 패턴을 [보기]에서 골라 적으시오.

클라이언트가 진짜 객체를 곧바로 호출하지 않고, 똑같은 인터페이스를 갖춘 중간 대리인을 거치게 한다. 이 대리인이 요청을 받아 필요할 때 진짜 객체에 넘기거나 스스로 응답하며, 접근 권한 검사·무거운 객체의 지연 생성·원격 호출 등에 활용된다.

[보기] Abstract Factory, Adapter, Bridge, Builder, Composite, Decorator, Facade, Flyweight, Mediator, Observer, Prototype, Proxy, Singleton, Strategy, Visitor

정답 및 해설

Proxy


[해설]

같은 인터페이스를 가진 대리 객체가 실제 객체 대신 요청을 받는 것은 구조 패턴인 Proxy(프록시)이다.

  • 보호 프록시는 접근 권한을 검사한 뒤에만 실제 객체에 요청을 넘긴다.
  • 가상 프록시는 무거운 객체를 실제로 필요할 때 만든다(지연 생성).
  • 원격 프록시는 다른 주소 공간에 있는 객체를 로컬 객체처럼 호출하게 해 준다.

혼동 주의: Decorator도 같은 인터페이스로 객체를 감싸지만 목적은 기능 추가이고, Proxy의 목적은 접근 통제이다.

문제 13

23-1

[판매] 테이블을 품목별로 묶어, 평균 수량이 30 이상인 품목과 그 품목의 최소 수량·최대 수량을 조회하려 한다. [조건]을 지켜 SQL 문을 작성하시오.

[판매]

순번품목수량
1커피42
2녹차18
3커피38
4주스25
5녹차22
6주스31
7커피40

[결과]

품목최소수량최대수량
커피3842

[조건]

  • ISO/IEC 9075 표준 SQL로 작성한다.
  • WHERE 절은 쓰지 않는다.
  • GROUP BY와 HAVING을 반드시 사용한다.
  • 집계 함수를 사용하고, SELECT 절의 집계 결과에는 [결과]와 같은 별칭을 붙인다.
  • 문장 끝의 세미콜론(;)은 생략해도 된다.
정답 및 해설

SELECT 품목, MIN(수량) AS 최소수량, MAX(수량) AS 최대수량 FROM 판매 GROUP BY 품목 HAVING AVG(수량) >= 30;


[해설]

그룹 단위 조건은 WHERE가 아니라 GROUP BY 품목 HAVING AVG(수량) >= 30으로 건다. WHERE는 그룹을 만들기 전의 개별 행에만 적용된다.

  • 커피: (42+38+40)/3 = 40 → 조건 충족
  • 녹차: (18+22)/2 = 20 → 제외
  • 주스: (25+31)/2 = 28 → 제외

남은 커피 그룹에서 MIN(수량) AS 최소수량은 38, MAX(수량) AS 최대수량은 42다. AS는 생략해도 표준상 별칭으로 인정된다.

문제 14

23-1

다음 설명의 빈칸 ( ㉮ )에 공통으로 들어갈 기술을 영문 약어로 적으시오.

  • ( ㉮ )는 페이지 전체를 새로 받지 않고, 서버와 비동기로 데이터를 주고받아 화면의 필요한 부분만 갱신한다.
  • JavaScript와 XML(현재는 JSON도 흔히 쓰인다)을 조합해, HTML만으로는 구현하기 어려운 즉각적인 상호 작용을 웹 페이지에 제공한다.
  • 지도를 끌 때 주변 영역이 바로 채워지는 Google Maps, 입력 도중 추천어가 뜨는 Google 검색 제안 등이 ( ㉮ )의 대표적 활용 예이다.
정답 및 해설

AJAX


[해설]

비동기 통신으로 페이지 일부만 다시 불러오는 기법은 AJAX(Asynchronous JavaScript and XML)이다.

브라우저의 XMLHttpRequest(또는 fetch) 객체가 백그라운드에서 요청을 보내고, 응답이 오면 DOM의 해당 부분만 바꾼다. 사용자는 요청 중에도 화면을 계속 조작할 수 있다.

문제 15

23-1

아래 Java 프로그램을 실행했을 때 출력되는 내용을 줄 순서대로 적으시오.

class Counter {
    public int v = 7;
    static int shared = 0;
}

public class Main {
    public static void main(String[] args) {
        int v;
        v = 3;
        Counter.shared = v * 4;
        Counter c = new Counter();
        System.out.println(c.shared--);
        System.out.println(Counter.shared);
        System.out.println(v);
        System.out.print(c.v + Counter.shared);
    }
}
정답 및 해설

12
11
3
18


[해설]

static 필드 shared는 객체마다 따로 생기지 않고 클래스 전체가 하나를 공유한다. 그래서 Counter.shared와 c.shared는 같은 변수다.

  • Counter.shared = 3 * 4 = 12
  • println(c.shared--): 후위 연산이라 12를 먼저 출력한 뒤 11로 줄인다.
  • println(Counter.shared): 이미 줄어든 11
  • println(v): main의 지역 변수 v는 3이다. 인스턴스 필드 v(7)와는 이름만 같은 별개 변수다.
  • print(c.v + Counter.shared): 7 + 11 = 18

static 필드를 참조 변수(c.shared)로 접근해도 동작은 같지만, 보통은 클래스 이름으로 쓰는 것이 권장된다.

문제 16

23-1

패킷 교환 방식을 두 가지로 나눈 설명이다. 빈칸 ①, ②에 알맞은 방식의 이름을 적으시오.

  • ( ① ) 방식: 데이터를 보내기 전에 송신 측과 수신 측 사이에 논리적인 연결 경로를 먼저 정해 두고, 모든 패킷이 그 경로를 따라 차례대로 전달된다.
  • ( ② ) 방식: 연결 경로를 미리 맺지 않는다. 패킷 하나하나가 독립적으로 경로를 선택해 전달되므로 도착 순서가 보낸 순서와 다를 수 있다.
정답 및 해설

① 가상 회선

② 데이터그램


[해설]

패킷 교환 방식은 전송 전에 경로를 정하는지에 따라 가상 회선 방식과 데이터그램 방식으로 나뉜다.

  • 가상 회선(Virtual Circuit) 방식은 호 설정으로 논리 경로를 먼저 맺고 모든 패킷이 그 경로로 가므로 순서가 보장된다.
  • 데이터그램(Datagram) 방식은 경로를 미리 정하지 않고 패킷마다 따로 경로를 고르므로 도착 순서가 바뀔 수 있다.

외우는 요령: 연결을 먼저 맺으면 가상 회선(연결형), 맺지 않으면 데이터그램(비연결형)이다.

문제 17

23-1

아래 Java 프로그램의 출력 결과를 적으시오.

class Base {
    int v = 10;
    Base() {
        this(70);
    }
    Base(int v) {
        this.v = v * 2;
    }
    int getV() {
        return v;
    }
}

class Derived extends Base {
    int v = 300;
    Derived() {
        this(900);
    }
    Derived(int v) {
        this.v = v;
    }
}

public class Main {
    public static void main(String[] args) {
        Derived d = new Derived();
        System.out.print(d.getV() + " " + d.v);
    }
}
정답 및 해설

140 900


[해설]

new Derived()는 Derived()에서 this(900)으로 넘어가고, Derived(int)의 첫 줄에 생략된 super()가 먼저 실행된다.

  • Base(): this(70) 호출
  • Base(int): Base의 v = 70 * 2 = 140
  • Derived 필드 초기화: Derived의 v = 300
  • Derived(int): Derived의 v = 900

getV()는 Base에 정의되어 Base의 v를 돌려주므로 140이다. 필드는 오버라이딩되지 않고 숨겨질 뿐이라, d.v는 Derived 쪽 900이다.

문제 18

23-1

다음 조건을 모두 만족하는 원격 접속 프로토콜의 이름을 적으시오.

  • 기본 포트로 TCP 22번을 사용한다.
  • 통신 내용을 암호화하며, 사용자 인증·데이터 압축·무결성 검증 기능을 제공한다.
  • 평문으로 통신하는 Telnet, rlogin 등을 대체하는 안전한 원격 셸 접속 수단이다.
정답 및 해설

SSH


[해설]

22번 포트를 쓰는 암호화 원격 접속 프로토콜은 SSH(Secure Shell)이다.

Telnet(23번 포트)은 아이디·비밀번호까지 평문으로 보내 도청에 취약하다. SSH는 공개키 기반 인증과 세션 암호화로 이를 막으며, SFTP·SCP 같은 파일 전송도 SSH 위에서 동작한다.

문제 19

23-1

다음 Python 코드의 실행 결과를 적으시오.

s = {3, 1, 5}
s.add(7)
s.add(1)
s.remove(5)
s.update({2, 7, 4})
print(s)
정답 및 해설

{1, 2, 3, 4, 7}


[해설]

set은 중복을 허용하지 않는 자료형이라 이미 있는 값을 add·update해도 한 번만 남는다.

  • add(7) 후 {1, 3, 5, 7}이 된다.
  • add(1)은 이미 있어 변화가 없다.
  • remove(5)로 5가 빠져 {1, 3, 7}이 된다.
  • update({2, 7, 4})로 2와 4만 새로 들어가 {1, 2, 3, 4, 7}이 된다.

혼동 주의: remove는 없는 값을 지우면 KeyError가 나고, discard는 오류 없이 넘어간다.

문제 20

23-1

다음 설명에 해당하는 프로토콜을 영문 약어로 적으시오.

  • IP는 전송 중 문제가 생겨도 스스로 알리는 기능이 없어, 이를 보완하려고 오류 정보와 제어 메시지를 전달하는 네트워크 계층 프로토콜이다.
  • 목적지 도달 불가, 시간 초과 등의 메시지를 보내며, ping·traceroute 명령이 이 프로토콜을 이용한다.
  • 규정보다 큰 패킷을 조각내 보내 수신 측을 마비시키는 Ping of Death 공격에도 악용된다.
정답 및 해설

ICMP


[해설]

IP에 없는 오류 보고·제어 기능을 보완하는 네트워크 계층 프로토콜은 ICMP(Internet Control Message Protocol)이다.

ping은 ICMP Echo Request/Reply로 상대가 응답하는지 확인하고, traceroute는 Time Exceeded 메시지로 거쳐 가는 라우터를 확인한다.

Ping of Death는 최대 크기인 65,535바이트를 넘는 ICMP 패킷을 조각내 보내는 공격이다. 수신 측은 이 조각들을 재조립하는 과정에서 마비된다.