Title: 정보처리기사 / 실기 / SAMPLE24
Tags: 정처기실기480 정처기실기480::루트::CORE300 정처기실기480::버전::v2_10_0_RC 정처기실기480::우선순위::A 정처기실기480::패키지::SAMPLE 정처기실기480::유형::실행결과 정처기실기480::난도::2 정처기실기480::난도::1 정처기실기480::노트유형::단방향 정처기실기480::노트유형::양방향 정처기실기480::모듈::C_실행결과 정처기실기480::모듈::Java_실행결과 정처기실기480::모듈::Python_실행결과 정처기실기480::모듈::SQL 정처기실기480::언어::C 정처기실기480::언어::Java 정처기실기480::언어::Python 정처기실기480::난도::3 정처기실기480::논점::예외 정처기실기480::모듈::오개념_교정 정처기실기480::모듈::핵심용어 정처기실기480::언어::SQL 정처기실기480::유형::SQL결과 정처기실기480::유형::SQL연습 정처기실기480::유형::오개념교정

Cluster: 배열·포인터
Title: 후위 증가와 역참조
Language: C
Code: #include <stdio.h>
int main(void) {
int a[] = {2, 4, 6};
int *p = a;
int x = *p++;
printf("%d %d\n", x, *p);
return 0;
}
Question: 정확한 출력은?
Answer: 2 4
Trace: *p++는 *(p++)로 해석된다. 기존 p가 가리키던 2를 x에 넣은 뒤 p가 다음 원소로 이동한다.
Rule: 후위 ++가 단항 *보다 우선순위가 높다.
Trap: (*p)++로 오해해 3 3 또는 3 4를 고르기 쉽다.
Source: 근거 1 · www.open-std.org
Difficulty: 2
Priority: A
Validation: C · 실행/컴파일 검증 완료
Other fields (not shown on cards):
Module: C 실행결과
UnitID: C-PTR-002

Cluster: 문자열
Title: 널 종료가 없는 배열과 strlen
Language: C
Code: #include <stdio.h>
#include <string.h>
int main(void) {
char s[3] = {'A', 'B', 'C'};
printf("%zu\n", strlen(s));
return 0;
}
Question: 이 코드의 출력값을 하나로 확정할 수 있는가?
Answer: 확정할 수 없음 — 미정의 동작
Trace: s 안에는 널 문자가 없다. strlen은 배열 경계 밖까지 널 문자를 찾으며 읽을 수 있어 동작이 정의되지 않는다.
Rule: strlen의 인자는 널 종료된 바이트 문자열이어야 한다.
Trap: 배열 크기 3이므로 strlen도 3이라고 단정하면 안 된다.
Source: 근거 1 · www.open-std.org
Difficulty: 2
Priority: A
Validation: C · GCC C17 독립감사 재검증 완료
Other fields (not shown on cards):
Module: C 실행결과
UnitID: C-STR-009

Cluster: 상속·다형성
Title: 기본 동적 바인딩
Language: Java
Code: class Parent {
String name() { return "P"; }
}
class Child extends Parent {
@Override String name() { return "C"; }
}
public class Main {
public static void main(String[] args) {
Parent x = new Child();
System.out.println(x.name());
}
}
Question: 정확한 출력은?
Answer: C
Trace: 참조 변수의 선언형은 Parent지만 실제 객체는 Child다. 오버라이딩된 인스턴스 메서드는 실제 객체 형식에 따라 선택된다.
Rule: 인스턴스 메서드 오버라이딩은 런타임 동적 바인딩을 사용한다.
Trap: 선언형 Parent만 보고 P라고 답하기 쉽다.
Source: 근거 1 · docs.oracle.com
Difficulty: 1
Priority: A
Validation: Java · 실행/컴파일 검증 완료
Other fields (not shown on cards):
Module: Java 실행결과
UnitID: J-INH-004

Cluster: 예외
Title: finally의 return이 기존 return 대체
Language: Java
Code: public class Main {
static int f() {
try {
return 1;
} finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(f());
}
}
Question: 정확한 출력은?
Answer: 2
Trace: try에서 1을 반환하려 하지만 finally의 return 2가 정상 완료를 가로채 최종 반환값이 2가 된다.
Rule: finally가 갑작스럽게 완료되면 이전의 return 또는 예외를 대체할 수 있다.
Trap: try의 return이 먼저 보이므로 1이라고 답하기 쉽다.
Source: 근거 1 · docs.oracle.com
Priority: A
Validation: Java · 실행/컴파일 검증 완료
Other fields (not shown on cards):
Module: Java 실행결과
UnitID: J-FIN-014

Cluster: 예외
Title: NullPointerException
Language: Java
Code: public class Main {
public static void main(String[] args) {
try {
String s = null;
System.out.println(s.length());
} catch (NullPointerException e) {
System.out.println("NPE");
}
}
}
Question: 정확한 출력은?
Answer: NPE
Trace: null 참조로 인스턴스 메서드 length()를 호출하려 해 NullPointerException이 발생한다.
Rule: null에는 객체가 없으므로 인스턴스 멤버 접근이 불가능하다.
Trap: null 문자열의 길이를 0으로 처리한다고 생각하기 쉽다.
Source: 근거 1 · docs.oracle.com
Difficulty: 1
Priority: A
Validation: Java · 실행/컴파일 검증 완료
Other fields (not shown on cards):
Module: Java 실행결과
UnitID: J-EXC-015

Cluster: 슬라이싱
Title: step 0 예외
Language: Python
Code: a = [1, 2, 3]
try:
print(a[::0])
except ValueError:
print("ValueError")
Question: 정확한 출력은?
Answer: ValueError
Trace: 슬라이스 step은 0일 수 없다. 슬라이스 객체를 적용할 때 ValueError가 발생해 except가 실행된다.
Rule: 슬라이스의 step 0은 방향과 간격을 정의할 수 없어 허용되지 않는다.
Trap: 빈 결과가 나온다고 생각하기 쉽다.
Source: 근거 1 · docs.python.org
Difficulty: 1
Priority: A
Validation: Python · 실행/컴파일 검증 완료
Other fields (not shown on cards):
Module: Python 실행결과
UnitID: P-SLC-001

Cluster: 복사·참조
Title: 중첩 리스트의 얕은 복사
Language: Python
Code: a = [[1, 2], [3, 4]]
b = a[:]
b[0][0] = 9
print(a, b)
Question: 정확한 출력은?
Answer: [[9, 2], [3, 4]] [[9, 2], [3, 4]]
Trace: 바깥 리스트 b는 새 객체지만 내부 리스트들은 a와 공유한다. b[0][0] 변경이 공유된 첫 내부 리스트에 반영된다.
Rule: 얕은 복사는 중첩된 가변 객체까지 복제하지 않는다.
Trap: 슬라이스 복사이므로 모든 단계가 독립적이라고 생각하기 쉽다.
Source: 근거 1 · docs.python.org
Difficulty: 2
Priority: A
Validation: Python · 실행/컴파일 검증 완료
Other fields (not shown on cards):
Module: Python 실행결과
UnitID: P-CPY-005

Cluster: 연산자
Title: 한 식의 unsequenced 증감 판별
Language: C
Code: #include <stdio.h>
int main(void) {
int i = 1;
int y = i++ + ++i;
printf("%d %d\n", i, y);
return 0;
}
Question: 표준 C에서 출력값을 하나로 확정할 수 있는가?
Answer: 아니오 — 미정의 동작
Trace: 한 full expression 안에서 i를 두 번 변경하며 두 변경 사이의 순서가 정해지지 않는다. 표준은 특정 결과를 보장하지 않는다.
Rule: 같은 스칼라 객체의 서로 순서화되지 않은 여러 변경은 미정의 동작이다.
Trap: 왼쪽부터 계산한다고 가정해 특정 숫자를 답으로 고정하면 안 된다.
Source: 근거 1 · www.open-std.org
Difficulty: 3
Priority: A
Validation: C · STANDARD_ONLY 검증
Other fields (not shown on cards):
Module: C 실행결과
UnitID: C-SEQ-018

Cluster: 비트 연산
Title: XOR로 비트 토글
Language: C
Code: #include <stdio.h>
int main(void) {
unsigned x = 0x0Au;
x ^= 0x05u;
printf("%u\n", x);
return 0;
}
Question: 정확한 출력은?
Answer: 15
Trace: 1010₂ XOR 0101₂는 서로 다른 모든 자리에서 1이 되어 1111₂, 즉 15다.
Rule: XOR 마스크의 1인 자리만 기존 비트를 반전한다.
Trap: XOR를 OR처럼 계산하거나 같으면 1이라고 반대로 기억하기 쉽다.
Source: 근거 1 · www.open-std.org
Difficulty: 1
Priority: A
Validation: C · RUNTIME 검증
Other fields (not shown on cards):
Module: C 실행결과
UnitID: C-BIT-023

Cluster: 집계
Title: COUNT(DISTINCT)와 NULL
Dialect: SQLite 3.46
Dataset: 테이블 sales
id | region | amount | note
1 | 서울 | 100 | A
2 | 서울 | NULL | B
3 | 부산 | 200 | NULL
4 | 부산 | 200 | C
5 | 부산 | NULL | NULL
PromptSQL: SELECT COUNT(DISTINCT amount) AS distinct_amounts FROM sales;
Question: 쿼리 결과는?
Answer: distinct_amounts
2
Trace: NULL을 제외한 amount 값은 100, 200, 200이다. 중복을 제거하면 100과 200 두 개다.
Rule: COUNT(DISTINCT expr)는 NULL을 제외하고 서로 다른 값의 개수를 센다.
Trap: NULL을 하나의 값으로 세어 3이라고 답하기 쉽다.
Source: 근거 1 · sqlite.org
근거 2 · sqlite.org
Difficulty: 1
Priority: A
Validation: SQLite 3.46 · SQL_RUN 검증 완료
Other fields (not shown on cards):
Module: SQL
UnitID: S-CNT-004
SetupSQL: DROP TABLE IF EXISTS sales;
CREATE TABLE sales (
id INTEGER PRIMARY KEY,
region TEXT NOT NULL,
amount INTEGER,
note TEXT
);
INSERT INTO sales VALUES
(1, '서울', 100, 'A'),
(2, '서울', NULL, 'B'),
(3, '부산', 200, NULL),
(4, '부산', 200, 'C'),
(5, '부산', NULL, NULL);

Cluster: 서브쿼리
Title: NOT IN과 NULL 함정
Dialect: SQLite 3.46
Dataset: 테이블 customers
cid | name
1 | A
2 | B
3 | C
4 | D
테이블 orders
oid | cid | amount
1 | 1 | 50
2 | 1 | 70
3 | 2 | 30
4 | NULL | 99
5 | 4 | 20
PromptSQL: SELECT name
FROM customers
WHERE cid NOT IN (SELECT cid FROM orders)
ORDER BY cid;
Question: 쿼리 결과는?
Answer: name
결과 행 없음
Trace: 서브쿼리 결과에 NULL이 있다. 어떤 cid가 기존 값과 다르더라도 cid <> NULL이 UNKNOWN이 되어 NOT IN 전체가 TRUE가 되지 않는다.
Rule: NOT IN 서브쿼리에 NULL이 섞이면 예상과 달리 아무 행도 남지 않을 수 있다.
Trap: 주문이 없는 C가 당연히 나온다고 답하기 쉽다.
Source: 근거 1 · sqlite.org
근거 2 · sqlite.org
Difficulty: 3
Priority: A
Validation: SQLite 3.46 · SQL_RUN 검증 완료
Other fields (not shown on cards):
Module: SQL
UnitID: S-SUB-012
SetupSQL: DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS customers;
CREATE TABLE customers (
cid INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE orders (
oid INTEGER PRIMARY KEY,
cid INTEGER,
amount INTEGER NOT NULL
);
INSERT INTO customers VALUES
(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D');
INSERT INTO orders VALUES
(1, 1, 50),
(2, 1, 70),
(3, 2, 30),
(4, NULL, 99),
(5, 4, 20);

Cluster: 조인
Title: WHERE가 외부 조인 결과를 제거하는 경우
Dialect: SQLite 3.46
Dataset: 테이블 departments
dept_id | dept_name
10 | 개발
20 | QA
30 | 인사
테이블 employees
emp_id | emp_name | dept_id | salary
1 | 민수 | 10 | 5000
2 | 지수 | 10 | 4000
3 | 솔 | 20 | 4500
4 | 아라 | NULL | 3800
PromptSQL: SELECT d.dept_name, e.emp_name
FROM departments d
LEFT JOIN employees e ON e.dept_id = d.dept_id
WHERE e.salary >= 4500
ORDER BY d.dept_id, e.emp_id;
Question: 실행 결과는?
Answer: dept_name | emp_name
개발 | 민수
QA | 솔
Trace: LEFT JOIN 뒤 인사 행의 e.salary는 NULL이다. WHERE NULL>=4500은 TRUE가 아니므로 제거된다. 지수도 4000이라 제거된다.
Rule: 외부 조인 후 오른쪽 열 조건을 WHERE에 두면 NULL 보완 행이 탈락해 INNER JOIN처럼 보일 수 있다.
Trap: LEFT JOIN이라는 이유만으로 인사 행이 항상 남는다고 생각하기 쉽다.
Source: 근거 1 · www.sqlite.org
근거 2 · www.sqlite.org
Difficulty: 2
Priority: A
Validation: SQLite 3.46 · QUERY 검증
Other fields (not shown on cards):
Module: SQL
UnitID: S-JOIN-007
SetupSQL: DROP TABLE IF EXISTS employees; DROP TABLE IF EXISTS departments;
CREATE TABLE departments(dept_id INTEGER PRIMARY KEY, dept_name TEXT);
CREATE TABLE employees(emp_id INTEGER PRIMARY KEY, emp_name TEXT, dept_id INTEGER, salary INTEGER);
INSERT INTO departments VALUES (10,'개발'),(20,'QA'),(30,'인사');
INSERT INTO employees VALUES (1,'민수',10,5000),(2,'지수',10,4000),(3,'솔',20,4500),(4,'아라',NULL,3800);

Cluster: DML
Title: ROLLBACK으로 변경 취소
Dialect: SQLite 3.46
Dataset: 테이블 products
id | name | price | stock
1 | A | 100 | 5
2 | B | 200 | 0
3 | C | 300 | 2
PromptSQL: BEGIN;
UPDATE products SET price = 999 WHERE id = 1;
ROLLBACK;
SELECT price FROM products WHERE id = 1;
Question: 네 문장을 순서대로 실행한 결과는?
Answer: price
100
Trace: 트랜잭션 안에서 price가 잠시 999가 되지만 ROLLBACK이 BEGIN 이후 변경을 취소한다. 최종 값은 원래 100이다.
Rule: ROLLBACK은 현재 트랜잭션의 미커밋 변경을 되돌린다.
Trap: UPDATE가 이미 실행됐으므로 999가 영구 저장됐다고 보기 쉽다.
Source: 근거 1 · www.sqlite.org
근거 2 · www.sqlite.org
Difficulty: 2
Priority: A
Validation: SQLite 3.46 · SCRIPT_QUERY 검증
Other fields (not shown on cards):
Module: SQL
UnitID: S-DML-020
SetupSQL: DROP TABLE IF EXISTS products;
CREATE TABLE products(id INTEGER PRIMARY KEY, name TEXT, price INTEGER, stock INTEGER);
INSERT INTO products VALUES (1,'A',100,5),(2,'B',200,0),(3,'C',300,2);

Cluster: 요구사항
Title: 기능 요구사항 vs 비기능 요구사항
StatementA: 기능 요구사항은 시스템의 응답시간, 처리량, 가용성처럼 품질 수준을 규정한다.
AnswerA: X
CorrectionA: 응답시간·처리량·가용성 같은 품질 속성은 비기능 요구사항이다. 기능 요구사항은 시스템이 제공해야 할 기능과 동작을 규정한다.
StatementB: 비기능 요구사항은 성능, 보안, 신뢰성, 사용성처럼 기능이 수행되는 조건이나 품질 수준을 다룬다.
AnswerB: O
CorrectionB: 옳다. 비기능 요구사항은 기능 자체보다 제약조건과 품질 속성을 중심으로 서술한다.
CoreDifference: 기능 요구사항은 무엇을 수행하는지, 비기능 요구사항은 어느 수준·조건으로 수행하는지를 묻는다.
Source: 직접 근거 1 · cpre.ireb.org
범위 근거 · q-net.or.kr
Difficulty: 1
Priority: A
Other fields (not shown on cards):
Module: 오개념 교정
UnitID: W-REQ-001

Cluster: 인터페이스
Title: 서로 무관한 default 충돌
Language: Java
Code: interface A {
default void run() { }
}
interface B {
default void run() { }
}
class C implements A, B { }
public class Main { }
Question: 이 코드는 정상 컴파일되는가?
Answer: 아니오 — A와 B의 같은 시그니처 default 중 하나를 자동 선택할 수 없다
Trace: C는 run을 직접 오버라이딩해 충돌을 해소해야 한다. 두 인터페이스가 상속 관계가 아니라 어느 구현이 더 구체적인지 정할 수 없다.
Rule: 무관한 인터페이스의 default 충돌은 구현 클래스에서 명시적으로 해결한다.
Trap: 먼저 implements에 적힌 A가 자동 선택된다고 보기 쉽다.
Source: 근거 1 · docs.oracle.com
근거 2 · docs.oracle.com
Difficulty: 2
Priority: A
Validation: Java · COMPILE_EXPECT_FAIL 검증
Other fields (not shown on cards):
Module: Java 실행결과
UnitID: J-IFC-011

Cluster: 딕셔너리 메서드
Title: setdefault의 삽입
Language: Python
Code: d={'a':1}
print(d.setdefault('b',2),len(d))
Question: 정확한 출력은?
Answer: 2 2
Trace: b가 없어 값 2를 저장하고 반환한다.
Rule: setdefault는 키가 없을 때 기본값을 실제로 삽입한다.
Trap: get과 같아 길이 1이라고 보기 쉽다.
Source: 근거 · docs.python.org
Difficulty: 1
Priority: A
Validation: Python · RUNTIME 검증
Other fields (not shown on cards):
Module: Python 실행결과
UnitID: P-DMD-027

Cluster: 예외 처리
Title: else와 finally 실행 순서
Language: Python
Code: try:
x=3
except ValueError:
print('E')
else:
print('O')
finally:
print('F')
Question: 정확한 출력은?
Answer: O
F
Trace: 예외가 없어 else가 실행되고 마지막에 finally가 실행된다.
Rule: try가 정상 완료되면 else, 어떤 경우에도 finally가 실행된다.
Trap: finally가 먼저라고 보기 쉽다.
Source: 근거 · docs.python.org
Difficulty: 2
Priority: A
Validation: Python · RUNTIME 검증
Other fields (not shown on cards):
Module: Python 실행결과
UnitID: P-EXC-028

Cluster: 트랜잭션 격리
Title: Non-repeatable Read와 Phantom Read
StatementA: Phantom Read는 같은 조건을 다시 조회할 때 삽입·삭제로 행 집합이 달라지는 현상이다.
AnswerA: O
CorrectionA: 첫 조회에 없던 행이 두 번째 범위 조회에 나타날 수 있다.
StatementB: Non-repeatable Read와 Phantom Read는 반드시 미커밋 데이터를 읽어야 발생한다.
AnswerB: X
CorrectionB: 다른 트랜잭션이 커밋한 변경으로도 발생하며 미커밋 값 읽기는 Dirty Read다.
CoreDifference: Non-repeatable은 기존 행 값 변화, Phantom은 조건에 맞는 행 집합 변화다.
Source: 근거 · www.postgresql.org
Difficulty: 3
Priority: A
Other fields (not shown on cards):
Module: 오개념 교정
UnitID: W-R4-DB-009

Cluster: 데이터베이스
TermKR: 트랜잭션
Definition: 데이터베이스의 상태를 하나의 일관된 상태에서 다른 일관된 상태로 바꾸기 위해 논리적으로 묶은 작업 단위이다.
Keywords: 논리적 작업 단위·상태 변화·ACID
Confusable: 세션
Difference: 트랜잭션은 원자적으로 완료·취소할 작업 경계이고, 세션은 클라이언트가 DBMS와 연결되어 상호작용하는 더 긴 접속 문맥이다.
Example: 계좌 A 차감과 계좌 B 입금을 하나의 트랜잭션으로 처리한다.
Source: 근거 1 · www.q-net.or.kr
Difficulty: 1
Other fields (not shown on cards):
Module: 핵심용어
UnitID: K-DB-025
TermEN: Transaction
Priority: A

Cluster: 접근 권한 위임
TermKR: OAuth
TermSub: OAuth 2.0 · 권한 위임
Definition: 자원 소유자가 비밀번호를 제3자 애플리케이션에 직접 넘기지 않고 제한된 자원 접근 권한을 액세스 토큰으로 위임하는 권한 부여 프레임워크이다.
Keywords: 권한 위임·액세스 토큰·제3자 애플리케이션
Confusable: OpenID Connect
Difference: OAuth는 API 접근 권한 위임을 중심으로 하고, OpenID Connect는 OAuth 위에 사용자 인증·신원 정보를 위한 계층을 추가한다.
Example: 사진 서비스가 일정 기간 동안 클라우드 저장소의 특정 폴더 읽기 권한만 받는다.
Source: 근거 1 · www.rfc-editor.org
Difficulty: 2
Other fields (not shown on cards):
Module: 핵심용어
UnitID: K-SEC-049
Title: OAuth 2.0 권한 위임
TermEN: OAuth 2.0
Priority: A