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

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

by 허쌤 2026. 3. 23.

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

문제 1. RAID 단계

문제:

  • Striping(스트라이핑) 구현 방식
  • I/O 로드의 분산으로 매우 빠른 속도
  • 데이터를 블럭으로 분할 저장하며, 각 블럭은 다른 디스크로 나뉘어 저장

답: 0 (RAID 0)

해설:

  • RAID 0 (스트라이핑): 데이터를 여러 디스크에 분산 저장하는 방식
  • 장점:
    • 여러 디스크에 동시에 읽기/쓰기가 가능하여 속도가 매우 빠름
    • I/O 로드가 분산되어 성능 향상
  • 단점:
    • 패리티나 미러링이 없어 하나의 디스크라도 고장나면 모든 데이터 손실
    • 데이터 복구 불가능
  • 사용 용도: 성능이 중요한 환경, 임시 데이터 저장

문제 2. 데이터베이스 트랜잭션 처리

문제:

  1. 오류가 발생하기 전까지의 사항을 로그(log)로 기록해 놓고, 이전 상태로 되돌아간 후, 실패가 발생하기 전까지의 과정을 그대로 따라가는 현상
  2. 작업을 취소하여 트랜잭션을 이전 상태로 되돌리는 것

답:

  1. redo (재실행)
  2. undo (취소)

해설:

  • Redo (재실행):

    • 트랜잭션이 커밋된 후 시스템 장애가 발생했을 때
    • 로그 파일에 기록된 내용을 다시 실행하여 데이터베이스를 장애 전 상태로 복구
    • "앞으로 가기" 개념
  • Undo (취소):

    • 트랜잭션이 롤백되거나 커밋 전 장애 발생 시
    • 로그 파일을 역순으로 읽어 변경 사항을 취소하고 이전 상태로 복구
    • "뒤로 가기" 개념

ACID 속성과의 관계:

  • 원자성(Atomicity): Undo로 보장
  • 지속성(Durability): Redo로 보장

문제 3. Java 메서드 호출 및 참조 전달

문제:

class A {
  int a;
  int b;
}

public class Main {
  static void func1(A m){
   m.a *= 10;
  }

  static void func2(A m){
    m.a += m.b;
  }

  public static void main(String args[]){
    A m = new A();
    m.a = 100;
    func1(m);
    m.b = m.a;
    func2(m);
    System.out.printf("%d", m.a);
  }
}

답: 2000

해설:

  1. m.a = 100 → m.a = 100
  2. func1(m) 호출 → m.a = 10 → m.a = 100 * 10 = *1000**
    • Java에서 객체는 참조로 전달되므로 func1에서 변경한 값이 원본에 반영됨
  3. m.b = m.a → m.b = 1000
  4. func2(m) 호출 → m.a += m.b → m.a = 1000 + 1000 = 2000

핵심 개념:

  • Java에서 객체는 참조(Reference)로 전달
  • 메서드 내에서 객체의 필드를 변경하면 원본 객체도 변경됨
  • 기본 타입(int, char 등)은 값으로 전달되지만, 객체는 항상 참조로 전달

문제 4. SQL ORDER BY 절

문제:
SELECT name, score FROM 성적 ( 1 ) BY ( 2 ) ( 3 )

답:

  1. ORDER
  2. score
  3. DESC

해설:

  • ORDER BY: 결과 집합을 정렬하는 SQL 절
  • 구문: ORDER BY 컬럼명 [ASC|DESC]
  • ASC: 오름차순 (기본값, 생략 가능)
  • DESC: 내림차순
  • 예시: SELECT name, score FROM 성적 ORDER BY score DESC
    • 성적 테이블에서 이름과 점수를 선택하고, 점수 기준으로 내림차순 정렬

다중 정렬:

ORDER BY score DESC, name ASC  -- 점수 내림차순, 이름 오름차순

문제 5. 삭제 이상 (Deletion Anomaly)

답: 데이터를 삭제할 경우 원하지 않는 다른 데이터도 삭제되어버리는 이상

해설:

  • 삭제 이상: 하나의 레코드를 삭제할 때 의도하지 않은 다른 데이터까지 함께 삭제되는 현상
  • 예시:
    학생 테이블
    학번 | 이름 | 과목코드 | 과목명 | 점수
    1001 | 홍길동 | CS101 | 프로그래밍 | 90
    1001 | 홍길동 | CS102 | 자료구조 | 85
    1002 | 김철수 | CS101 | 프로그래밍 | 95
    • 홍길동의 CS102 레코드만 삭제하려고 하면, 홍길동의 정보도 함께 삭제될 수 있음
    • 또는 CS101 과목을 수강하는 학생이 한 명뿐이라면, 그 학생의 정보를 삭제하면 과목 정보도 함께 삭제됨

해결 방법:

  • 정규화를 통해 테이블을 분리
  • 외래키 제약조건 설정
  • CASCADE 옵션 신중하게 사용

문제 6. Python 기본 매개변수 (Default Parameter)

문제:

def exam(num1, num2=2):
  print('a=', num1, 'b=', num2)
exam(20)

답: a= 20 b= 2

해설:

  • 기본 매개변수(Default Parameter): 함수 정의 시 매개변수에 기본값을 지정할 수 있음
  • num2=2에서 num2는 기본값이 2로 설정됨
  • exam(20) 호출 시:
    • num1 = 20 (인자로 전달됨)
    • num2 = 2 (기본값 사용, 인자 없음)

주의사항:

  • 기본 매개변수는 반드시 일반 매개변수 뒤에 위치해야 함
  • def exam(num1=1, num2): (오류)
  • def exam(num1, num2=2): (정상)

문제 7. Python 리스트 메서드

문제:

  1. 요소를 확장해준다는 의미를 가지고 있으며, 모든 항목을 하나의 요소로 추가
  2. 리스트 내부 요소를 꺼내주는 함수로써, 그 요소는 리스트 안에서 삭제하고 그 값을 반환
  3. 리스트 내부의 요소의 순서를 뒤집는 역할

답:

  1. extend
  2. pop
  3. reverse

해설:

  1. extend(확장):

    list1 = [1, 2, 3]
    list2 = [4, 5]
    list1.extend(list2)  # [1, 2, 3, 4, 5]
    • 다른 리스트의 모든 요소를 현재 리스트에 추가
    • append와의 차이: append는 리스트 자체를 하나의 요소로 추가
  2. pop(꺼내기):

    list1 = [1, 2, 3]
    value = list1.pop()  # value = 3, list1 = [1, 2]
    value = list1.pop(0)  # value = 1, list1 = [2]
    • 리스트에서 요소를 제거하고 그 값을 반환
    • 인덱스 지정 가능 (기본값: 마지막 요소)
  3. reverse(뒤집기):

    list1 = [1, 2, 3]
    list1.reverse()  # [3, 2, 1]
    • 리스트의 요소 순서를 역순으로 변경
    • 원본 리스트를 변경함 (새 리스트 반환 아님)

문제 8. TKIP (Temporal Key Integrity Protocol)

답: TKIP (Temporal Key Integrity Protocol)

해설:

  • TKIP: WEP의 취약점을 보완하기 위해 개발된 암호화 프로토콜
  • 특징:
    • WEP와 호환성 유지
    • 패킷마다 동적으로 키 변경
    • 메시지 무결성 검사(MIC) 추가
    • 재전송 공격 방지
  • 사용: Wi-Fi Protected Access (WPA)에서 사용
  • 현재: WPA2/WPA3에서 AES-CCMP로 대체됨

WEP → WPA → WPA2 → WPA3 진화 과정:

  • WEP: 취약한 정적 키
  • WPA: TKIP 사용
  • WPA2: AES-CCMP 사용
  • WPA3: 최신 보안 강화

문제 9. NUI (Natural User Interface)

답: NUI (Natural User Interface)

해설:

  • NUI (자연 사용자 인터페이스): 키보드나 마우스 없이 인간의 자연스러운 동작으로 컴퓨터를 제어하는 인터페이스
  • 특징:
    • 직관적이고 자연스러운 상호작용
    • 학습 곡선이 낮음
    • 터치, 음성, 제스처 인식 등 활용
  • 예시:
    • 터치스크린 (스마트폰, 태블릿)
    • 음성 인식 (Siri, Alexa)
    • 제스처 인식 (Kinect)
    • 눈동자 추적
    • 뇌파 인식

GUI vs NUI:

  • GUI: 그래픽 사용자 인터페이스 (마우스, 키보드 필요)
  • NUI: 자연 사용자 인터페이스 (자연스러운 동작)

문제 10. 정적 분석 vs 동적 분석

문제:

  1. 소스 코드의 실행 없이, 코드의 의미를 분석해 결함을 찾아내는 원시적 코드 분석 기법
  2. 소스 코드를 실행하여 프로그램 동작이나 반응을 추적하고 코드에 존재하는 메모리 누수, 스레드 결함 등을 분석

답:

  1. static (정적 분석)
  2. dynamic (동적 분석)

해설:

  1. 정적 분석 (Static Analysis):

    • 코드를 실행하지 않고 분석
    • 소스 코드의 구조, 문법, 의미 분석
    • 장점: 실행 전 오류 발견 가능, 빠른 분석
    • 단점: 실행 시점의 오류는 발견 불가
    • 도구: SonarQube, PMD, Checkstyle, ESLint
  2. 동적 분석 (Dynamic Analysis):

    • 코드를 실행하면서 분석
    • 런타임 동작, 메모리 사용, 성능 분석
    • 장점: 실제 실행 환경에서의 문제 발견
    • 단점: 실행 시간 필요, 모든 경로 테스트 어려움
    • 도구: Valgrind, Purify, JProfiler

비유:

  • 정적 분석: 자동차를 보면서 설계 문제 찾기
  • 동적 분석: 자동차를 운전하면서 문제 찾기

문제 11. Java Thread 생성

문제:

class Car implements Runnable{
  int a;

  public void run(){
     system.out.println("message")
  }
}

public class Main{
  public static void main(String args[]){
    Thread t1 = new Thread(new ___());
    t1.start();
  }
}

답: Car

해설:

  • Runnable 인터페이스: 스레드로 실행 가능한 작업을 정의
  • Car 클래스가 Runnable 인터페이스를 구현했으므로, Thread 생성자에 Car 객체를 전달해야 함
  • Thread 생성 방법:
    1. Runnable 구현: new Thread(new Car())
    2. Thread 상속: class Car extends Thread

실행 흐름:

  1. new Car(): Car 객체 생성
  2. new Thread(new Car()): Runnable을 받는 Thread 생성
  3. t1.start(): 스레드 시작 → run() 메서드 실행

주의사항:

  • start(): 새 스레드에서 run() 실행
  • run(): 현재 스레드에서 run() 실행 (스레드 생성 안 됨)

문제 12. JUnit

답: JUnit

해설:

  • JUnit: Java용 단위 테스트 프레임워크
  • 특징:
    • xUnit 테스트 프레임워크의 Java 버전
    • 숨겨진 단위 테스트를 정형화
    • 테스트 자동화 및 반복 실행 가능
    • TDD(Test-Driven Development) 지원
  • 주요 어노테이션:
    • @Test: 테스트 메서드
    • @Before: 각 테스트 전 실행
    • @After: 각 테스트 후 실행
    • @BeforeClass: 클래스 로드 시 한 번 실행
    • @AfterClass: 모든 테스트 후 한 번 실행

예시:

@Test
public void testAdd() {
    assertEquals(5, calculator.add(2, 3));
}

문제 13. 블랙박스 테스트 기법

답: ㄷ, ㄹ, ㅂ (보기에서 선택, 일반적으로 포함되는 기법들)

해설:

  • 블랙박스 테스트: 내부 구조를 모르고 입력과 출력만으로 테스트
  • 주요 기법:
    1. 동등 분할 (Equivalence Partitioning): 입력을 유사한 그룹으로 나누어 테스트
    2. 경계값 분석 (Boundary Value Analysis): 경계값에서 테스트
    3. 결정 테이블 (Decision Table): 조건과 행동을 표로 정리
    4. 상태 전이 테스트: 상태 변화 테스트
    5. 원인-결과 그래프: 입력과 출력의 관계 분석
    6. 오류 추정 (Error Guessing): 경험 기반 오류 추정

화이트박스 테스트와의 차이:

  • 화이트박스: 내부 구조를 알고 코드 기반 테스트
  • 블랙박스: 내부 구조 모르고 기능 기반 테스트

문제 14. C 재귀 함수 (팩토리얼)

문제:

#include <stdio.h>
int func(int a) {
  if (a <= 1) return 1;
  return a * func(a - 1);
}

int main() {
  int a;
  scanf("%d", &a);
  printf("%d", func(a));
}

입력: 5

답: 120

해설:

  • 재귀 함수: 함수가 자기 자신을 호출하는 함수
  • 팩토리얼 계산: n! = n × (n-1) × (n-2) × ... × 1
  • 실행 과정:
    func(5)
    = 5 * func(4)
    = 5 * 4 * func(3)
    = 5 * 4 * 3 * func(2)
    = 5 * 4 * 3 * 2 * func(1)
    = 5 * 4 * 3 * 2 * 1
    = 120

재귀 함수의 구성 요소:

  1. 기저 조건 (Base Case): if (a <= 1) return 1;
  2. 재귀 호출: return a * func(a - 1);

문제 15. C 정수 역순 출력

문제:

#include <stdio.h>
int main() {
  int number = 1234;
  int div = 10;
  int result = 0;

  while (number ( 1 ) 0) {
    result = result * div;
    result = result + number ( 2 ) div;
    number = number ( 3 ) div;
  }

  printf("%d", result);  // 결과: 4321
  return 0;
}

답:

  1. > (크다)
  2. % (나머지)
  3. / (나누기)

해설:

  • 목표: 1234 → 4321로 변환
  • 알고리즘:
    1. 일의 자리 추출: number % 10 → 4
    2. result에 추가: result * 10 + 4 → 4
    3. number에서 일의 자리 제거: number / 10 → 123
    4. 반복

실행 과정:

초기: number=1234, result=0

1회: number=1234 > 0
     result = 0*10 + (1234%10) = 0 + 4 = 4
     number = 1234/10 = 123

2회: number=123 > 0
     result = 4*10 + (123%10) = 40 + 3 = 43
     number = 123/10 = 12

3회: number=12 > 0
     result = 43*10 + (12%10) = 430 + 2 = 432
     number = 12/10 = 1

4회: number=1 > 0
     result = 432*10 + (1%10) = 4320 + 1 = 4321
     number = 1/10 = 0

5회: number=0 > 0 (거짓) → 종료

문제 16. ISMS

답: ISMS (Information Security Management System)

해설:

  • ISMS: 정보보호 관리체계
  • 정의: 조직의 정보자산을 보호하기 위한 관리체계
  • 목적: 정보보안 위험을 관리하고 지속적으로 개선
  • 인증: 한국인터넷진흥원(KISA)에서 인증
  • 주요 구성 요소:
    • 정보보안 정책
    • 조직 및 책임
    • 자산 관리
    • 접근 통제
    • 암호화
    • 물리적 보안
    • 운영 보안
    • 사고 대응

관련 표준:

  • ISO/IEC 27001: 국제 정보보안 관리 표준
  • ISMS-P: ISMS 인증 기준

문제 17. 데이터베이스 키의 속성

문제:

  1. 슈퍼키는 ( 1 ) 의 속성을 갖는다.
  2. 후보키는 ( 1 ) 와/과 ( 2 ) 의 속성을 갖는다.

답:

  1. 유일성
  2. 최소성

해설:

슈퍼키 (Super Key):

  • 유일성: 릴레이션 내에서 튜플을 유일하게 식별할 수 있는 속성 집합
  • 최소성 불필요: 최소한의 속성만 포함할 필요 없음
  • 예시: {학번, 이름}, {학번, 이름, 주소} 모두 슈퍼키

후보키 (Candidate Key):

  • 유일성: 튜플을 유일하게 식별
  • 최소성: 최소한의 속성만 포함 (불필요한 속성 제거)
  • 예시: {학번}은 후보키, {학번, 이름}은 슈퍼키이지만 후보키 아님

키의 계층 구조:

슈퍼키 (유일성)
  ↓
후보키 (유일성 + 최소성)
  ↓
기본키 (후보키 중 선택)
  ↓
대체키 (기본키가 아닌 후보키)

문제 18. Watering Hole 공격

답: watering hole (워터링홀 공격)

해설:

  • 워터링홀 공격 (Watering Hole Attack):
    • 공격 대상이 자주 방문하는 합법적인 웹사이트를 미리 감염시킴
    • 대상이 방문하면 자동으로 악성코드 설치
    • APT(Advanced Persistent Threat) 공격에서 주로 사용

공격 과정:

  1. 공격 대상의 관심사/자주 방문하는 사이트 파악
  2. 해당 사이트에 악성코드 삽입
  3. 대상이 사이트 방문 시 자동 감염
  4. 백도어 설치 및 정보 탈취

특징:

  • 합법적인 사이트를 이용하므로 탐지 어려움
  • 특정 그룹/조직을 타겟으로 함
  • 장기간 잠복 가능

방어 방법:

  • 웹사이트 보안 강화
  • 사용자 교육
  • 보안 솔루션 업데이트
  • 이상 트래픽 모니터링

문제 19. C 소수와 최대 약수

문제:

#include <stdio.h> 
int isPrime(int number) { 
  int i; 
  for (i=2; i<number; i++) { 
    if (number % i == 0) return 0; 
  } 
  return 1; 
} 

int main(void) { 
  int number = 13195, max_div=0, i; 
  for (i=2; i<number; i++) 
  if (isPrime(i) == 1 && number % i == 0) max_div = i; 
  printf("%d", max_div); 
  return 0; 
}

답: 29

해설:

  • 목표: 13195의 소수인 약수 중 최대값 찾기
  • isPrime 함수: 소수 판별 (2부터 number-1까지 나누어떨어지는지 확인)
  • main 함수:
    • 2부터 13195까지 반복
    • 소수이면서 13195의 약수인 경우 max_div 업데이트

실행 과정:

13195의 약수: 1, 5, 7, 13, 29, 35, 65, 91, 145, 203, 377, 455, 1015, 2639, 13195
소수인 약수: 5, 7, 13, 29
최대값: 29

검증:

  • 13195 ÷ 29 = 455 ✓
  • 29는 소수 ✓ (2~28까지 나누어떨어지지 않음)

문제 20. V모델 테스트 단계

답:

  1. 단위 테스트 (Unit Test)
  2. 통합 테스트 (Integration Test)
  3. 시스템 테스트 (System Test)
  4. 인수 테스트 (Acceptance Test)

해설:

V모델 (V-Model):

  • 개발 단계와 테스트 단계를 대칭적으로 매핑한 모델
  • 왼쪽: 개발 단계 (위→아래)
  • 오른쪽: 테스트 단계 (아래→위)

테스트 단계:

  1. 단위 테스트 (Unit Test):

    • 개별 모듈/함수 단위로 테스트
    • 개발자가 직접 수행
    • 화이트박스 테스트 기법 사용
  2. 통합 테스트 (Integration Test):

    • 여러 모듈을 결합하여 테스트
    • 모듈 간 인터페이스 검증
    • 상향식/하향식 통합
  3. 시스템 테스트 (System Test):

    • 전체 시스템을 통합하여 테스트
    • 기능 요구사항 검증
    • 성능, 보안, 안정성 테스트
  4. 인수 테스트 (Acceptance Test):

    • 사용자 요구사항 만족 여부 확인
    • 실제 사용 환경에서 테스트
    • 알파/베타 테스트 포함

V모델의 장단점:

  • 장점: 각 단계별 명확한 검증, 문서화 강조
  • 단점: 변경 사항 반영 어려움, 순차적 진행

총정리

이번 시험의 주요 출제 영역:

  1. 데이터베이스: RAID, 트랜잭션, 정규화, SQL
  2. 프로그래밍: Java, Python, C 언어
  3. 정보보안: 암호화, 보안 공격, ISMS
  4. 소프트웨어 공학: 테스트 기법, 개발 모델
  5. 네트워크: 프로토콜, 인터페이스

학습 팁:

  • 각 개념의 정의와 특징을 정확히 이해
  • 프로그래밍 문제는 단계별로 추적하며 풀기
  • 약어는 정확한 영문명 암기
  • 실무와 연결하여 이해하기