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

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

by 허쌤 2026. 2. 24.

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

문제 1. C언어 배열 순환 출력

문제 코드

int main(void) {
    int n[5];
    int i;

    for (i = 0; i < 5; i++) {
        printf("숫자를 입력해주세요 : ");
        scanf("%d", &n[i]);
    }

    for (i = 0; i < 5; i++) {
        printf("%d", (            ) );
    }

  return 0;
}

조건: 입력값이 54321일 경우 출력값이 43215로 출력되어야 한다.

정답

n[(i+1) % 5]

해설

입력과 출력 분석:

입력: 54321 → 배열에 저장

  • n[0] = 5
  • n[1] = 4
  • n[2] = 3
  • n[3] = 2
  • n[4] = 1

출력: 43215 (한 칸씩 왼쪽으로 순환)

출력 과정:

i (i+1) % 5 출력값
0 1 n[1] = 4
1 2 n[2] = 3
2 3 n[3] = 2
3 4 n[4] = 1
4 0 n[0] = 5

배열 순환 시각화:

초기:  [5][4][3][2][1]
       ↑  ↑  ↑  ↑  ↑
       0  1  2  3  4

출력:  4  3  2  1  5
       ↑  ↑  ↑  ↑  ↑
       i=1 i=2 i=3 i=4 i=0

모듈로 연산:

  • (i+1) % 5로 인덱스를 한 칸씩 이동
  • 마지막 인덱스(4) 다음은 0으로 순환

핵심 개념:

  • 모듈로 연산: 순환 인덱스 생성
  • 배열 순환: 마지막 요소 다음은 첫 요소로

문제 2. Java 거스름돈 계산

문제 코드

public class Problem{
    public static void main(String[] args){
        m = 4620;

        a = (              ); // 1000원짜리 4장
        b = (              ); // 500원짜리 1개
        c = (              ); // 100원짜리 1개
        d = (              ); // 10원짜리 2개

        System.out.println(a); // 4 출력
        System.out.println(b); // 1 출력
        System.out.println(c); // 1 출력
        System.out.println(d); // 2 출력
    }
}

조건: 변수 m, 연산자 /, %, 괄호, 정수 1000, 500, 100, 10만 사용

정답

  • a = m / 1000
  • b = (m % 1000) / 500
  • c = (m % 500) / 100
  • d = (m % 100) / 10

해설

거스름돈 계산 과정:

총 금액: m = 4620원

  1. 1000원 개수:

    • m / 1000 = 4620 / 1000 = 4 (정수 나눗셈)
    • a = 4
  2. 500원 개수:

    • m % 1000 = 4620 % 1000 = 620 (1000원 제외한 나머지)
    • (m % 1000) / 500 = 620 / 500 = 1
    • b = 1
  3. 100원 개수:

    • m % 500 = 4620 % 500 = 120 (500원 제외한 나머지)
    • (m % 500) / 100 = 120 / 100 = 1
    • c = 1
  4. 10원 개수:

    • m % 100 = 4620 % 100 = 20 (100원 제외한 나머지)
    • (m % 100) / 10 = 20 / 10 = 2
    • d = 2

계산 과정 표:

단계 계산 결과 설명
1 4620 / 1000 4 1000원 개수
2 4620 % 1000 620 1000원 제외한 나머지
3 620 / 500 1 500원 개수
4 620 % 500 120 500원 제외한 나머지
5 120 / 100 1 100원 개수
6 120 % 100 20 100원 제외한 나머지
7 20 / 10 2 10원 개수

검증:

  • 4 × 1000 + 1 × 500 + 1 × 100 + 2 × 10
  • = 4000 + 500 + 100 + 20
  • = 4620

문제 3. C언어 포인터와 전역 변수

문제 코드

#include<stdio.h> 
#include<stdlib.h> 
char n[30];
char *test() {
    printf("입력하세요 : ");
    gets(n);
    return n;
}

int main()
{
    char * test1;
    char * test2;
    char * test3;

    test1 = test();
    test2 = test();
    test3 = test();

    printf("%s\n",test1);
    printf("%s\n",test2);
    printf("%s\n",test3);
}

조건: 입력값은 홍길동, 김철수, 박영희 순서로 주어진다.

정답

박영희
박영희
박영희

해설

문제 원인:

  1. 전역 변수 사용:

    • char n[30]은 전역 변수
    • 모든 함수 호출이 같은 메모리 공간 사용
  2. 포인터 반환:

    • test() 함수는 항상 같은 주소(n)를 반환
    • test1, test2, test3 모두 같은 주소를 가리킴

실행 과정:

호출 입력 n 배열 내용 반환 주소
test1 = test() "홍길동" "홍길동" &n
test2 = test() "김철수" "김철수" &n (덮어씀)
test3 = test() "박영희" "박영희" &n (덮어씀)

메모리 상태:

전역 변수 n[30]:
초기:  [빈 배열]
test1: ["홍길동"]
test2: ["김철수"]  (덮어씀)
test3: ["박영희"]  (덮어씀)

포인터:
test1 → &n
test2 → &n  (같은 주소)
test3 → &n  (같은 주소)

출력:

  • test1, test2, test3 모두 &n을 가리킴
  • n의 최종 값은 "박영희"
  • 따라서 모두 "박영희" 출력

해결 방법:

  • 지역 변수 사용
  • 동적 메모리 할당 (malloc)
  • 배열 복사

문제 4. SQL INSERT

문제

테이블 구조:

CREATE TABLE 학생 (
  학번 int,
  이름 varchar(20),
  학년 int,
  전공 varchar(30),
  전화번호 varchar(20)
);

삽입할 데이터:
| 학번 | 이름 | 학년 | 전공 | 전화번호 |
|------|------|------|------|---------|
| 9830287 | 뉴진스 | 3 | 경영학개론 | 010-1234-1234 |

조건: 문자열일 경우 작은따옴표 사용

정답

INSERT INTO 학생(학번, 이름, 학년, 전공, 전화번호)
VALUES(9830287, '뉴진스', 3, '경영학개론', '010-1234-1234');

해설

INSERT 문법:

INSERT INTO 테이블명(컬럼1, 컬럼2, ...)
VALUES(값1, 값2, ...);

데이터 타입별 처리:

데이터 타입 값 표기 예시
정수 따옴표 없음 9830287, 3
문자열 작은따옴표 '뉴진스', '경영학개론'

INSERT 실행 결과:

삽입 전:
| 학번 | 이름 | 학년 | 전공 | 전화번호 |
|------|------|------|------|---------|
| (비어있음) | | | | |

삽입 후:
| 학번 | 이름 | 학년 | 전공 | 전화번호 |
|------|------|------|------|---------|
| 9830287 | 뉴진스 | 3 | 경영학개론 | 010-1234-1234 |

주의사항:

  • 컬럼 순서와 값 순서 일치
  • 문자열은 작은따옴표 필수
  • 숫자는 따옴표 없음

문제 5. C언어 switch문 (break 없음)

문제 코드

#include <stdio.h>

void main(){
    int n[3] = {73, 95, 82};
    int sum = 0;

    for(int i=0;i<3;i++){
        sum += n[i];
    }

    switch(sum/30){
        case 10:
        case 9: printf("A");
        case 8: printf("B");
        case 7:
        case 6: printf("C");
        default: printf("D");
    }
}

정답

BCD

해설

실행 과정:

  1. 합계 계산:

    • sum = 73 + 95 + 82 = 250
  2. switch 조건:

    • sum / 30 = 250 / 30 = 8 (정수 나눗셈)
  3. switch 실행:

    • case 8:로 이동
    • break가 없으므로 아래 모든 case 실행
    • case 8:printf("B")B 출력
    • case 7: → 건너뜀
    • case 6:printf("C")C 출력
    • default:printf("D")D 출력

switch문 실행 흐름:

switch(8):
  case 10: (건너뜀)
  case 9:  (건너뜀)
  case 8:  → "B" 출력
  case 7:  (건너뜀)
  case 6:  → "C" 출력
  default: → "D" 출력

switch문 특징:

  • break가 없으면 다음 case로 계속 실행 (fall-through)
  • default는 항상 실행됨

출력 순서:

  1. B (case 8)
  2. C (case 6)
  3. D (default)

최종 출력: BCD


문제 6. 테스트 커버리지

문제

프로그램 내에 있는 결정포인트 내의 모든 각 개별 조건식에 대한 모든 가능한 결과(참/거짓)에 대해 적어도 한번 수행한다.
소프트웨어 테스트 수행시 소스코드를 어느 수준까지 수행하였는가를 나타내는 기준을 나타낸다.
실제 업무에서는 다양한 툴을 사용하여 테스팅 수행한다.
True/False에 충분한 영향을 줄 수 없는 경우가 발생 가능한 한계점을 지닌다.

보기: ㄱ. 구문 커버리지, ㄴ. 경로 커버리지, ㄷ. 조건/결정 커버리지, ㄹ. 변형 조건/결정 커버리지, ㅂ. 다중 조건 커버리지, ㅅ. 결정 커버리지, ㅇ. 조건 커버리지

정답

ㅇ. 조건 커버리지 (Condition Coverage)

해설

테스트 커버리지 종류:

커버리지 설명 측정 대상
구문 커버리지 모든 문장 실행 문장
분기 커버리지 모든 분기 실행 분기
조건 커버리지 각 조건식의 참/거짓 실행 조건
결정 커버리지 모든 결정의 참/거짓 실행 결정
조건/결정 커버리지 조건과 결정 모두 커버 조건 + 결정
변형 조건/결정 커버리지 각 조건이 독립적으로 영향 조건의 독립성
다중 조건 커버리지 모든 조건 조합 테스트 조건 조합

조건 커버리지 특징:

특징 설명
목적 각 개별 조건식의 참/거짓 테스트
측정 조건식의 참/거짓 결과
한계 True/False에 충분한 영향 없는 경우 발생
도구 다양한 테스팅 툴 사용

예시 코드:

if (a > 0 && b < 10) {  // 조건: a > 0, b < 10
    statement1;
}

조건 커버리지 테스트:

  • a > 0 = true
  • a > 0 = false
  • b < 10 = true
  • b < 10 = false

조건 커버리지 vs 결정 커버리지:

구분 조건 커버리지 결정 커버리지
대상 개별 조건식 전체 결정(조건문)
측정 각 조건의 참/거짓 결정의 참/거짓
예시 a > 0의 참/거짓 if (a > 0 && b < 10)의 참/거짓

문제 7. C언어 4의 배수 개수

문제 코드

#include <stdio.h>

int main(){
    int c = 0;

    for(int i = 1; i <= 2023; i++) { 
        if(i % 4 == 0) c++; 
    }
    printf("%d", c);
}

정답

505

해설

계산 과정:

4의 배수 개수:

  • 1부터 2023까지의 4의 배수 개수
  • 4, 8, 12, 16, ..., 2020

계산 방법:

  • 첫 번째 4의 배수: 4
  • 마지막 4의 배수: 2020 (2023보다 작거나 같은 최대값)
  • 개수: 2020 / 4 = 505

검증:

  • 2023 / 4 = 505.75 → 정수 부분: 505
  • 4의 배수: 4, 8, 12, ..., 2020
  • 총 505개

4의 배수 목록 (일부):

4, 8, 12, 16, 20, ..., 2016, 2020

수식:

  • ⌊2023 / 4⌋ = 505

문제 8. 템퍼프루핑 (Tamper-Proofing)

문제

소프트웨어에서 워터마크 삭제등과 같이 소프트웨어가 불법으로 변경(unauthorized modifications)되었을 경우, 그 소프트웨어가 정상 수행되지 않게 하는 기법이다.
소프트웨어 변조 공격을 방어하기 위해 프로그램에 변조검증코드(tamper-proofing code)를 삽입하는 것도 한 방법으로
변조검증코드의 용도는 첫째 프로그램이 변경되었는지를 탐지하는 것이고, 둘째는 변조가 탐지되었다면 프로그램이 실행되지 않게 한다.
소프트웨어의 위변조 방지 역공학 기술의 일종으로 디지털 콘텐츠의 관련 산업이나 전자상거래 또는 보호해야 할 소프트웨어가 있는 다양한 산업 분야에 적용된다.

정답

템퍼프루핑 (Tamper-Proofing)

해설

템퍼프루핑 특징:

특징 설명
목적 소프트웨어 변조 방지
방법 변조검증코드 삽입
기능 변조 탐지 및 실행 차단
적용 디지털 콘텐츠, 전자상거래, 보호 소프트웨어

템퍼프루핑 동작 과정:

[정상 프로그램]
    ↓
[변조 시도]
    ↓
[변조검증코드 실행]
    ↓
[변조 탐지]
    ↓
[프로그램 실행 차단]

변조검증코드 기능:

기능 설명
탐지 프로그램 변경 여부 확인
차단 변조 시 실행 중단

템퍼프루핑 적용 분야:

  • 디지털 콘텐츠 보호
  • 전자상거래 보안
  • 중요 소프트웨어 보호
  • 라이선스 관리

관련 기술:

  • 워터마킹
  • 코드 난독화
  • 역공학 방지

문제 9. C언어 스택 구현

문제 코드

#include <stdio.h>
#define MAX_SIZE 10

int isWhat[MAX_SIZE];
int point = -1;

int isEmpty() {
    if (point == -1) return 1;
    return 0;
}

int isFull() {
    if (point == 10) return 1;
    return 0;
}

void into(int num) {
    if (point >= 10) printf("Full");
    else isWhat[++point] = num;
}

int take() {
    if (isEmpty() == 1) printf("Empty");
    else return isWhat[point--];
    return 0;
}

int main(int argc, char const *argv[]){
    int e;
    into(5); into(2);

    while(!isEmpty()){
        printf("%d", take());
        into(4); into(1); printf("%d", take());
        into(3); printf("%d", take()); printf("%d", take());
        into(6); printf("%d", take()); printf("%d", take());
    }

    return 0;
}

정답

213465

해설

스택 동작 (LIFO - Last In First Out):

초기 상태:

point = -1
스택: [ ]

실행 과정:

  1. into(5); into(2);

    • into(5): point = 0, isWhat[0] = 5
    • into(2): point = 1, isWhat[1] = 2
    • 스택: [5, 2] (아래에서 위로)
  2. while(!isEmpty()) 시작

  3. 첫 번째 반복:

    • printf("%d", take()): take()2 반환, point = 02 출력
    • into(4): point = 1, isWhat[1] = 4
    • into(1): point = 2, isWhat[2] = 1
    • 스택: [5, 4, 1]
    • printf("%d", take()): take()1 반환, point = 11 출력
    • into(3): point = 2, isWhat[2] = 3
    • 스택: [5, 4, 3]
    • printf("%d", take()): take()3 반환, point = 13 출력
    • printf("%d", take()): take()4 반환, point = 04 출력
    • into(6): point = 1, isWhat[1] = 6
    • 스택: [5, 6]
    • printf("%d", take()): take()6 반환, point = 06 출력
    • printf("%d", take()): take()5 반환, point = -15 출력
    • isEmpty() = true → 루프 종료

스택 상태 변화:

연산 스택 상태 point 출력
초기 [ ] -1 -
into(5) [5] 0 -
into(2) [5, 2] 1 -
take() [5] 0 2
into(4) [5, 4] 1 -
into(1) [5, 4, 1] 2 -
take() [5, 4] 1 1
into(3) [5, 4, 3] 2 -
take() [5, 4] 1 3
take() [5] 0 4
into(6) [5, 6] 1 -
take() [5] 0 6
take() [ ] -1 5

출력 순서:

  • 2 → 1 → 3 → 4 → 6 → 5
  • 213465

문제 10. 데이터베이스 설계 순서

문제

데이터베이스 설계 순서에 관한 내용이다. 보기를 이용하여 괄호안에 알맞은 내용을 작성하시오.

보기: 구현, 요구조건 분석, 개념적 설계, 물리적 설계, 논리적 설계

정답

요구조건 분석 → 개념적 설계 → 논리적 설계 → 물리적 설계 → 구현

해설

데이터베이스 설계 단계:

단계 설명 주요 작업
1. 요구조건 분석 사용자 요구사항 수집 및 분석 인터뷰, 문서 분석
2. 개념적 설계 E-R 모델링, 개념적 스키마 작성 개체, 관계, 속성 정의
3. 논리적 설계 관계형 모델로 변환 릴레이션 스키마 설계
4. 물리적 설계 저장 구조 및 인덱스 설계 파일 구조, 접근 방법
5. 구현 실제 데이터베이스 생성 DDL, DML 작성

설계 단계 다이어그램:

[요구조건 분석]
    ↓
[개념적 설계] (E-R 모델)
    ↓
[논리적 설계] (관계형 모델)
    ↓
[물리적 설계] (저장 구조)
    ↓
[구현] (실제 DB 생성)

각 단계 설명:

1. 요구조건 분석:

  • 사용자 요구사항 수집
  • 데이터 및 처리 요구사항 분석

2. 개념적 설계:

  • E-R 다이어그램 작성
  • 개체, 관계, 속성 정의
  • 개념적 스키마 작성

3. 논리적 설계:

  • E-R 모델을 관계형 모델로 변환
  • 릴레이션 스키마 설계
  • 정규화 수행

4. 물리적 설계:

  • 저장 구조 결정
  • 인덱스 설계
  • 접근 방법 선택

5. 구현:

  • DDL로 스키마 생성
  • 데이터 입력
  • 애플리케이션 개발

문제 11. 디자인 패턴

문제

1.
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용한다.

2.
호스트 객체의 내부 상태에 접근할 수 있는 방법을 제공하여 호스트 객체에 연산을 추가할 수 있도록 한다.
이 패턴은 보통 합성 구조의 원소들과 상호 작용하는 데 사용되며, 기존 코드를 변경하지 않고 새로운 기능을 추가하는 방법이다.

보기:

  • 생성패턴: Singleton, Factory Method, Builder
  • 구조패턴: Adapter, Bridge, Decorator
  • 행위패턴: Observer, Strategy, Visitor

정답

1. Singleton (싱글톤)
2. Visitor (방문자)

해설

디자인 패턴 분류:

패턴 유형 설명 예시
생성 패턴 객체 생성 방법 정의 Singleton, Factory, Builder
구조 패턴 클래스/객체 조합 방법 Adapter, Decorator, Bridge
행위 패턴 객체 간 상호작용 방법 Observer, Strategy, Visitor

1. Singleton 패턴:

특징:

  • 인스턴스가 하나만 생성
  • 전역 접근점 제공
  • DBCP 등에서 사용

구조:

class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

사용 예시:

  • 데이터베이스 연결 풀
  • 로깅 객체
  • 설정 관리자

2. Visitor 패턴:

특징:

  • 객체 구조와 연산 분리
  • 새로운 연산 추가 용이
  • 기존 코드 변경 없음

구조:

[Visitor] → [Element] → [ConcreteElement]
    ↓
[ConcreteVisitor]

사용 예시:

  • 컴파일러 (AST 순회)
  • 문서 구조 처리
  • 합성 구조 연산

Visitor 패턴 장점:

  • 새로운 연산 추가 용이
  • 관련 연산을 한 곳에 모음
  • 복잡한 객체 구조 처리

문제 12. 오류 제어

문제

1. Code는 데이터 전송시 1 비트의 에러를 정정할 수 있는, 오류정정부호의 일종으로 미국의 Bell 연구소의 Hamming에 의해 고안되었다. 선형블록부호 및 순회부호에 속한다.

2. 은/는 송신측이 전송할 문자나 프레임에 부가적 정보(Redundancy)를 첨가하여 전송하고 수신측이 이 부가적 정보를 이용하여 에러검출 및 에러정정을 하는 방식이다.

3. 은/는 데이터 전송 과정에서 오류가 발생하면 송신 측에 재전송을 요구하는 방식이다. 오류를 검출하는 방법은 Parity검사와 CRC, 블록 합 검사 등이 있다.

4. 은/는 데이터가 저장장치 내의 한 장소에서 다른 장소로 이동되거나, 컴퓨터들간에 전송될 때, 데이터가 유실 또는 손상되었는지 여부를 점검하는 기술과 관련된 용어이다.

5. 은/는 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식을 말한다.

보기: EAC, FEC, hamming, CRC, PDS, parity, BEC

정답

1. hamming (해밍 코드)
2. FEC (Forward Error Correction)
3. BEC (Backward Error Correction)
4. parity (패리티)
5. CRC (Cyclic Redundancy Check)

해설

오류 제어 방식 비교:

방식 설명 특징
FEC 전진 오류 정정 부가 정보로 오류 정정
BEC 후진 오류 정정 재전송 요구
해밍 1비트 오류 정정 해밍이 고안
패리티 오류 검출 유실/손상 점검
CRC 체크값 결정 순환 중복 검사

1. 해밍 코드 (Hamming Code):

특징:

  • 1비트 오류 정정 가능
  • Bell 연구소 Hamming 고안
  • 선형블록부호, 순회부호

2. FEC (Forward Error Correction):

특징:

  • 부가 정보 첨가
  • 수신측에서 오류 정정
  • 재전송 불필요

3. BEC (Backward Error Correction):

특징:

  • 오류 발생 시 재전송 요구
  • Parity, CRC, 블록 합 검사 사용
  • ARQ (Automatic Repeat Request)

4. 패리티 (Parity):

특징:

  • 데이터 유실/손상 점검
  • 단순 오류 검출
  • 짝수/홀수 패리티

5. CRC (Cyclic Redundancy Check):

특징:

  • 체크값 결정 방식
  • 순환 중복 검사
  • 높은 오류 검출률

오류 제어 방식 분류:

오류 제어
├─ FEC (전진 오류 정정)
│   └─ 해밍 코드
├─ BEC (후진 오류 정정)
│   └─ ARQ
└─ 오류 검출
    ├─ 패리티
    └─ CRC

문제 13. HDLC 프로토콜

문제

1. 프레임은 Seq, Next, P/F의 필드를 가진다. 또한 맨 처음 비트를 0으로 가진다. Seq는 송신용 순서번호를 가지고 있다. Next는 응답용 순서번호를 가진다. P/F는 P가 1로 설정된 경우 주국에서 종국에 데이터 전송을 허용하는 것을 의미하고 F가 1로 설정된 경우 종국에서 주국으로 데이터 전송을 하는 것을 의미한다.

2. 프레임은 맨 앞의 필드가 1로 되어 있어 정보 프레임이 아니라는 것을 나타내고 다음 비트가 0이 나와있다. Type의 경우에는 2비트를 가지고 있어 4가지의 종류로 나누어진다. 데이터를 보내는 역할이 아니라 응답의 기능을 수행하므로 Seq에 대한 값은 필요가 없고 다음 프레임을 요구하는 Next만 존재한다.

3. 프레임은 순서 번호가 없는 프레임을 의미한다. 첫 번째 비트와 두 번째 비트가 모두 1로 설정되어 있다. 여러 종류를 가지고 있는데 Type의 2비트와 Modifier의 3비트를 합쳐 5비트를 통해 종류를 나눈다.

4. 은/는 두 호스트 모두 혼합국으로 동작한다. 양쪽에서 명령과 응답을 전송할 수 있다.

5. 은/는 불균형 모드로 주국의 허락 없이 종국에서 데이터를 전송할 수 있다.

보기: ㄱ. 연결제어, ㄴ. 감독, ㄷ. 정보, ㄹ. 양방향 응답, ㅁ. 익명, ㅂ. 비번호, ㅅ. 릴레이, ㅇ. 동기균형, ㅈ. 동기응답, ㅊ. 비동기균형, ㅋ. 비동기응답

정답

1. ㄷ. 정보 (Information)
2. ㄴ. 감독 (Supervisory)
3. ㅂ. 비번호 (Unnumbered)
4. ㅊ. 비동기균형 (Asynchronous Balanced Mode)
5. ㅋ. 비동기응답 (Asynchronous Response Mode)

해설

HDLC 프레임 종류:

프레임 첫 비트 두 번째 비트 특징
정보 프레임 0 - Seq, Next, P/F 필드
감독 프레임 1 0 Type 2비트, Next만 존재
비번호 프레임 1 1 순서 번호 없음, Type+Modifier 5비트

1. 정보 프레임 (Information Frame):

특징:

  • 첫 비트: 0
  • Seq: 송신용 순서번호
  • Next: 응답용 순서번호
  • P/F: 폴링/최종 비트

2. 감독 프레임 (Supervisory Frame):

특징:

  • 첫 비트: 1, 두 번째 비트: 0
  • Type: 2비트 (4가지 종류)
  • Next만 존재 (Seq 없음)
  • 응답 기능 수행

3. 비번호 프레임 (Unnumbered Frame):

특징:

  • 첫 비트: 1, 두 번째 비트: 1
  • 순서 번호 없음
  • Type 2비트 + Modifier 3비트 = 5비트

HDLC 동작 모드:

모드 설명 특징
비동기응답 불균형 모드 종국이 주국 허락 없이 전송
비동기균형 균형 모드 양쪽 모두 혼합국, 명령/응답 전송

HDLC 프레임 구조:

정보 프레임:    0 | Seq | Next | P/F | 데이터
감독 프레임:    1 | 0 | Type | Next | P/F
비번호 프레임:  1 | 1 | Type | Modifier | P/F

문제 14. Java 문자열 비교

문제 코드

public class Main{
    public static void main(String[] args) {
        String str1 = "Programming";
        String str2 = "Programming";
        String str3 = new String("Programming");

        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
        System.out.println(str1.equals(str3));
        System.out.print(str2.equals(str3));
    }
}

정답

true
false
true
true

해설

실행 과정:

  1. String str1 = "Programming":

    • 문자열 리터럴
    • 문자열 풀(String Pool)에 저장
  2. String str2 = "Programming":

    • 문자열 리터럴
    • 같은 문자열이므로 풀에서 재사용
    • str1과 같은 객체 참조
  3. String str3 = new String("Programming"):

    • new 연산자로 새 객체 생성
    • 힙 메모리에 새 객체 생성
    • 다른 객체 참조

비교 연산:

비교 연산자 결과 설명
str1 == str2 == true 같은 객체 참조
str1 == str3 == false 다른 객체 참조
str1.equals(str3) equals() true 내용이 같음
str2.equals(str3) equals() true 내용이 같음

메모리 상태:

문자열 풀:
"Programming" ← str1, str2가 참조

힙 메모리:
new String("Programming") ← str3가 참조

== vs equals():

구분 == equals()
비교 대상 참조 (주소) 내용 (값)
문자열 리터럴 같은 객체면 true 내용 같으면 true
new String() 항상 false 내용 같으면 true

출력:

  1. true (str1 == str2)
  2. false (str1 == str3)
  3. true (str1.equals(str3))
  4. true (str2.equals(str3))

문제 15. 암호화 알고리즘 분류

문제

대칭키와 비대칭키에 해당하는 보기의 내용을 작성하시오.

보기: DES, RSA, AES, ECC, ARIA, SEED

정답

대칭키: DES, AES, ARIA, SEED
비대칭키: RSA, ECC

해설

암호화 알고리즘 분류:

구분 알고리즘 설명
대칭키 DES, AES, ARIA, SEED 암호화/복호화에 같은 키 사용
비대칭키 RSA, ECC 공개키/개인키 쌍 사용

대칭키 암호화:

알고리즘 설명 특징
DES Data Encryption Standard 56비트 키, 구식
AES Advanced Encryption Standard 128/192/256비트 키, 표준
ARIA 한국 표준 암호 알고리즘 128/192/256비트 키
SEED 한국 표준 암호 알고리즘 128비트 키

비대칭키 암호화:

알고리즘 설명 특징
RSA Rivest-Shamir-Adleman 큰 수의 소인수분해 기반
ECC Elliptic Curve Cryptography 타원곡선 기반, 효율적

대칭키 vs 비대칭키:

구분 대칭키 비대칭키
키 개수 1개 2개 (공개키/개인키)
속도 빠름 느림
용도 대용량 데이터 키 교환, 인증
보안 키 관리 중요 수학적 난이도 기반

암호화 방식 비교:

대칭키:
[평문] → [암호화] → [암호문] → [복호화] → [평문]
         (같은 키)              (같은 키)

비대칭키:
[평문] → [공개키 암호화] → [암호문] → [개인키 복호화] → [평문]

문제 16. 해시 (Hash)

문제

( ) 란 임의의 크기를 가진 데이터(Key)를 고정된 크기의 데이터(Value)로 변화시켜 저장하는 것이다.
키에 대한 ( ) 값을 사용하여 값을 저장하고 키-값 쌍의 갯수에 따라 동적으로 크기가 증가한다.
( ) 값 자체를 index로 사용하기 때문에 평균 시간복잡도가 O(1)로 매우 빠르다.
( ) 함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.
( ) 함수는 큰 파일에서 중복되는 레코드를 찾을 수 있기 때문에 데이터베이스 검색이나 테이블 검색의 속도를 가속할 수 있다.

정답

해시 (Hash) 또는 해싱 (Hashing)

해설

해시 특징:

특징 설명
변환 임의 크기 → 고정 크기
저장 키-값 쌍으로 저장
크기 동적으로 증가
속도 O(1) 평균 시간복잡도
용도 빠른 검색, 중복 검사

해시 테이블 구조:

키 (Key)        해시 함수        인덱스 (Index)    값 (Value)
"apple"    →    hash()    →        3        →    "사과"
"banana"   →    hash()    →        1        →    "바나나"
"cherry"   →    hash()    →        5        →    "체리"

해시 함수 특징:

특징 설명
입력 임의의 길이
출력 고정된 길이
용도 데이터 매핑

해시 활용:

활용 설명
해시 테이블 빠른 검색 (O(1))
데이터베이스 인덱스, 검색 가속
중복 검사 파일 중복 레코드 찾기
암호화 해시 함수 (SHA, MD5)

해시 충돌:

  • 서로 다른 키가 같은 해시값을 가질 수 있음
  • 해결 방법: 체이닝, 개방 주소법

문제 17. SQL DROP VIEW CASCADE

문제

보기:

DROP VIEW 학생 (         )

학생 테이블을 참조하는 다른 VIEW나 제약 조건까지 모두 삭제되어야 한다.

정답

CASCADE

해설

DROP VIEW 문법:

DROP VIEW 뷰명 [CASCADE | RESTRICT];

CASCADE vs RESTRICT:

옵션 설명
CASCADE 참조하는 객체까지 모두 삭제
RESTRICT 참조하는 객체가 있으면 삭제 불가 (기본값)

CASCADE 동작:

[학생 VIEW]
    ↓ 참조
[다른 VIEW 1]
[다른 VIEW 2]
[제약 조건]

DROP VIEW 학생 CASCADE
    ↓
모든 참조 객체 삭제

예시:

-- 학생 VIEW 삭제
DROP VIEW 학생 CASCADE;

-- 결과:
-- 학생 VIEW 삭제
-- 학생을 참조하는 다른 VIEW들 삭제
-- 관련 제약 조건 삭제

주의사항:

  • CASCADE는 신중하게 사용
  • 참조하는 모든 객체가 삭제됨
  • 데이터 손실 가능성

문제 18. 선택 정렬 (Selection Sort)

문제 코드

#include <stdio.h>
int main() {
    int E[] = {64, 25, 12, 22, 11};
    int n = sizeof(E) / sizeof(E[0]);
    int i = 0;
    do {
        int j = i + 1;
        do {
            if (E[i] (     ) E[j]) {
                int tmp = E[i];
                E[i] = E[j];
                E[j] = tmp;
            }
            j++;
        } while (j < n);
        i++;
    } while (i < n-1);
    for(int i=0; i<=4; i++)
        printf("%d ", E[i]);
}

보기: <, <=, =>, >, ==, /, %

정답

>

해설

선택 정렬 알고리즘:

오름차순 정렬:

  • 현재 위치(i)보다 큰 값(j)을 찾아 교환
  • E[i] > E[j]일 때 교환

정렬 과정:

초기 배열: [64, 25, 12, 22, 11]

1회전 (i=0):

  • j=1: 64 > 25 → 교환 → [25, 64, 12, 22, 11]
  • j=2: 25 > 12 → 교환 → [12, 64, 25, 22, 11]
  • j=3: 12 > 22 → 안함
  • j=4: 12 > 11 → 교환 → [11, 64, 25, 22, 12]

2회전 (i=1):

  • j=2: 64 > 25 → 교환 → [11, 25, 64, 22, 12]
  • j=3: 25 > 22 → 교환 → [11, 22, 64, 25, 12]
  • j=4: 22 > 12 → 교환 → [11, 12, 64, 25, 22]

최종: [11, 12, 22, 25, 64]

선택 정렬 알고리즘:

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

시간 복잡도:

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

문제 19. Python 문자열 슬라이싱

문제 코드

a = "engineer information processing"
b = a[:3]
c = a[4:6]
d = a[28:]
e = b + c + d
print(e)

정답

engneing

해설

문자열 인덱스:

문자열: "engineer information processing"
인덱스:  0123456789...

슬라이싱:

  1. b = a[:3]:

    • 인덱스 0부터 2까지 (3 전까지)
    • "eng"
  2. c = a[4:6]:

    • 인덱스 4부터 5까지 (6 전까지)
    • "ne"
  3. d = a[28:]:

    • 인덱스 28부터 끝까지
    • "ing"
  4. e = b + c + d:

    • "eng" + "ne" + "ing"
    • "engneing"

문자열 슬라이싱:

표현식 의미 결과
a[:3] 처음부터 인덱스 2까지 "eng"
a[4:6] 인덱스 4부터 5까지 "ne"
a[28:] 인덱스 28부터 끝까지 "ing"

문자열 연결:

  • + 연산자로 문자열 연결
  • "eng" + "ne" + "ing" = "engneing"

문제 20. 스텁과 드라이버

문제

1.
하향식 테스트 시 상위 모듈은 존재하나 하위 모듈이 없는 경우의 테스트를 위해 임시 제공되는 모듈이다.
특별한 목적의 소프트웨어를 구현하는 것으로 컴포넌트를 개발하거나 테스트할 때 사용된다.
서버-클라이언트 구조에서 서버만 구현된 상태로 테스트를 해보고 싶을때 단순히 값만 넘겨주는 가상의 클라이언트를 만들어서 테스트 할 수 있다.

2.
상향식 테스트 시 상위 모듈 없이 하위 모듈이 존재할 때 하위 모듈 구동 시 자료 입출력을 제어하기 위한 제어 모듈(소프트웨어)이다.
서버-클라이언트 구조에서 클라이언트만 구현된 상태로 테스트를 해보고 싶을때 접속 인증 등의 간단한 기능만 하는 가상의 서버를 만들어서 테스트 할 수 있다.

정답

1. 스텁 (Stub)
2. 드라이버 (Driver)

해설

테스트 더미 (Test Dummy) 비교:

구분 스텁 (Stub) 드라이버 (Driver)
사용 시점 하향식 테스트 상향식 테스트
위치 하위 모듈 대체 상위 모듈 대체
기능 간단한 값 반환 제어 및 입출력 처리
예시 가상 클라이언트 가상 서버

하향식 테스트 (Top-Down):

[상위 모듈]
    ↓
[스텁] (하위 모듈 대체)

상향식 테스트 (Bottom-Up):

[드라이버] (상위 모듈 대체)
    ↓
[하위 모듈]

스텁 (Stub) 특징:

특징 설명
목적 하위 모듈 대체
기능 간단한 값 반환
예시 가상 클라이언트

드라이버 (Driver) 특징:

특징 설명
목적 상위 모듈 대체
기능 제어 및 입출력 처리
예시 가상 서버

서버-클라이언트 예시:

스텁 (클라이언트 대체):

[서버] ← [스텁] (값만 전달)

드라이버 (서버 대체):

[드라이버] (인증 등) → [클라이언트]

정리

출제 영역별 분류

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

핵심 개념 정리

  1. 배열 순환: 모듈로 연산으로 인덱스 순환
  2. 거스름돈 계산: 나눗셈과 나머지 연산
  3. 포인터와 전역 변수: 같은 메모리 공간 공유 문제
  4. SQL INSERT: 문자열은 작은따옴표 사용
  5. switch문: break 없으면 fall-through
  6. 조건 커버리지: 각 조건식의 참/거짓 테스트
  7. 4의 배수: 나눗셈으로 개수 계산
  8. 템퍼프루핑: 소프트웨어 변조 방지
  9. 스택: LIFO 구조, push/pop 연산
  10. DB 설계 순서: 요구조건 → 개념 → 논리 → 물리 → 구현
  11. Singleton/Visitor: 디자인 패턴
  12. 오류 제어: 해밍, FEC, BEC, 패리티, CRC
  13. HDLC: 정보/감독/비번호 프레임
  14. 문자열 비교: ==는 참조, equals()는 내용
  15. 암호화 알고리즘: 대칭키/비대칭키 분류
  16. 해시: O(1) 검색, 키-값 매핑
  17. DROP VIEW CASCADE: 참조 객체까지 삭제
  18. 선택 정렬: 최소값 찾아 교환
  19. 문자열 슬라이싱: 인덱스 범위 지정
  20. 스텁/드라이버: 테스트 더미 모듈

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