본문 바로가기
  • 코딩, 허쌤이 떠먹여 줄게
BackEnd/정보처리기사

[2023년 1회] 정보처리기사 실기 - 문제 해설

by 허쌤 2026. 2. 23.

[2023년 1회] 정보처리기사 실기 복원 문제 해설

문제 1. Java static 변수와 인스턴스 변수

문제 코드

class Static{
    public int a = 20;
    static int b = 0;
}

public class Main{
    public static void main(String[] args) {
        int a;
        a = 10;
        Static.b = a;

        Static st = new Static();

        System.out.println(Static.b++);
        System.out.println(st.b);
        System.out.println(a);
        System.out.print(st.a);
    }
}

정답

10
11
10
20

해설

실행 과정:

  1. main() 함수:

    • int a = 10 (지역 변수)
  2. Static.b = a:

    • Static.b = 10 (static 변수는 클래스 변수)
    • 모든 인스턴스가 공유
  3. Static st = new Static():

    • st.a = 20 (인스턴스 변수)
    • Static.b = 10 (static 변수, 변경 없음)
  4. System.out.println(Static.b++):

    • Static.b 출력: 10
    • 후위 증가 연산: Static.b = 11
  5. System.out.println(st.b):

    • st.bStatic.b와 동일 (static 변수)
    • 출력: 11
  6. System.out.println(a):

    • 지역 변수 a 출력: 10
  7. System.out.print(st.a):

    • 인스턴스 변수 st.a 출력: 20

변수 종류 비교:

변수 타입 선언 공유 범위 접근 방법
static 변수 static int b 모든 인스턴스 공유 클래스명.변수 또는 인스턴스.변수
인스턴스 변수 int a 인스턴스별 독립 인스턴스.변수
지역 변수 메서드 내 int a 메서드 내부만 변수명 직접 사용

메모리 상태:

Static 클래스:
  static int b = 11 (모든 인스턴스 공유)

st 인스턴스:
  int a = 20 (인스턴스 변수)

main() 지역:
  int a = 10 (지역 변수)

핵심 개념:

  • static 변수: 클래스 변수, 모든 인스턴스가 공유
  • 인스턴스 변수: 객체별로 독립적
  • 후위 증가 연산: 값을 먼저 사용한 후 증가

문제 2. C언어 포인터와 배열

문제 코드

#include <stdio.h>

int main(){
    char a[] = "Art";
    char* p = NULL;
    p = a;

    printf("%s\n", a);
    printf("%c\n", *p);
    printf("%c\n", *a);
    printf("%s\n", p);

    for(int i = 0; a[i] != '\0'; i++)
        printf("%c", a[i]);
}

정답

Art
A
A
Art
Art

해설

실행 과정:

  1. 배열 초기화:

    • char a[] = "Art"a[0]='A', a[1]='r', a[2]='t', a[3]='\0'
  2. 포인터 할당:

    • p = apa[0]의 주소를 가리킴
  3. 출력:

    • printf("%s\n", a) → 문자열 출력: "Art"
    • printf("%c\n", *p)*pa[0] = 'A'
    • printf("%c\n", *a)*aa[0] = **'A'`
    • printf("%s\n", p)p가 가리키는 문자열 출력: "Art"
    • for 루프: a[0]='A', a[1]='r', a[2]='t'"Art"

포인터와 배열 관계:

배열 a:  [A][r][t][\0]
         ↑
         │
포인터 p ─┘

포인터 연산:

표현식 의미
a 배열의 시작 주소 &a[0]
*a 배열의 첫 번째 요소 a[0] = 'A'
p 포인터가 가리키는 주소 &a[0]
*p 포인터가 가리키는 값 a[0] = 'A'
a[i] 배열의 i번째 요소 *(a + i)

핵심 개념:

  • 배열 이름: 배열의 시작 주소를 나타냄
  • 포인터: 주소를 저장하는 변수
  • 역참조 연산자 *: 포인터가 가리키는 값에 접근

문제 3. C언어 문자열 비교

문제 코드

#include <stdio.h>

int main(){
    char* a = "qwer";
    char* b = "qwtety";

    for(int i = 0; a[i] != '\0' ; i++){
        for(int j = 0; b[j] != '\0'; j++){
            if(a[i] == b[j]) printf("%c", a[i]);
        }
    }
}

정답

qwe

해설

실행 과정:

문자열:

  • a = "qwer"a[0]='q', a[1]='w', a[2]='e', a[3]='r'
  • b = "qwtety"b[0]='q', b[1]='w', b[2]='t', b[3]='e', b[4]='t', b[5]='y'

이중 반복문:

i a[i] j b[j] 비교 출력
0 'q' 0 'q' 같음 q
0 'q' 1 'w' 다름 -
0 'q' 2 't' 다름 -
0 'q' 3 'e' 다름 -
0 'q' 4 't' 다름 -
0 'q' 5 'y' 다름 -
1 'w' 0 'q' 다름 -
1 'w' 1 'w' 같음 w
1 'w' 2 't' 다름 -
... ... ... ... ... ...
2 'e' 3 'e' 같음 e
... ... ... ... ... ...
3 'r' 모든 j - 없음 -

공통 문자:

  • a[0]='q'b[0]='q' → 'q' 출력
  • a[1]='w'b[1]='w' → 'w' 출력
  • a[2]='e'b[3]='e' → 'e' 출력
  • a[3]='r'b에 없음

출력 순서:

  • 'q' → 'w' → 'e' → "qwe"

알고리즘:

  • 두 문자열의 공통 문자를 찾는 알고리즘
  • a의 각 문자에 대해 b의 모든 문자와 비교
  • 같은 문자가 있으면 출력

문제 4. AJAX

문제

( )은/는 비동기적인 웹 애플리케이션의 제작을 위해 JavaScript와 XML을 이용한 비동기적 정보 교환 기법이다.

( )은/는 필요한 데이터만을 웹서버에 요청해서 받은 후 클라이언트에서 데이터에 대한 처리를 할 수 있다.
보통 SOAP이나 XML 기반의 웹 서비스 프로토콜이 사용되며, 웹 서버의 응답을 처리하기 위해 클라이언트 쪽에서는 자바스크립트를 쓴다.

( )은/는 Google Map과 Google pages에서 사용한 기술에 기반하여 제작되었다.

정답

AJAX (Asynchronous JavaScript and XML)

해설

AJAX 특징:

특징 설명
목적 비동기적 웹 애플리케이션 제작
기술 JavaScript + XML/JSON
방식 필요한 데이터만 요청/응답
프로토콜 SOAP, XML 기반 웹 서비스
기원 Google Map, Google Pages 기술

AJAX 동작 과정:

[클라이언트]                    [서버]
    │                             │
    ├─ XMLHttpRequest 생성         │
    │                             │
    ├─ 비동기 요청 전송 ───────────→│
    │                             │
    │←── XML/JSON 데이터 응답 ─────┤
    │                             │
    ├─ JavaScript로 DOM 조작      │
    │                             │
    └─ 페이지 일부만 갱신          │

전통적인 웹 vs AJAX:

구분 전통적인 웹 AJAX
요청 전체 페이지 필요한 데이터만
응답 HTML 전체 XML/JSON 데이터
갱신 페이지 전체 새로고침 일부만 갱신
사용자 경험 느림 빠름

AJAX 장점:

  • 페이지 전체 새로고침 없음
  • 빠른 응답 속도
  • 서버 부하 감소
  • 사용자 경험 향상

AJAX 사용 예시:

  • 실시간 검색 자동완성
  • 댓글 추가/삭제
  • 좋아요 버튼
  • 무한 스크롤

문제 5. 가상회선과 데이터그램

문제

구분 1:

  • 회선교환 방식과 데이터그램 방식의 장점을 결합한 통신 기술이다.
  • 처음 패킷으로 최적의 경로를 고정하고 경로가 고정되면 그 다음은 패킷으로 나누어 고속으로 전송할 수 있다.
  • 통신기술에는 ATM이 있으며, 정해진 시간 안이나 다량의 데이터를 연속으로 보낼 때 적합하다.

구분 2:

  • 패킷교환 방식으로 동작하면서 IP 주소를 사용하는 인터넷을 의미한다.
  • 각 전송패킷을 미리 정해진 경로 없이 독립적으로 처리하여 교환하는 방식이다
  • 특정 교환기의 고장 시 모든 패킷을 잃어버리는 가상회선과 달리, 그 경로를 피해서 전송할 수 있으므로 더욱 신뢰가 가능하다.
  • 짧은 메시지의 패킷들을 전송할 때 효과적이고 재정렬 기능이 필요하다.

정답

구분 1: 가상회선 (Virtual Circuit)
구분 2: 데이터그램 (Datagram)

해설

패킷 교환 방식 비교:

구분 가상회선 데이터그램
경로 사전에 경로 설정 경로 없이 독립 전송
패킷 순서 순서 보장 순서 보장 안됨 (재정렬 필요)
신뢰성 경로 고장 시 모든 패킷 손실 경로 우회 가능 (높은 신뢰성)
적합한 경우 연속 데이터, 실시간 통신 짧은 메시지
예시 ATM IP 인터넷

가상회선 동작:

[송신]                    [수신]
  │                         │
  ├─ 연결 설정 요청 ────────→│
  │                         │
  │←── 경로 설정 완료 ───────┤
  │                         │
  ├─ 패킷1 전송 ────────────→│
  ├─ 패킷2 전송 ────────────→│
  ├─ 패킷3 전송 ────────────→│
  │                         │
  └─ 연결 해제 ─────────────→│

데이터그램 동작:

[송신]                    [수신]
  │                         │
  ├─ 패킷1 (경로A) ─────────→│
  ├─ 패킷2 (경로B) ─────────→│
  ├─ 패킷3 (경로A) ─────────→│
  │                         │
  └─ 독립적 전송 (순서 보장 안됨)

통신 방식 비교:

방식 설명 특징
회선교환 물리적 경로 설정 전용 회선, 고정 대역폭
패킷교환 패킷 단위 전송 효율적, 공유 회선
가상회선 논리적 경로 설정 회선교환 + 패킷교환
데이터그램 경로 없이 독립 전송 유연성, 신뢰성

문제 6. L2TP

문제

2 계층(데이터링크 계층)에서 구현되는 터널링 기술 중 하나
L2F와 PPTP가 결합된 프로토콜로 VPN과 인터넷 서비스 제공자(ISP)가 이용
IPsec을 함께 사용하면 PPTP보다 훨씬 안전하지만 보안보다 익명화에 더 적합

정답

L2TP (Layer 2 Tunneling Protocol)

해설

L2TP 특징:

특징 설명
계층 데이터링크 계층 (2계층)
기원 L2F + PPTP 결합
사용처 VPN, ISP
보안 IPsec과 함께 사용 시 강화
목적 익명화에 더 적합

VPN 프로토콜 비교:

프로토콜 계층 암호화 특징
PPTP 2계층 약함 빠르지만 보안 취약
L2TP 2계층 IPsec 필요 PPTP보다 안전
IPsec 3계층 강함 네트워크 계층 암호화
SSL VPN 7계층 강함 응용 계층 암호화

L2TP 구조:

[클라이언트] → [L2TP 터널] → [L2TP 서버] → [사설 네트워크]
                (2계층)

L2TP + IPsec:

[클라이언트] → [IPsec 암호화] → [L2TP 터널] → [서버]
                (3계층)          (2계층)

L2TP 장점:

  • L2F와 PPTP의 장점 결합
  • IPsec과 함께 사용 시 보안 강화
  • 익명화에 적합

문제 7. SSH

문제

( ) 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 응용 프로그램 또는 그 프로토콜을 가리킨다.

( ) 보안 접속을 통한 rsh, rcp, rlogin, rexec, telnet, ftp 등을 제공하며, IP spoofing (IP스푸핑, 아이피 위/변조 기법중 하나)을 방지하기 위한 기능을 제공한다.

( ) 기본적으로 포트는 22번이다.

정답

SSH (Secure Shell)

해설

SSH 특징:

특징 설명
목적 원격 로그인, 명령 실행, 파일 복사
보안 암호화된 통신
대체 rsh, rcp, rlogin, telnet, ftp의 보안 버전
방어 IP spoofing 방지
포트 22번

SSH vs 기존 프로토콜:

프로토콜 보안 포트 용도
Telnet ❌ 평문 23 원격 로그인
FTP ❌ 평문 21 파일 전송
rsh ❌ 평문 - 원격 셸
SSH ✅ 암호화 22 모든 기능 통합

SSH 통신 과정:

[클라이언트]                    [서버]
    │                             │
    ├─ SSH 연결 요청 ────────────→│
    │                             │
    │←── 공개키 전송 ──────────────┤
    │                             │
    ├─ 암호화된 세션 키 전송 ──────→│
    │                             │
    │←── 암호화된 통신 시작 ───────┤
    │                             │
    └─ 암호화된 데이터 교환 ────────┘

SSH 주요 기능:

  • 원격 로그인 (rlogin 대체)
  • 원격 명령 실행 (rsh 대체)
  • 파일 전송 (SCP, SFTP - FTP 대체)
  • 포트 포워딩
  • X11 포워딩

문제 8. 악성코드 종류

문제

구분 1:

  • 감염된 컴퓨터 시스템에서 스스로 복제해 다른 컴퓨터로 복사본을 확산시킬 수 있는 악성 프로그램이다.
  • 독자적으로 실행되며 다른 실행 프로그램이 필요하지 않으며, 파일 전송 기능을 착취하도록 설계된다.
  • 자가 복제 및 네트워크를 통한 전파도 가능하다.

구분 2:

  • 정상적인 프로그램으로 가장해 사용자가 직접 컴퓨터에 설치하도록 위장하며, 백도어를 만들어 공격자가 침입할 수 있도록 만들거나 시스템을 파괴한다.
  • 정상적인 프로그램으로 위장하여 시작부터 끝까지 램에 상주하며, 시스템 내부 정보를 공격자의 컴퓨터로 빼돌리는 프로그램이다.
  • 좀비PC처럼 내부정보 유출뿐만 아니라 컨트롤까지 가능한 종류가 있고, 단순히 내부 데이터만 유출할 수 있는 타입의 트로이 목마가 있다.
  • 감염된 후에 스스로를 복제하는 능력은 없다.

구분 3:

  • 대상(정상파일)을 감염시키는 형태로 실행되며, 감염시킬 대상이 존재하지 않을 때에는 실행되지 않으며 다른정상파일로의 자기 복제 기능이 있다.
  • 컴퓨터 시스템에 침입해 프로그램에 기생하며 시스템을 변경하거나 사용할 수 없도록 만드는 악성코드이다.
  • 네트워크를 통해 전파되지 않으며 방식 및 위치에 따라 여러형태로 나뉜다.

정답

1. 웜 (Worm)
2. 트로이 목마 (Trojan Horse)
3. 바이러스 (Virus)

해설

악성코드 비교:

구분 트로이 목마 바이러스
실행 독자적 실행 정상 프로그램 위장 다른 프로그램에 기생
복제 자가 복제 가능 복제 불가 자가 복제 가능
전파 네트워크 전파 사용자 설치 파일 감염
대상 필요 없음 사용자 속임 정상 파일 필요

악성코드 특징 표:

악성코드 특징 전파 방법 예시
독자 실행, 자가 복제 네트워크 Code Red, Slammer
트로이 목마 정상 프로그램 위장 사용자 설치 Backdoor, Keylogger
바이러스 파일 감염, 기생 파일 복사 CIH, Melissa

악성코드 전파 과정:

웜:

[감염된 PC] → [네트워크 스캔] → [다른 PC 감염] → [반복]

트로이 목마:

[위장된 프로그램] → [사용자 다운로드] → [설치] → [백도어 생성]

바이러스:

[감염된 파일] → [실행] → [다른 파일 감염] → [확산]

문제 9. 이진수 변환 코드

문제 코드

#include <stdio.h>

int main() {
    int input = 101110;
    int di = 1;
    int sum = 0;

    while (1) {
        if (input == 0) break
        else {
          sum = sum + (input (a)(b)) * di;
             di = di * 2;
             input = input / 10;
        }
    }

    printf("%d", sum);

    return 0;
}

정답

(a) % (나머지 연산자)
(b) 10

또는

(a) & (비트 AND)
(b) 1

해설

이진수 변환 과정:

입력: 101110 (이진수로 가정)

변환 과정:

반복 input input % 10 di sum 누적
1 101110 0 1 0 × 1 = 0
2 10111 1 2 0 + 1×2 = 2
3 1011 1 4 2 + 1×4 = 6
4 101 1 8 6 + 1×8 = 14
5 10 0 16 14 + 0×16 = 14
6 1 1 32 14 + 1×32 = 46

계산:

  • 101110₂ = 46₁₀

코드 동작:

  1. input % 10: 일의 자리 숫자 추출
  2. di: 현재 자리수 값 (1, 2, 4, 8, ...)
  3. input / 10: 일의 자리 제거

대안 방법 (비트 연산):

  • input & 1: 최하위 비트 추출
  • input >> 1: 오른쪽 시프트 (2로 나누기)

이진수 변환 알고리즘:

101110 (이진수)
  ↓
각 자리수 × 2의 거듭제곱
  ↓
0×2⁰ + 1×2¹ + 1×2² + 1×2³ + 0×2⁴ + 1×2⁵
  ↓
0 + 2 + 4 + 8 + 0 + 32 = 46

문제 10. ICMP

문제

( )은/는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜이다.

( ) 프로토콜은 보통 다른 호스트나 게이트웨이와 연결된 네트웍에 문제가 있는지 확인하기 위한 목적으로 주로 사용된다.

( )을/를 이용한 공격에는 ( ) Flooding가 있는데 ping 명령어를 통한 ( ) 패킷을 연속적으로 계속 보내어 서버의 요청에 응답으로 인한 다른작업을 하지 못하도록 하는 공격이다.

정답

ICMP (Internet Control Message Protocol)

해설

ICMP 특징:

특징 설명
목적 IP 패킷 처리 문제 알림
용도 네트워크 문제 확인
공격 ICMP Flooding (Ping Flooding)
계층 네트워크 계층 (3계층)

ICMP 메시지 종류:

메시지 설명
Echo Request ping 요청
Echo Reply ping 응답
Destination Unreachable 목적지 도달 불가
Time Exceeded 시간 초과
Redirect 경로 재지정

ICMP Flooding 공격:

[공격자]                        [서버]
    │                             │
    ├─ ICMP Echo Request ─────────→│
    ├─ ICMP Echo Request ─────────→│
    ├─ ICMP Echo Request ─────────→│
    │                             │
    │←── ICMP Echo Reply ──────────┤ (응답 처리로 인한 부하)
    │                             │
    └─ ... (반복) ────────────────→│ (서버 마비)

ICMP 사용 예시:

  • ping: 호스트 연결 확인
  • traceroute: 경로 추적
  • 네트워크 진단

방어 방법:

  • 방화벽에서 ICMP 패킷 제한
  • ICMP 응답 속도 제한
  • DDoS 방어 시스템

문제 11. Proxy 패턴

문제

  • 다른 무언가와 이어지는 인터페이스 역할을 하는 클래스를 의미한다.
  • 실제 객체를 호출하면 행위를 중간에 가로채서 다른 동작을 수행하는 객체로 변경한다.
  • 객체를 정교하게 제어해야 하거나 객체 참조가 필요한 경우 사용한다.
  • 분리된 객체를 위임함으로써 대리 작업을 중간 단계에 삽입할 수도 있으며 분리된 객체를 동적으로 연결함으로써 객체의 실행 시점을 관리할 수도 있다.

정답

Proxy (프록시 패턴)

해설

Proxy 패턴 특징:

특징 설명
역할 인터페이스 역할
동작 행위 가로채기
목적 객체 제어, 참조 관리
기능 대리 작업, 실행 시점 관리

Proxy 패턴 구조:

[클라이언트] → [Proxy] → [RealSubject]
                  │
                  ├─ 접근 제어
                  ├─ 지연 로딩
                  └─ 추가 기능

Proxy 패턴 종류:

종류 설명
Virtual Proxy 실제 객체 생성을 지연
Remote Proxy 원격 객체에 대한 로컬 대리
Protection Proxy 접근 권한 제어
Cache Proxy 결과 캐싱

Proxy 패턴 예시:

// 실제 객체
class RealImage {
    void display() { ... }
}

// 프록시 객체
class ProxyImage {
    private RealImage realImage;

    void display() {
        if (realImage == null) {
            realImage = new RealImage(); // 지연 로딩
        }
        realImage.display();
    }
}

Proxy 패턴 장점:

  • 실제 객체 생성 지연 (메모리 절약)
  • 접근 제어 및 보안 강화
  • 추가 기능 부여 (로깅, 캐싱 등)
  • 정보 은닉

문제 12. 데이터베이스 용어

문제

구분 1:

  • 셀 수 있는 수량의 순서 있는 열거이다.
  • 어떤 요소의 집합, 혹은 테이블에서의 행을 가리키지만 일반적인 집합과는 달리 중복이 허용될 수 있다.
  • 리스트와 동일하게 여러 객체를 모아서 담으며, 숫자, 문자, 객체, 배열, 튜플 안의 튜플 전부 가능하다.

구분 2:

  • 어느 한 시점에 릴레이션의 내용(상태), 즉 저장된 데이터 전체를 의미한다.
  • 단순히 릴레이션 또는 릴레이션 외연(Relation Extension)라고도 한다.

구분 3:

  • 특정 데이터 집합의 유니크(Unique)한 값의 개수이다.
  • 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.

정답

1. 튜플 (Tuple)
2. 릴레이션 인스턴스 (Relation Instance)
3. 카디널리티 (Cardinality)

해설

데이터베이스 용어 비교:

용어 설명 특징
튜플 릴레이션의 행, 순서 있는 열거 중복 허용 가능
릴레이션 인스턴스 특정 시점의 릴레이션 내용 저장된 데이터 전체
카디널리티 유니크한 값의 개수 중복 제거 후 개수

릴레이션 구조:

학생 릴레이션 (스키마)
┌────────┬────────┬──────────┐
│ 학번   │ 이름   │ 전공     │  ← 속성 (Attribute)
├────────┼────────┼──────────┤
│ 1001   │ 김철수 │ 컴공     │  ← 튜플 (Tuple)
│ 1002   │ 이영희 │ 전자     │  ← 튜플
│ 1003   │ 박민수 │ 기계     │  ← 튜플
└────────┴────────┴──────────┘
     ↑
  릴레이션 인스턴스
  (현재 저장된 데이터)

카디널리티 예시:

컬럼 카디널리티
학번 1001, 1002, 1003 3 (모두 유니크)
전공 컴공, 전자, 기계, 컴공 3 (중복 제거)
이름 김철수, 이영희, 박민수 3

튜플 특징:

  • 순서 있는 열거
  • 중복 허용 가능
  • 다양한 데이터 타입 포함 가능

문제 13. SQL DELETE

문제

[학생] 테이블에서 학생 이름이 '민수'인 튜플을 삭제하는 쿼리를 작성하시오.

조건:

  • 컬럼의 값이 문자열일 경우 작은 따움표 (' ')를 표시하시오.
  • SQL 마지막에 세미콜론(;)은 표기하지 않아도 관계 없습니다.

정답

DELETE FROM 학생 WHERE 이름 = '민수'

해설

DELETE 문법:

DELETE FROM 테이블명
WHERE 조건;

실행 과정:

  1. 테이블 선택: FROM 학생
  2. 조건 확인: WHERE 이름 = '민수'
  3. 삭제: 조건에 맞는 행 삭제

예시:

삭제 전:
| 학번 | 이름 | 전공 |
|------|------|------|
| 1001 | 김철수 | 컴공 |
| 1002 | 민수 | 전자 |
| 1003 | 박민수 | 기계 |

삭제 후:
| 학번 | 이름 | 전공 |
|------|------|------|
| 1001 | 김철수 | 컴공 |
| 1003 | 박민수 | 기계 |

주의사항:

  • WHERE 절 없이 실행 시 모든 행 삭제
  • 문자열은 작은따옴표로 감싸기
  • 트랜잭션 사용 권장 (롤백 가능)

문제 14. Java 버블 정렬

문제 코드

public class Sort {
    public static void swap(int[] arr, int idx1, int idx2){
        int temp = arr[idx1];
        arr[idx1] = arr[idx2];
        arr[( 1 )] = temp;
    }

    public static void Usort(int[] array, int length){
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    swap(array, j, j + 1);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] item = new int[] { 5, 3, 8, 1, 2, 7 };
        int nx = 6;   
        Usort(item, ( 2 ));

        for (int data : item) {
            System.out.print(data + " ");
        }
    }
}

출력 값: 1 2 3 5 7 8

정답

(1) idx2
(2) nx

해설

swap() 함수:

  • 두 배열 요소의 값을 교환
  • arr[idx1]arr[idx2]를 교환
  • arr[(1)] = temparr[idx2] = temp

버블 정렬 과정:

초기 배열: [5, 3, 8, 1, 2, 7]

1회전 (i=0):

  • j=0: 5 > 3 → 교환 → [3, 5, 8, 1, 2, 7]
  • j=1: 5 > 8 → 안함
  • j=2: 8 > 1 → 교환 → [3, 5, 1, 8, 2, 7]
  • j=3: 8 > 2 → 교환 → [3, 5, 1, 2, 8, 7]
  • j=4: 8 > 7 → 교환 → [3, 5, 1, 2, 7, 8]

2회전 (i=1):

  • j=0: 3 > 5 → 안함
  • j=1: 5 > 1 → 교환 → [3, 1, 5, 2, 7, 8]
  • j=2: 5 > 2 → 교환 → [3, 1, 2, 5, 7, 8]
  • j=3: 5 > 7 → 안함

최종: [1, 2, 3, 5, 7, 8]

버블 정렬 알고리즘:

for i = 0 to length-1:
    for j = 0 to length-i-2:
        if array[j] > array[j+1]:
            swap(array[j], array[j+1])

시간 복잡도:

  • 최선: O(n)
  • 평균: O(n²)
  • 최악: O(n²)

문제 15. Python 집합(Set)

문제 코드

a = {'한국', '중국', '일본'}
a.add('베트남')
a.add('중국')
a.remove('일본')
a.update({'홍콩', '한국', '태국'})
print(a)

정답

{'한국', '중국', '베트남', '홍콩', '태국'}

해설

실행 과정:

  1. 초기화:

    • a = {'한국', '중국', '일본'}
  2. a.add('베트남'):

    • a = {'한국', '중국', '일본', '베트남'}
  3. a.add('중국'):

    • 집합은 중복 허용 안함
    • a = {'한국', '중국', '일본', '베트남'} (변화 없음)
  4. a.remove('일본'):

    • a = {'한국', '중국', '베트남'}
  5. a.update({'홍콩', '한국', '태국'}):

    • 여러 요소 추가
    • '한국'은 이미 존재 (중복 무시)
    • a = {'한국', '중국', '베트남', '홍콩', '태국'}

집합 연산:

연산 설명 예시
add() 요소 하나 추가 a.add('x')
remove() 요소 제거 a.remove('x')
update() 여러 요소 추가 a.update({x, y})
union() 합집합 `a
intersection() 교집합 a & b

집합 특징:

  • 중복 허용 안함
  • 순서 없음 (인덱싱 불가)
  • 가변 객체

문제 16. SQL GROUP BY와 HAVING

문제

성적 테이블에서 과목별 점수의 평균이 90점 이상인 '과목이름', '최소점수', '최대점수'를 검색하고자 한다.

조건:

  • where 사용하지 말아야 한다.
  • SELECT절에 별칭을 사용하여 작성해야 한다.
  • SQL 구문 마지막에 세미콜론 생략 가능하다.
  • 반드시 GROUP BY와 having을 사용해야 한다.
  • 집계함수를 사용해야 한다.

정답

SELECT
    과목이름,
    MIN(점수) AS 최소점수,
    MAX(점수) AS 최대점수
FROM 성적
GROUP BY 과목이름
HAVING AVG(점수) >= 90

해설

SQL 실행 순서:

  1. FROM: 테이블 선택
  2. WHERE: 행 필터링 (사용 안함)
  3. GROUP BY: 그룹화
  4. HAVING: 그룹 필터링
  5. SELECT: 컬럼 선택

예시 데이터:

성적 테이블:
| 학생명 | 과목이름 | 점수 |
|--------|---------|------|
| 김철수 | 수학 | 95 |
| 이영희 | 수학 | 85 |
| 박민수 | 수학 | 90 |
| 최지영 | 영어 | 92 |
| 정수진 | 영어 | 88 |

GROUP BY 실행:

과목이름 점수들 평균
수학 95, 85, 90 90
영어 92, 88 90

HAVING 필터링:

과목이름 평균 최소점수 최대점수
수학 90 85 95
영어 90 88 92

WHERE vs HAVING:

구분 WHERE HAVING
사용 시점 GROUP BY 전 GROUP BY 후
대상 개별 행 그룹
집계함수 사용 불가 사용 가능

집계함수:

  • MIN(): 최소값
  • MAX(): 최대값
  • AVG(): 평균
  • SUM(): 합계
  • COUNT(): 개수

문제 17. Java 추상 클래스와 상속

문제 코드

abstract class Vehicle {
    String name;
    abstract public String getName(String val);

    public String getName() {
        return "Vehicle name: " + name;
    }
}

class Car extends Vehicle {
    public Car(String val) {
        name=super.name=val;
    }

    public String getName(String val) {
        return "Car name:" + val;
    }

    public String getName(byte val[]) {
        return "Car name:" + val;
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle obj = new Car("Spark");
        System.out.println(obj.getName());
    }
}

정답

Vehicle name: Spark

해설

실행 과정:

  1. 객체 생성:

    • Vehicle obj = new Car("Spark")
    • obj는 Vehicle 타입이지만 Car 인스턴스
  2. 생성자 실행:

    • Car(String val) 호출
    • name = super.name = val
    • name = "Spark", super.name = "Spark"
  3. obj.getName() 호출:

    • obj는 Vehicle 타입
    • getName()은 오버로딩된 메서드 (매개변수 없음)
    • 메서드 오버라이딩은 적용 안됨 (매개변수 다름)
    • Vehicle 클래스의 getName() 실행
    • "Vehicle name: " + name = "Vehicle name: Spark"

메서드 오버로딩 vs 오버라이딩:

구분 오버로딩 오버라이딩
정의 같은 이름, 다른 매개변수 부모 메서드 재정의
다형성 적용 안됨 적용됨
예시 getName(), getName(String) getName() 재정의

메서드 매칭:

호출 매개변수 매칭되는 메서드
obj.getName() 없음 Vehicle.getName()
obj.getName("x") String Car.getName(String) (오버라이딩)

핵심 개념:

  • 추상 메서드: abstract 키워드로 선언, 구현 없음
  • 메서드 오버로딩: 같은 이름, 다른 매개변수
  • 메서드 오버라이딩: 부모 메서드 재정의 (매개변수 동일)

문제 18. 데이터베이스 스키마

문제

구분 1:

  • 사용자나 응용 프로그래머가 개인의 입장에서 필요한 데이터베이스의 논리적 구조를 정의한다.
  • 전체 데이터베이스의 한 논리적인 부분으로 볼 수 있기 때문에 서브 스키마라고도 한다.
  • 하나의 데이터베이스 시스템에는 여러 개의 외부 스키마가 존재할 수 있다.
  • 하나의 외부 스키마를 여러개의 응용 프로그램 혹은 사용자가 공유할 수 있다.

구분 2:

  • 데이터베이스의 전체적인 논리적 구조로, 모든 응용 프로그램이나 사용자들이 필요로 하는 데이터를 종합한 조직 전체의 데이터베이스로 하나만 존재한다.
  • 개체 간의 관계(Relationship)와 제약 조건을 나타내고 데이터베이스의 접근 권한, 보안 및 무결성 규칙에 관한 명세를 정의한다.
  • 데이터베이스 파일에 저장되는 데이터의 형태를 나타내는 것이다.
  • 기관이나 조직체의 관점에서 데이터베이스를 정의한 것이다

구분 3:

  • 물리적인 저장장치 입장에서 데이터가 저장되는 방법을 기술한 것이다.
  • 실제 데이터베이스에 저장될 레코드의 물리적인 구조를 정의한다.
  • 저장 데이터 항목의 표현방법, 내부 레코드의 물리적 순서, 인덱스 유/무 등을 나타낸다.
  • 시스템 프로그래머나 시스템 설계자가 관리한다.

정답

1. 외부 스키마 (External Schema)
2. 개념 스키마 (Conceptual Schema)
3. 내부 스키마 (Internal Schema)

해설

3단계 스키마 구조:

[외부 스키마 1]  [외부 스키마 2]  [외부 스키마 3]
      ↓              ↓              ↓
         [개념 스키마 (Conceptual Schema)]
                    ↓
         [내부 스키마 (Internal Schema)]
                    ↓
              [물리적 저장장치]

스키마 비교:

구분 외부 스키마 개념 스키마 내부 스키마
관점 사용자/응용 조직 전체 물리적 저장
개수 여러 개 1개 1개
관리자 사용자/프로그래머 DBA 시스템 설계자
내용 필요한 부분만 전체 구조 저장 방법

스키마 특징:

외부 스키마:

  • 서브 스키마라고도 함
  • 사용자별로 다른 뷰 제공
  • 여러 개 존재 가능

개념 스키마:

  • 전체 데이터베이스 구조
  • 개체, 관계, 제약조건 정의
  • 하나만 존재

내부 스키마:

  • 물리적 저장 구조
  • 인덱스, 저장 순서 등
  • 시스템 레벨

문제 19. 제어 흐름 그래프 - 분기 커버리지

문제

아래 제어 흐름 그래프가 분기 커버리지를 만족하기 위한 테스팅 순서를 쓰시오.

제어 흐름 그래프:

    1
    ↓
    2
   ↙ ↘
  3   4
  ↓   ↓
  5   6
   ↘ ↙
    7

정답

1234561, 124567 또는 1234567, 124561

해설

분기 커버리지 (Branch Coverage):

  • 모든 분기(조건문)의 각 분기를 최소한 한 번씩 실행
  • 각 엣지(화살표)를 최소한 한 번씩 통과

제어 흐름 그래프 분석:

노드: 1, 2, 3, 4, 5, 6, 7
엣지: 1→2, 2→3, 2→4, 3→5, 4→6, 5→7, 6→7

분기 커버리지 조건:

  • 모든 엣지를 최소 한 번씩 통과해야 함

테스트 경로:

방법 1:

  • 경로 1: 1→2→3→5→7 (엣지: 1→2, 2→3, 3→5, 5→7)
  • 경로 2: 1→2→4→6→7 (엣지: 1→2, 2→4, 4→6, 6→7)
  • 모든 엣지 커버: ✅

방법 2:

  • 경로 1: 1→2→3→5→6→7 (엣지: 1→2, 2→3, 3→5, 5→6, 6→7)
  • 경로 2: 1→2→4→5→6→1 (엣지: 1→2, 2→4, 4→5, 5→6, 6→1)
  • 모든 엣지 커버: ✅

엣지 커버리지 표:

엣지 경로1 경로2
1→2
2→3 -
2→4 -
3→5 -
4→6 -
5→7 -
6→7 -

정답:

  • 1234567, 124567 (모든 엣지 커버)
  • 또는 1234561, 124561 (순환 포함)

문제 20. Java 생성자 체이닝

문제 코드

class Parent {
    int x = 100;

    Parent() {
        this(500);
    }

    Parent(int x) {
        this.x = x;
    }

    int getX() {
        return x;
    }
}

class Child extends Parent {
    int x = 4000;

    Child() {
        this(5000);
    }

    Child(int x) {
        this.x = x;
    }
}

public class Main {
    public static void main(String[] args) {
        Child obj = new Child();
        System.out.println(obj.getX());
    }
}

정답

500

해설

실행 과정:

  1. new Child() 호출:

    • Child() 생성자 실행
  2. Child() 생성자:

    • this(5000) 호출
    • Child(int x) 생성자 실행
  3. Child(int x) 생성자:

    • this.x = 5000 (Child의 x)
    • 부모 생성자 자동 호출: super() (매개변수 없음)
  4. Parent() 생성자:

    • this(500) 호출
    • Parent(int x) 생성자 실행
  5. Parent(int x) 생성자:

    • this.x = 500 (Parent의 x)
  6. obj.getX() 호출:

    • getX()는 Parent 클래스의 메서드
    • return x → Parent의 x 반환
    • x = 500

생성자 호출 순서:

Child() 
  → Child(5000)
    → Parent() (super() 자동 호출)
      → Parent(500)

변수 상태:

객체 Parent의 x Child의 x
초기값 100 4000
생성자 실행 후 500 5000

메서드 호출:

  • getX()는 Parent 클래스의 메서드
  • Parent의 x를 반환: 500

핵심 개념:

  • 생성자 체이닝: this()로 같은 클래스의 다른 생성자 호출
  • super(): 부모 생성자 호출 (자동 호출됨)
  • 변수 숨김: Child의 x가 Parent의 x를 숨김
  • 메서드 상속: getX()는 Parent의 메서드

정리

출제 영역별 분류

영역 문제 수 문제 번호
프로그래밍 언어 8 1, 2, 3, 9, 14, 15, 17, 20
데이터베이스 4 12, 13, 16, 18
네트워크 4 5, 6, 7, 10
소프트웨어 공학 2 4, 11
보안 1 8
테스트 1 19

핵심 개념 정리

  1. static 변수: 클래스 변수, 모든 인스턴스 공유
  2. 포인터와 배열: 배열 이름은 주소, 포인터는 주소 저장
  3. 문자열 비교: 이중 반복문으로 공통 문자 찾기
  4. AJAX: 비동기 웹 통신 기술
  5. 가상회선/데이터그램: 패킷 교환 방식
  6. L2TP: 2계층 터널링 프로토콜
  7. SSH: 보안 원격 접속 (포트 22)
  8. 악성코드: 웜, 트로이 목마, 바이러스
  9. 이진수 변환: 나머지 연산으로 자리수 추출
  10. ICMP: 네트워크 제어 메시지 프로토콜
  11. Proxy 패턴: 객체 접근 제어
  12. 튜플/인스턴스/카디널리티: 데이터베이스 용어
  13. SQL DELETE: 행 삭제
  14. 버블 정렬: 인접 요소 비교 및 교환
  15. Python 집합: 중복 없는 요소 집합
  16. GROUP BY/HAVING: 그룹화 및 그룹 필터링
  17. 추상 클래스: abstract 키워드
  18. 3단계 스키마: 외부/개념/내부 스키마
  19. 분기 커버리지: 모든 분기 테스트
  20. 생성자 체이닝: this(), super() 호출

작성일: 2023년
시험: 정보처리기사 실기 2023년 1회
유형: 복원 문제