2026년 1회 정보처리기사 실기 시험은 프로그래밍 언어와 SQL 비중이 높았고, 보안 분야에서는 비교적 낯선 용어도 출제됐습니다. 이번 글에서는 복원된 기출문제 20문항의 정답과 해설을 정리하고, 실제 시험장에서 시간을 아낄 수 있는 전략까지 함께 정리했습니다. 문제를 직접 풀어보고 채점까지 할 수 있도록 구성했으니, 시험을 준비하는 분들이라면 끝까지 읽어보시길 권합니다.
시험은 CBT 방식으로 진행되며, 과목별 문항 수가 정해져 있지 않고 전체 20문항이 출제됩니다. 출제 영역별 비중을 보면 프로그래밍 언어(Java, C, Python)와 SQL이 가장 큰 부분을 차지했고, 그다음으로 보안, 네트워크, 소프트웨어 공학 순이었습니다. 특히 이번 회차는 코드 실행 결과를 묻는 문제가 많아서 단순 암기보다는 실행 흐름을 이해하는 능력이 중요했습니다.
2026년 1회 정보처리기사 실기, 프로그래밍 문제 정답부터 확인하기
프로그래밍 언어 문제는 총 6문항이 출제됐습니다. C언어 1문항, Java 2문항, Python 3문항이었는데, 모두 실행 결과를 묻는 유형이었습니다.
C언어 배열 평균 계산 문제
다음 코드를 실행했을 때 출력값을 구하는 문제입니다.
#include <stdio.h>
double arr1(int a[]) {
int sum = 0;
for(int i = 0; i < 10; i++) sum += a[i];
return sum / 10.0;
}
double arr2(int a[]) {
int sum = 0;
for(int i = 0; i < 10; i++) sum += a[i];
return sum / 10;
}
int main() {
int arr[10] = {80, 20, 50, 55, 45, 95, 55, 10, 40, 80};
printf("%.2f", arr1(arr) + arr2(arr));
return 0;
}
배열 원소의 합은 530이고, arr1과 arr2는 각각 평균 53.0을 반환합니다. 두 결과를 더하면 106.0이 되며, %.2f로 출력하므로 106.00이 정답입니다. arr2에서 10으로 나눈 부분이 정수 나눗셈처럼 보일 수 있는데, sum이 int지만 10.0이 아닌 10으로 나누어도 자동 형변환이 일어나 double로 계산됩니다.
Java 상속과 오버라이딩 문제
다음 코드의 출력값을 구하는 문제입니다.
class A {
void f(Object o) { System.out.print(1); }
void g() { f("a"); }
}
class B extends A {
void f(Object o) { System.out.print(2); }
void f(String s) { System.out.print(3); }
}
public class Main {
public static void main(String[] args) {
A a = new B();
a.g();
}
}
a는 A 타입의 참조변수이지만 실제 객체는 B입니다. a.g()를 호출하면 A 클래스에 정의된 g()가 실행됩니다. g() 내부의 f("a")는 컴파일 시점에 A 클래스 기준으로 f(Object)를 선택하는데, 실행 시점에는 동적 바인딩에 의해 B에서 오버라이딩한 f(Object)가 호출됩니다. 따라서 출력값은 2입니다.
여기서 B의 f(String)은 오버로딩 메서드일 뿐이라 이 호출 대상이 아니라는 점이 핵심입니다. 메서드 선택은 선언 타입을 기준으로, 실행은 실제 객체를 기준으로 한다는 원칙을 기억해두면 비슷한 문제에서 실수하지 않습니다.
Java 함수 포인터 문제
#include <stdio.h>
int* dummy(int n[]) {
return n + 1;
}
int main() {
int n[5] = {10, 32, 45, 20, 50};
int (*fn)(int[]) = dummy;
printf("%x", *fn(n));
return 0;
}
이 문제는 C언어로 출제됐습니다. dummy 함수는 배열 시작 주소에서 한 칸 뒤인 n+1을 반환하므로, *fn(n)은 n[1]인 32가 됩니다. %x는 16진수 출력이므로 32를 16진수로 바꾼 20이 정답입니다.
Python 문자열 뒤집기 문제
s = input()
y = s[::-1]
r = ''
for o in y:
if o not in 'ong':
r += o
print(r)
입력값이 HumanDev일 때, y는 문자열을 뒤집은 veDnamuH가 됩니다. 반복문에서 'o', 'n', 'g'에 해당하는 문자는 제외하는데, 여기서는 n 하나만 빠집니다. 따라서 출력값은 veDamuH입니다. 만약 입력이 여러 단어로 이루어졌다면 split을 써야 하지만, 이 문제는 단어가 하나라 공백 처리는 필요 없습니다.
Python 슬라이싱 문제
lst = list(range(10))
for i in lst[::-2]:
print(i, end='A')
list(range(10))은 0부터 9까지의 리스트입니다. lst[::-2]는 뒤에서부터 2칸씩 건너뛰며 가져오므로 [9, 7, 5, 3, 1]이 됩니다. 각 값 뒤에 A를 붙여 출력하므로 9A7A5A3A1A가 정답입니다.
Python 얕은 복사 문제
m = [[i] for i in range(1, 5)]
b = m[:]
for i in range(3):
b[i+1] += b[i]
print(sum(len(i) for i in m))
m은 [[1], [2], [3], [4]]이고, b = m[:]는 얕은 복사입니다. b의 각 내부 리스트는 m의 내부 리스트와 같은 객체를 참조하므로, 반복문에서 b[i+1] += b[i]를 수행하면 내부 리스트가 누적되면서 m도 함께 변경됩니다. 최종적으로 m의 각 내부 리스트 길이는 1, 2, 3, 4가 되어 합은 10입니다. 얕은 복사와 깊은 복사의 차이를 묻는 대표적인 문제입니다.
정보처리기사 실기 SQL 문제, 테이블 조건과 출력 결과 정리
이번 회차 SQL 문제는 5문항이 출제됐습니다. 테이블 행 수 계산, 외래키 제약 조건 작성, JOIN과 서브쿼리 조합 문제가 나왔습니다.
행 수 계산 문제
STUDENT 테이블에 컴퓨터과 50명, 인터넷과 100명, 사무자동화과 50명이 저장되어 있을 때, 다음 SQL의 반환 행 수를 구하는 문제입니다.
1. SELECT DEPT FROM STUDENT;
2. SELECT DISTINCT DEPT FROM STUDENT;
3. SELECT COUNT(DISTINCT DEPT) FROM STUDENT WHERE DEPT = '컴퓨터과';
- 첫 번째는 전체 학생의 DEPT 값을 조회하므로 200행
- 두 번째는 중복 학과명을 제거하므로 컴퓨터과, 인터넷과, 사무자동화과 3행
- 세 번째는 컴퓨터과만 남긴 뒤 서로 다른 학과명을 세므로 1
DISTINCT의 역할과 COUNT(DISTINCT)가 어떻게 동작하는지를 묻는 기본 문제였습니다.
외래키 제약 조건 작성 문제
PLAYER 테이블을 정의하면서 TEAM 테이블의 TEAM_ID2를 참조하는 외래키를 추가하는 문제입니다.
CREATE TABLE PLAYER (
PLAYER_ID CHAR(7) NOT NULL,
PLAYER_NAME VARCHAR2(20) NOT NULL,
TEAM_ID CHAR(3) NOT NULL,
PRIMARY KEY (PLAYER_ID),
( 1 ) TEAM_TF
( 2 ) KEY ( 3 )
( 4 ) TEAM ( 5 )
);
완성된 형태는 다음과 같습니다.
CONSTRAINT TEAM_TF FOREIGN KEY (TEAM_ID) REFERENCES TEAM (TEAM_ID2)
따라서 ① CONSTRAINT, ② FOREIGN, ③ TEAM_ID, ④ REFERENCES, ⑤ TEAM_ID2가 정답입니다. 외래키 구문을 순서대로 외우고 있으면 쉽게 풀 수 있는 문제입니다.
JOIN과 서브쿼리 문제
employee와 dept 테이블을 JOIN하고, budget이 전체 평균보다 큰 부서만 추출하는 문제였습니다.
SELECT COUNT(*)
FROM employee e
JOIN dept d ON e.dep_id = d.dept_id
WHERE d.budget > (SELECT AVG(budget) FROM dept);
dept 테이블의 budget 평균이 200이라면, 조건을 만족하는 부서는 budget이 300인 dept_id 20뿐입니다. employee 테이블에서 dep_id가 20인 행이 2개이므로 정답은 2입니다. 서브쿼리 결과를 먼저 계산하고, 그다음 JOIN 조건과 WHERE를 적용하는 순서로 접근하면 됩니다.
정보처리기사 실기에서 자주 나오는 디자인 패턴, DB 설계, 보안 용어
이번 회차에서는 이론 문제도 상당수 출제됐습니다. 디자인 패턴, DB 설계 절차, 비기능 요구사항, 네트워크, 보안 공격 기법이 대표적입니다.
디자인 패턴 문제
설명을 읽고 해당하는 패턴을 쓰는 문제입니다.
- (ㄱ) 기능의 클래스 계층과 구현의 클래스 계층을 연결 → Bridge 패턴
- (ㄴ) 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 상태 변화를 알려줌 → Observer 패턴
Bridge는 추상화와 구현을 분리해 독립적으로 확장할 수 있게 하는 구조 패턴입니다. Observer는 유튜브 채널과 구독자 관계처럼 상태 변화를 자동으로 알리는 행위 패턴입니다. 두 패턴의 용도를 확실히 구분해두면 좋습니다.
DB 설계 절차 문제
데이터베이스 설계 절차를 순서대로 쓰는 문제였습니다.
요구사항 분석 → 개념적 설계 → 논리적 설계 → 물리적 설계 → 구현
사용자 요구를 파악하고, 개체와 관계를 모델링한 뒤, 관계 스키마로 변환하고, 저장 구조를 결정한 다음 실제 DB를 구축하는 흐름입니다. 시험에 자주 나오는 순서이므로 반드시 암기해두세요.
비기능 요구사항 유형 문제
다음 설명에 해당하는 요구사항 유형을 보기에서 고르는 문제입니다.
- 시스템 운영 중 로그 관리 및 모니터링 기능 → 운영 요구사항
- 최소 메모리 용량 확보, 자원 사용량 제한 → 자원 요구사항
- 응답 시간 최대 1분 이내 → 성능 요구사항
비기능 요구사항은 성능, 자원, 보안, 신뢰성, 이식성, 사용성, 운영, 문화·정책적 요구사항으로 구분됩니다. 각 유형의 정의를 서로 대비해서 외워두면 헷갈리지 않습니다.
네트워크 주소 계산 문제
IP 주소와 서브넷 마스크가 주어졌을 때, 각 호스트가 속한 네트워크 주소를 CIDR 표기법으로 쓰는 문제입니다.
- 호스트 a: 192.168.11.20 → 192.168.10.0/23
- 호스트 b: 192.168.12.200 → 192.168.12.0/23
서브넷 마스크 255.255.254.0은 /23입니다. 세 번째 옥텟이 2 단위로 블록이 나뉘므로, 11은 10-11 범위에, 12는 12-13 범위에 속합니다. 네트워크 주소는 해당 범위의 첫 번째 숫자를 쓰고 호스트 부분은 0으로 채웁니다.
보안 공격 기법 문제
두 가지 공격 기법에 대한 설명이 나왔습니다.
첫 번째는 실제 파일이 아닌 특정 파일의 경로를 참조하는 특수 파일을 생성하고, 프로그램이 임시 파일을 생성하는 순간을 노려 교체하는 공격입니다. 이는 심볼릭링크 공격입니다. 심볼릭링크는 특정 파일이나 경로를 가리키는 특수 파일인데, 공격자가 임시 파일 생성 시점을 노려 교체하면 프로그램이 의도하지 않은 원본 파일을 참조하게 됩니다.
두 번째는 공격 대상이 자주 방문하는 합법적인 웹사이트에 악성코드를 삽입하고, 대상이 접속하는 순간 감염시키는 공격입니다. 이는 워터링 홀 공격(Watering Hole Attack) 입니다. 특정 조직이나 인물을 겨냥하는 표적 공격의 성격이 강하다는 점이 특징입니다.
정보처리기사 실기 통합 테스트, 응집도 용어 정리
소프트웨어 공학 관련 문제도 출제됐습니다. 통합 테스트에서 사용되는 더미 모듈과 응집도 유형을 묻는 문제였습니다.
더미 모듈 문제
- (1) 하위 모듈을 대신하여 단순한 결과값만 반환하도록 임시로 작성된 더미 모듈 → 테스트 스텁(Stub)
- (2) 상위 모듈을 대신하여 하위 모듈의 데이터 입력과 출력을 확인하는 더미 모듈 → 테스트 드라이버(Driver)
스텁은 하향식 통합 테스트에서 필요하고, 드라이버는 상향식 통합 테스트에서 필요합니다. 방향이 반대라는 점을 기억해두면 쉽게 구분할 수 있습니다.
응집도 유형 문제
- (1) 모듈 안의 구성요소들이 기능을 순차적으로 수행 → 절차적 응집도(Procedural)
- (2) 동일한 입력과 출력을 사용하여 서로 다른 기능을 수행 → 교환적 응집도(Communicational)
- (3) 모듈 내부의 모든 기능이 단일한 목적을 위해 수행 → 기능적 응집도(Functional)
응집도는 기능적 > 순차적 > 교환적 > 절차적 > 시간적 > 논리적 > 우연적 순서로 강도가 높습니다. 기능적 응집도가 가장 바람직한 설계입니다.
2026년 정보처리기사 실기 대비, 회차별 학습 전략
이번 1회차 시험을 분석해보면 몇 가지 출제 경향이 뚜렷하게 드러납니다. 프로그래밍 언어 문제는 단순 문법 암기가 아니라 실행 흐름을 따라가며 출력값을 계산하는 유형이 대부분이었습니다. 특히 Java의 오버라이딩과 오버로딩을 구분하는 문제, Python의 슬라이싱과 얕은 복사 개념은 반복해서 출제되고 있습니다.
SQL 문제는 테이블 조건을 먼저 파악한 뒤 행 수를 계산하는 방식이었습니다. JOIN과 서브쿼리가 결합된 문제에서 당황하지 않으려면, 서브쿼리부터 계산하고 그 결과를 기준으로 메인 쿼리를 해석하는 연습이 필요합니다. 외래키 제약 조건을 작성하는 문제는 CONSTRAINT → FOREIGN KEY → REFERENCES 순서를 암기해두면 빠르게 풀 수 있습니다.
이론 문제에서는 디자인 패턴, DB 설계 절차, 비기능 요구사항, 보안 공격 기법이 주로 출제됐습니다. 이번 회차에는 워터링 홀과 심볼릭링크 공격처럼 비교적 낯선 용어가 나왔는데, 이는 수제비 카페나 정보처리기사 관련 커뮤니티에서 복원된 자료를 통해 꾸준히 접하는 것이 도움이 됩니다.
시험 대비를 위한 학습 순서를 정리하면 다음과 같습니다.
- 프로그래밍 언어 문제는 직접 코드를 손으로 따라 써보며 실행 결과를 예측하는 연습을 하세요. 특히 배열, 포인터, 상속, 슬라이싱 개념은 매회 출제됩니다.
- SQL은 SELECT, DISTINCT, COUNT, JOIN, 서브쿼리, 외래키 구문을 순서대로 암기하고, 테이블 조건이 바뀌었을 때 행 수가 어떻게 달라지는지 계산하는 훈련이 필요합니다.
- 이론 문제는 디자인 패턴별 특징과 DB 설계 절차를 표로 정리해두면 좋습니다. 보안 용어는 실제 공격 시나리오와 연결해서 이해하면 오래 기억에 남습니다.
기출 복원 문제는 공식 기출문제 원문이 아니라 응시자들의 기억을 바탕으로 재구성된 것이라는 점을 유의하세요. 실제 시험에서는 문장, 코드 변수명, 수치, 보기 순서가 다를 수 있습니다. 따라서 문제 자체를 외우기보다는 각 문제가 묻는 개념을 정확히 이해하는 것이 더 중요합니다.
정보처리기사 실기는 100점 만점에 60점 이상이면 합격입니다. 소프트웨어 설계, 소프트웨어 개발, 데이터베이스 구축, 프로그래밍 언어 활용, 정보시스템 구축 관리 등 5개 과목이 골고루 출제되므로 한 영역에 치우치지 않고 균형 있게 준비하는 것이 합격의 지름길입니다. 특히 프로그래밍 언어와 SQL은 배점이 크기 때문에 이 두 영역에서 최소 70% 이상 정답률을 확보해야 합니다.