2025년 3회 실전 E27

보안 3 · SQL 2 · DB 2 로 용어가 무겁고, COUNT(COL2) 의 NULL, CROSS JOIN LIKE, R ÷ S 가 SQL·DB 4문항을 채운다

왜 이 장을 하나
2025년 3회는 SQL·DB 4문항이 전부 결과를 세는 문제다. 11번 CROSS JOIN 뒤 LIKE 로 남는 행, 12번 COUNT(COL2) 가 NULL 을 안 세는 것, 16번 나눗셈 연산. 코드 8문항 중 13 · 14번은 키워드(implements · super) 하나를 적는 쉬운 10점이라 여기서 잃으면 안 된다.
다루는 것2025년 3회 20문항 · 복원본
시계150분 · 실제 시험과 같다
끝나면문항마다 가는 장이 표로 나온다

01푸는 법

왜 이걸 하나 — 세트는 시험장과 같은 조건에서만 숫자가 된다. 조건은 E01 과 같다.

규칙은 E01 진단의 01절 그대로다. 시작을 누르면 150분이 돌고, 1회독 100분 · 2회독 40분 · 검토 10분으로 나눈다. 한 문항에 5분이 넘으면 답 칸을 비우고 넘어가며, 정답은 20문항을 다 적은 뒤에 연다.

이 회차의 배점은 프로그래밍 8문항(40점) · SQL·DB 4문항(20점) · 보안 3문항(15점) · SW공학 3문항(15점) · 네트워크 1문항(5점) · 리눅스 1문항(5점)이다. 코드 문항 수만큼 5분씩을 1회독에서 먼저 떼어 두고, 남는 시간을 용어에 쓴다. 용어는 아는 것을 바로 적고 모르는 것은 비운다 — 용어에서 고민하는 시간이 코드 한 문항의 값이다.

자가 판정은 답안지에 그대로 적었을 때 채점자가 맞다고 할 것인가 하나다. 철자 하나, 줄바꿈 하나, 기호 대신 이름이면 틀렸다를 누른다. 후하게 준 5점은 시험장에서 사라진다.

02실전 세트

왜 이걸 하나 — 20문항을 한 번에 150분 안에 푸는 것 자체가 연습이다. 분야 장의 문제와 같은 문항이어도 조건이 다르다.

시작을 누르면 시계가 돌고 화면을 닫아도 이어진다. 다 적은 뒤 문항마다 정답 보기 → 맞았다 · 틀렸다를 누르면 위 막대에 점수와 분야별 결과가 모인다. 이 세트에서 채점한 기록은 분야 장의 같은 문항에도 그대로 보인다.

2025-3회 · 1번UML

모델 요소들을 관련된 것끼리 그룹화하여 표현하는 UML 다이어그램은?

정답패키지 다이어그램

— 패키지 다이어그램(Package Diagram). 2023-3-06 과 같은 문제다 — 관련 요소를 묶고 묶음 사이 의존을 그린다.

원리 — UML 구조 다이어그램에는 클래스 · 객체 · 컴포넌트 · 배치 · 패키지 · 복합 구조 다이어그램이 있고, 그중 "요소를 그룹화"하는 것이 패키지다. 패키지는 폴더 모양 기호로 그리고, 안에 클래스 · 유스케이스 · 하위 패키지를 담는다. 패키지 사이에는 점선 화살표로 의존(import · access)을 표시한다. 큰 시스템을 층(화면 · 서비스 · 저장)이나 기능(주문 · 결제 · 회원)으로 나눠 "어느 묶음이 어느 묶음을 쓰는가"를 한눈에 보는 용도다.

따라가기

  1. "모델 요소들을 관련된 것끼리 그룹화" → 묶음
  2. 묶음을 그리는 UML 구조 다이어그램 → 패키지 다이어그램

헷갈리는 자리 — 클래스 다이어그램을 적는 것. 클래스 다이어그램은 낱개 클래스와 그 관계, 패키지 다이어그램은 묶음과 묶음의 관계다. 같은 문제가 두 번 나왔으니 "그룹화 = 패키지"로 굳혀 둔다.

표준 · 교재 정의(결합도 6단계 · 응집도 7단계 · UML 2.x 다이어그램 분류)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 2번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> struct Item { int offset; const char *text; }; int main(void) { struct Item items[] = { {1, "AB"}, {2, "DC"}, {3, "EB"} }; struct Item *p = &items[1]; printf("%s", p->text + (p->offset - 1)); return 0; }
정답C

— C. p 는 둘째 원소 {2, "DC"} 를 가리키고, "DC" 의 주소에서 한 칸 옆부터 끝까지 찍으면 C 다.

원리 — 구조체 배열의 원소 하나는 offset 과 text 두 칸을 가진 묶음이다. &items[1] 은 둘째 묶음의 주소이고, p->text 는 그 묶음 안의 text, 즉 문자열 "DC" 의 첫 글자 주소다. 문자열 주소에 수를 더하면 그만큼 옆 글자부터 시작하는 문자열이 된다. %s 는 시작 주소부터 끝표 전까지 찍으므로 "DC" + 1 은 "C" 다. 화살표 -> 는 "포인터가 가리키는 구조체의 그 칸"이라는 뜻으로 (*p).text 와 같다.

따라가기

  1. items[0] = {1, "AB"}, items[1] = {2, "DC"}, items[2] = {3, "EB"}
  2. p = &items[1] → p->offset = 2, p->text = "DC"
  3. p->offset − 1 = 1 → p->text + 1 = 'C' 의 주소
  4. %s → 거기서 끝표까지 → C

헷갈리는 자리 — items[1] 을 "1번째"로 읽어 첫 묶음 {1, "AB"} 로 보는 것(첨자는 0 부터). 그리고 %c 가 아니라 %s 라 글자 하나가 아니라 그 자리부터 끝까지인데, 여기선 남은 글자가 C 하나라 결과가 같아 보일 뿐이다.

복원 코드를 gcc(도커 alpine)로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2025-3회 · 3번리눅스

UNIX/Linux 명령어: ① 현재 작업 경로 표시 ② 파일 목록 보기 ③ 디렉터리 이동 ④ 파일 복사

정답① pwd ② ls ③ cd ④ cp

— ① pwd ② ls ③ cd ④ cp. 리눅스 기본 명령 네 개의 영문 약자를 풀면 답이 보인다.

원리 — 유닉스 명령은 대부분 영어 낱말의 약자다. pwd = print working directory, 지금 내가 있는 경로를 찍는다. ls = list, 현재 디렉터리의 파일 목록을 보여 준다(-l 자세히, -a 숨김 파일까지). cd = change directory, 다른 디렉터리로 옮긴다(cd .. 은 상위). cp = copy, 파일을 복사한다(cp 원본 사본, -r 로 디렉터리째). 짝으로 mv(move, 이동 · 이름 바꾸기) · rm(remove, 삭제) · mkdir(make directory) · cat(내용 출력) · chmod · chown 도 같이 나온다.

따라가기

  1. "현재 작업 경로 표시" → print working directory → pwd
  2. "파일 목록 보기" → list → ls
  3. "디렉터리 이동" → change directory → cd
  4. "파일 복사" → copy → cp

헷갈리는 자리 — cp 와 mv 를 바꾸는 것. cp 는 원본을 남기고 사본을 만들고, mv 는 원본을 옮긴다(이름 바꾸기도 mv). 그리고 윈도우 명령 dir · copy 를 적는 실수 — 문제는 UNIX/Linux 다.

표준 · 교재 정의(운영체제 · 리눅스 명령 · 웹 · 클라우드 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 4번테스트

결정 포인트 내 개별 조건식이 참/거짓을 한 번씩 갖도록 하는 화이트박스 커버리지는?

정답조건 커버리지

— 조건 커버리지. 2023-2-06 과 같은 정의다 — 결정 안의 개별 조건식이 참 · 거짓을 한 번씩.

원리 — 결정문 if (A || B) 에서 "결정"은 A || B 의 값, "조건"은 A 와 B 각각이다. 조건 커버리지는 A 가 T 와 F 를, B 가 T 와 F 를 각각 한 번은 갖도록 케이스를 짠다. 예를 들어 (A=T, B=F) 와 (A=F, B=T) 두 케이스면 A 도 B 도 T/F 를 다 가졌으니 만족한다 — 그런데 이때 결정 A || B 는 둘 다 T 라 결정 커버리지는 미달이다. 조건 커버리지는 "낱개 조건"을 보는 자이지 "갈래"를 보는 자가 아니라는 것이 핵심이다.

따라가기

  1. "결정 포인트 내 개별 조건식" → 낱개 조건
  2. "참/거짓을 한 번씩" → 조건 커버리지

헷갈리는 자리 — 결정(분기) 커버리지로 적는 것. 두 번 출제된 만큼 "개별 조건식 = 조건 커버리지"를 반사적으로 잇는다. 그리고 "조건/결정 커버리지"는 둘을 동시에 만족하는 것이라 문제에 "결정 결과도"라는 말이 붙을 때만 답이다.

표준 · 교재 정의(ISTQB 용어 · 커버리지 6단계 · 테스트 수준)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 5번Java

다음 Java 프로그램의 실행 결과를 쓰시오.

enum Word { A("A"), B("AB"), C("ABC"); private final String text; Word(String text) { this.text = text; } public String getText() { return text; } } public class Main { public static void main(String[] args) { Word w = Word.values()[Word.B.name().length()]; System.out.print(w.getText()); } }
정답AB

— AB. Word.B.name() 은 "B" 라 길이 1 이고, values()[1] 은 둘째 상수 B 라 그 text "AB" 가 나온다.

원리 — enum 은 정해진 상수들의 목록이고, 각 상수는 생성자를 통해 자기 값(text)을 가진다. name() 은 상수의 이름 자체("B")를 문자열로 돌려주고, getText() 는 우리가 넣은 값("AB")을 돌려준다 — 둘은 다르다. values() 는 상수를 선언 순서대로 담은 배열이라 [0] A, [1] B, [2] C 다. 그러니 values()[Word.B.name().length()] 는 values()[1] = B 이고, 그 text 가 답이다.

따라가기

  1. Word.B.name() → "B", length() → 1
  2. values()[1] → B
  3. B.getText() → AB

헷갈리는 자리 — name() 을 text("AB")로 읽어 길이 2 → values()[2] = C → "ABC" 를 적는 것. name 은 상수 이름이다. 첨자가 0 부터라는 것을 잊고 values()[1] 을 A 로 보는 것도 있다.

복원 코드를 JDK 17 로 컴파일 · 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2025-3회 · 6번네트워크

오류 제어 매칭: ① 검출+수정 코드 ② 수신 측 자가 수정 방식 ③ 재전송 요청 방식 ④ 홀짝 1비트 검사 ⑤ 다항식 기반 검출

정답① Hamming ② FEC ③ BEC ④ Parity ⑤ CRC

— ① Hamming ② FEC ③ BEC ④ Parity ⑤ CRC. 2023년 2회 20번과 같은 다섯 낱말을 영문으로 적는다.

원리 — 오류 제어는 두 갈래다. 수신 측이 스스로 고치는 FEC(Forward Error Correction)와 재전송을 요구하는 BEC(Backward Error Correction, ARQ). FEC 의 대표 해밍(Hamming) 코드는 여분 비트로 1비트 오류의 위치를 찾아 고친다. 검출만 하는 것으로 패리티(Parity, 홀짝 1비트)와 CRC(다항식 나눗셈)가 있다. 낱말이 같은 문제라 영문 철자만 더 챙기면 된다.

따라가기

  1. 검출 + 수정 코드 → Hamming
  2. 자가 수정 → FEC, 재전송 → BEC
  3. 홀짝 1비트 → Parity, 다항식 → CRC

헷갈리는 자리 — Hamming 의 m 두 개, Parity 의 철자. BEC 대신 ARQ 라고 적으면 뜻은 맞지만 문제가 "재전송 요청 방식"의 이름을 BEC 로 두었으니 보기에 맞춘다.

표준 · 교재 정의(OSI · TCP/IP · IEEE · RFC 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 7번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int main(void) { char word[] = "REPUBLICOFKOREA"; int n = 0; while (word[n] != '\0') ++n; putchar(word[n - 2]); return 0; }
정답E

— E. 글자 수를 센 뒤 끝에서 둘째 글자를 찍는다.

원리 — while 문은 끝표('\0')를 만날 때까지 n 을 하나씩 올리므로, 끝나면 n 은 글자 수다. "REPUBLICOFKOREA" 는 15글자라 n = 15. 첨자는 0 부터라 마지막 글자는 word[n - 1], 그 앞 글자는 word[n - 2] 다. strlen 을 직접 만든 것이라고 보면 된다. ++nn++ 는 여기서 값을 쓰지 않으니 결과가 같다.

따라가기

  1. R E P U B L I C O F K O R E A → 15글자, n = 15
  2. word[14] = A(마지막), word[13] = E

헷갈리는 자리 — n − 2 를 "끝에서 두 번째"가 아니라 "13번째 글자"로 세다가 하나 어긋나는 것. 첨자와 순번은 1 차이다. 글자 수를 세다 하나 빠뜨리면 R 이 나온다 — REPUBLIC(8) + OF(2) + KOREA(5) = 15 로 묶어 센다. 반복이 끝난 순간 word[n] 은 끝표이므로 n 자체는 글자가 아니라는 것도 같은 함정이다.

복원 코드를 gcc(도커 alpine)로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2025-3회 · 8번보안

인터넷 뱅킹 등에서 매번 새로 생성되는 일회용 비밀번호 인증 방식은? (영문 약자)

정답OTP

— OTP. 쓸 때마다 새로 만들어져 한 번만 쓰이는 비밀번호다.

원리 — 고정 비밀번호는 한 번 새면 계속 쓰인다. OTP(One-Time Password)는 시간(30초마다 바뀜)이나 횟수(누를 때마다)에 따라 기기와 서버가 같은 규칙으로 새 번호를 만들어, 훔쳐 봐도 다음엔 쓸 수 없다. 인터넷 뱅킹의 OTP 기기, 앱의 6자리 코드(Google Authenticator), 문자 인증 번호가 다 이것이다. 인증 요소로는 "가진 것"(소유 기반)에 속한다.

따라가기

  1. 매번 새로 생성 · 일회용 비밀번호 → OTP

헷갈리는 자리 — PIN(고정 번호)이나 2FA(방식이 아니라 요소가 둘이라는 뜻)와 섞는 것. "일회용"이면 OTP 다. 영문 약자 세 글자를 답한다. 시간 동기(TOTP)와 이벤트 동기(HOTP) 두 방식이 있다는 것까지 알아 두면 서술형에도 대응된다.

표준 · 교재 정의(암호 · 인증 · 접근 통제 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 9번보안

비밀번호를 제공하지 않고 제3자 애플리케이션에 접근 권한을 위임하는 개방형 표준 프로토콜은?

정답OAuth

— OAuth. 비밀번호 대신 권한 토큰을 넘기는 개방형 인가 표준으로, 2023년 3회 2번과 같은 문제다.

원리 — 제3자 앱이 내 계정의 자료를 쓰려 할 때 비밀번호를 주는 대신, 원래 서비스(구글 · 카카오)에 로그인해 "이 앱에 이만큼 허용"을 누르면 서비스가 앱에 제한된 접근 토큰을 준다. 앱은 비밀번호를 모르고 토큰은 범위 · 기간이 정해지며 언제든 취소된다. 이 흐름의 표준이 OAuth(현재 2.0)다. 인증(누구인가)이 아니라 인가(무엇을 허용하나)를 다룬다.

따라가기

  1. 비밀번호 제공 없이 + 권한 위임 + 개방형 표준 → OAuth

헷갈리는 자리 — SAML · OpenID Connect(인증 쪽 표준)와 섞는 것. "권한 위임"이 OAuth 의 표지이고, 같은 문제가 두 회차에 나왔다.

표준 · 교재 정의(암호 · 인증 · 접근 통제 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 10번보안

접근 통제 정책 3종을 쓰시오: 강제적 / 역할 기반 / 임의적 (영문 약자)

정답MAC, RBAC, DAC

— MAC, RBAC, DAC. 강제적 · 역할 기반 · 임의적 접근 통제의 영문 약자다.

원리 — 접근 통제 정책은 규칙을 누가 정하나로 갈린다. 강제적(MAC, Mandatory)은 시스템이 보안 등급으로 강제, 임의적(DAC, Discretionary)은 소유자가 마음대로, 역할 기반(RBAC, Role-Based)은 역할에 권한을 붙인다. 2023년 3회 13번이 설명 → 약자였다면 이 문제는 우리말 이름 → 약자다. 약자의 첫 글자(M 강제, D 임의, R 역할)가 우리말과 짝이다.

따라가기

  1. 강제적 → MAC
  2. 역할 기반 → RBAC
  3. 임의적 → DAC

헷갈리는 자리 — 순서를 문제가 준 대로(강제 · 역할 · 임의) 적어야 한다. RBAC 의 B 를 빼고 RAC 로 적거나 MAC 의 뜻을 Media Access Control 로 적는 것도 오답이다.

표준 · 교재 정의(암호 · 인증 · 접근 통제 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 11번SQL

다음 A, B 테이블과 SQL문을 보고 출력되는 행의 수를 쓰시오.

A 테이블

NAME
Smith
Allen
Scott

B 테이블

RULE
S%
%T%
SELECT COUNT(*) AS CNT FROM A CROSS JOIN B WHERE A.NAME LIKE B.RULE;
정답4

— 4. 이름 셋 × 규칙 둘 = 여섯 짝 중 LIKE 가 맞는 짝은 Smith 둘, Scott 둘이다.

원리CROSS JOIN 은 두 테이블의 모든 짝을 만든다(3 × 2 = 6 행). LIKE 는 무늬 맞추기로, % 는 "아무 글자 0개 이상"이다. 'S%' 는 S 로 시작, '%T%' 는 어디든 T 가 들어 있음이다. 이 문제의 정답 4 는 대소문자를 구분하지 않는 채점(Smith 의 t · Scott 의 tt 가 T 에 맞음)을 전제로 한다 — MySQL · SQL Server 의 기본이 그렇다.

따라가기

  1. Smith: S% 맞음, %T% 맞음(t) → 2
  2. Allen: S% 아님, %T% 아님 → 0
  3. Scott: S% 맞음, %T% 맞음(tt) → 2
  4. 4

헷갈리는 자리 — 대소문자를 구분하면(PostgreSQL · sqlite 기본) %T% 가 하나도 안 맞아 2 가 된다. 시험은 보통 구분하지 않는 쪽으로 낸다는 것을 알고 4 로 적되, 문제에 "대소문자 구분" 문구가 있으면 그것을 따른다. CROSS JOIN 의 행 수 6 을 그대로 적는 것도 오답이다.

표를 sqlite 3.49 에 넣고 같은 SQL 을 실행해 결과를 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2025-3회 · 12번SQL

다음 SQL문의 실행 결과를 쓰시오. 테이블 A의 데이터가 다음과 같을 때 조회 결과를 구하시오.

A

COL1COL2
2NULL
36
23
NULL3
45
SELECT COUNT(COL2) FROM A WHERE COL1 IN (2, 3) OR COL2 IN (3, 5);
정답4

— 4. WHERE 로 다섯 행이 다 걸리지만 COUNT(COL2) 는 NULL 을 세지 않아 4 다.

원리COUNT(*) 는 행 수를 세고, COUNT(열) 은 그 열이 NULL 이 아닌 행만 센다. NULL 은 "값 없음"이라 개수에 안 들어간다. WHERE 는 COL1 IN (2, 3) 또는 COL2 IN (3, 5) 인 행을 남기는데, NULL 은 어느 IN 에도 맞지 않지만 다른 쪽 조건으로 걸릴 수 있다. 행마다 두 조건을 따로 보고 하나라도 참이면 남긴다.

따라가기

  1. (2, NULL): COL1 2 → 남음. COL2 NULL → 안 셈
  2. (3, 6): COL1 3 → 남음, 셈
  3. (2, 3): 남음, 셈
  4. (NULL, 3): COL2 3 → 남음, 셈
  5. (4, 5): COL2 5 → 남음, 셈 → COUNT(COL2) = 4

헷갈리는 자리 — COUNT(*) 로 읽어 5 를 적는 것. 괄호 안이 열 이름이면 NULL 을 뺀다. (NULL, 3) 행을 "NULL 이 있으니 제외"로 보는 것 — COL2 = 3 으로 걸린다. NULL 규칙은 두 방향(조건에서는 거짓, 개수에서는 제외) 모두 본다.

표를 sqlite 3.49 에 넣고 같은 SQL 을 실행해 결과를 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2025-3회 · 13번Java

다음 Java 프로그램의 빈칸에 들어갈 키워드를 쓰시오.

interface Machine { void run(); } class Washer ① Machine { public void run() { System.out.print("RUN"); } }
정답implements

implements. 클래스가 인터페이스를 따를 때 쓰는 예약어다.

원리 — 인터페이스는 "이런 메서드를 반드시 갖춰라"는 약속 목록이다. 클래스가 그 약속을 지키겠다고 선언하는 말이 implements(구현하다)이고, 그 클래스는 목록의 메서드를 전부 몸통과 함께 만들어야 한다. 반면 클래스가 다른 클래스를 물려받을 때는 extends(확장하다)를 쓴다. 인터페이스가 다른 인터페이스를 물려받을 때도 extends 다. Machine 이 interface 로 선언됐으니 Washer 쪽은 implements 다.

따라가기

  1. Machine 은 interface → 약속 run() 하나
  2. Washer 는 class → 약속을 지키는 쪽 → implements Machine
  3. run() 을 public 으로 구현했으므로 컴파일된다

헷갈리는 자리 — extends 를 적는 것. 클래스 → 인터페이스는 implements, 클래스 → 클래스와 인터페이스 → 인터페이스는 extends 로 짝을 외운다. 인터페이스 메서드는 기본이 public 이라 구현할 때 public 을 빼면 오류가 나는 것도 같은 묶음의 함정이다.

빈칸에 답을 넣어 JDK 17 로 컴파일해 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2025-3회 · 14번Java

다음 Java 코드의 ①에 들어갈 예약어를 쓰시오.

class Rectangle { int width; int height; Rectangle(int width, int height) { this.width = width; this.height = height; } } class Square extends Rectangle { Square(int side) { ①(side, side); } int area() { return width * height; } }
정답super

super. 자식 생성자에서 부모 생성자를 부를 때 쓰는 예약어다.

원리 — Rectangle 에는 인자 없는 생성자가 없고 (width, height) 를 받는 생성자만 있다. 자식 Square 를 만들려면 부모 부분도 만들어져야 하는데, 자바는 부모의 인자 없는 생성자를 몰래 부르므로 그런 생성자가 없으면 컴파일 오류가 난다. 그래서 자식 생성자 첫 줄에 super(side, side) 로 "부모의 저 생성자를 이 값으로 불러라"고 직접 적어야 한다. 정사각형은 가로와 세로가 같으니 side 를 두 번 넘긴다. super(...) 는 반드시 첫 줄이어야 한다.

따라가기

  1. new Square(5) → Square(int side) → super(5, 5) → Rectangle(5, 5)
  2. width = 5, height = 5 → area() = 25

헷갈리는 자리this(side, side) 를 적는 것. this(…) 는 같은 클래스의 다른 생성자를 부르는 것인데 Square 에는 두 인자 생성자가 없다. Rectangle(side, side) 처럼 클래스 이름을 적는 것도 오류다 — 생성자 호출은 super 나 this 뿐이다.

빈칸에 답을 넣어 JDK 17 로 컴파일해 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2025-3회 · 15번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int main(void) { int x = 7, y = 4, z; z = y % 3 < 3 ? 2 : 1; z = z & z >> 1; z = x > 5 && z <= 3 ? z * x : z / x; printf("%d", z); return 0; }
정답0

— 0. 둘째 줄에서 z & z >> 1 이 2 & 1 = 0 이 되고, 그 뒤로는 0 에 무엇을 곱해도 0 이다.

원리 — 한 줄에 연산자가 여럿이면 우선순위가 계산 순서를 정한다. 산술(%) → 시프트(>>) → 비교(<, >) → 비트 AND(&) → 논리 AND(&&) → 삼항(?:) 순이다. 둘째 줄 z & z >> 1 은 시프트가 먼저라 z & (z >> 1) 이다. 셋째 줄은 && 가 삼항보다 먼저 묶여 (x > 5 && z <= 3) ? z * x : z / x 로 읽는다.

따라가기 — x = 7, y = 4.

  1. z = (4 % 3 < 3) ? 2 : 1 → 1 < 3 참 → z = 2
  2. z = 2 & (2 >> 1) = 2 & 1 = 10 & 01 = 0
  3. 조건 7 > 5 참, 0 ≤ 3 참 → z * x = 0 × 7 = 0

헷갈리는 자리 — 둘째 줄을 (z & z) >> 1 로 읽어 1 을 얻는 것. 비트 AND 는 시프트보다 나중이다. 셋째 줄에서 조건이 거짓이라고 보고 z / x 로 가도 0 / 7 = 0 이라 답은 같지만, 이유가 다르면 다음 문제에서 틀린다.

복원 코드를 gcc(도커 alpine)로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2025-3회 · 16번DB

다음 관계대수 연산의 결과 릴레이션을 테이블 형태로 쓰시오. 관계 R과 S가 다음과 같을 때 R ÷ S의 결과를 구하시오.

R

AB
a1b1
a1b2
a2b1

S

B
b1
b2
R ÷ S
정답A
a1

— 열 A 하나에 a1 한 행. S 의 모든 값(b1 · b2)과 짝지어진 A 값은 a1 뿐이다.

원리 — 나눗셈 R ÷ S 는 "S 에 있는 모든 값을 전부 가진 것"을 R 에서 찾는 연산이다. R 의 A 값마다 짝지어진 B 값의 집합을 만들고, 그 집합이 S 의 B 값 전체 {b1, b2} 를 포함하면 남긴다. 결과 열은 R 의 열에서 S 의 열을 뺀 것(A)이다. "모든 과목을 수강한 학생" 같은 질문이 나눗셈이다.

따라가기

  1. a1 → {b1, b2} ⊇ {b1, b2} → 남김
  2. a2 → {b1} — b2 가 없음 → 탈락
  3. 결과 A: a1

헷갈리는 자리 — b1 이 있다고 a2 도 넣는 것. "하나라도"가 아니라 "전부"다. 결과 열에 B 를 남기는 것 — 나누는 쪽의 열은 사라진다. 표 꼴로 답하라고 했으니 열 이름 A 를 머리에 적고 그 아래 a1 한 행을 적는다.

표를 놓고 연산 규칙대로 손으로 계산했고 sqlite 3.49 로 같은 결과를 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2025-3회 · 17번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> struct Node { struct Node *next; unsigned int value; }; int main(void) { struct Node n1 = { 0, 5u }; struct Node n2 = { 0, 7u }; struct Node n3 = { 0, 11u }; n3.next = &n2; n2.next = &n1; struct Node *cur = &n3; unsigned int sum = 0; while (cur) { sum = sum * 3 + cur->value; cur = cur->next; } sum = (sum ^ 42u) + 100u; printf("%u", sum); return 0; }
정답187

— 187. 리스트를 11 → 7 → 5 순서로 돌며 sum = sum × 3 + 값 으로 125 를 만들고, 42 와 XOR 한 87 에 100 을 더한다.

원리sum = sum * 3 + value 는 "지금까지의 결과를 3배 하고 새 값을 더한다"로, 값을 3진수 자릿수처럼 쌓는 식이다. 사슬은 n3 → n2 → n1(next 대입 두 줄)이라 값 순서는 11 · 7 · 5 다. XOR(^)는 두 수를 2진수로 놓고 자리가 다르면 1, 같으면 0 이다. unsigned 는 음수를 안 쓰는 정수라는 뜻일 뿐 여기선 값에 영향이 없고, %u 로 그대로 찍는다.

따라가기

  1. cur = n3(11): sum = 0 × 3 + 11 = 11
  2. cur = n2(7): sum = 11 × 3 + 7 = 40
  3. cur = n1(5): sum = 40 × 3 + 5 = 125, next 가 0 → 끝
  4. 125 ^ 42: 0111 1101 ^ 0010 1010 = 0101 0111 = 87
  5. 87 + 100 = 187

헷갈리는 자리 — 사슬을 n1 → n2 → n3(5 · 7 · 11)로 돌려 sum 을 5 → 22 → 77 로 만드는 것. cur 의 시작이 n3 이고 n3.next = n2, n2.next = n1 이다. XOR 를 OR(127)나 AND(40)로 계산하는 것도 흔하다 — "다르면 1"이다.

복원 코드를 gcc(도커 alpine)로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2025-3회 · 18번DB

관계형 DB 용어: ① 행에 해당 ② 실제 값들의 집합 ③ 튜플의 개수

정답① 튜플 ② 릴레이션 인스턴스 ③ 카디널리티

— ① 튜플 ② 릴레이션 인스턴스 ③ 카디널리티. 2023년 1회 12번과 같은 용어 문제다.

원리 — 관계형 모델은 표 = 릴레이션, 열 = 속성, 행 = 튜플로 부른다. 표의 틀(열 이름 · 자료형)은 릴레이션 스키마, 그 틀에 지금 들어 있는 행들의 집합은 릴레이션 인스턴스다. 행의 수는 카디널리티, 열의 수는 차수다. 같은 문제가 두 회차에 나온 것은 이 용어 묶음이 얼마나 자주 나오는지 말해 준다.

따라가기

  1. 행에 해당 → 튜플
  2. 실제 값들의 집합 → 릴레이션 인스턴스
  3. 튜플의 개수 → 카디널리티

헷갈리는 자리 — ② 에 스키마 · 릴레이션만 적는 것. "실제 값"이면 인스턴스까지 적어야 한다. ③ 을 차수(degree)로 적는 것 — 차수는 열 수다. 같은 문제가 2년 뒤에 그대로 나온 만큼, 튜플 · 속성 · 릴레이션 스키마 · 인스턴스 · 카디널리티 · 차수 여섯 낱말은 정의를 한 줄씩 통째로 외운다.

교재 정의(관계형 모델 · 정규화 · 트랜잭션 표준 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 19번테스트

테스트 케이스의 3대 구성 요소: ① 테스트 실행 전 만족해야 할 조건 ② 입력하는 값 ③ 기대하는 출력

정답① 테스트 조건 ② 테스트 데이터 ③ 예상 결과

— ① 테스트 조건 ② 테스트 데이터 ③ 예상 결과. 테스트 케이스는 "어떤 상황에서 · 무엇을 넣으면 · 무엇이 나와야 하나" 세 가지로 이루어진다.

원리 — 테스트 케이스는 검사를 재현 가능하게 적어 둔 명세다. 테스트 조건(사전 조건)은 실행 전에 갖춰야 할 상태다 — "로그인된 상태, 잔액 10,000원". 테스트 데이터는 실제로 넣는 입력값이다 — "출금 3,000원". 예상 결과는 명세대로라면 나와야 할 출력이다 — "잔액 7,000원 표시". 실행한 뒤 실제 결과를 예상 결과와 비교해 같으면 통과, 다르면 결함이다. 예상 결과를 미리 적어 두지 않으면 "맞는지" 판정할 기준이 없어 테스트가 아니라 그냥 실행이 된다.

따라가기

  1. "실행 전 만족해야 할 조건" → 테스트 조건
  2. "입력하는 값" → 테스트 데이터
  3. "기대하는 출력" → 예상 결과

헷갈리는 자리 — ①을 "테스트 환경"이나 "사전 조건"으로 적는 것. 사전 조건은 뜻이 같아 정답 처리될 가능성이 크지만 교재 표준 용어는 테스트 조건이다. 테스트 케이스에는 이 셋 외에 식별자 · 실제 결과 · 성공 여부 칸이 더 있지만 "3대 구성 요소"는 이 셋이다.

표준 · 교재 정의(ISTQB 용어 · 커버리지 6단계 · 테스트 수준)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2025-3회 · 20번Python

다음 Python 프로그램의 출력에서 빈칸 ①부터 ⑧에 들어갈 값을 순서대로 쓰시오.

data = [ [3, 5, 2, 4, 1], [4, 5, 1], [4, 4, 1, 5, 4], [4, 5] ] result = {} for index, values in enumerate(data): result[index] = (sum(values), len(values)) print(result)

[출력] {0: (①, ②), 1: (③, ④), 2: (⑤, ⑥), 3: (⑦, ⑧)}

정답① 15 ② 5 ③ 10 ④ 3 ⑤ 18 ⑥ 5 ⑦ 9 ⑧ 2

— ① 15 ② 5 ③ 10 ④ 3 ⑤ 18 ⑥ 5 ⑦ 9 ⑧ 2. 안쪽 리스트마다 (합, 길이) 튜플을 만들어 첨자를 키로 넣은 딕셔너리다.

원리enumerate(data) 는 리스트를 돌면서 (첨자, 원소) 짝을 준다. 그래서 index 는 0 · 1 · 2 · 3, values 는 안쪽 리스트다. (sum(values), len(values)) 는 합과 개수를 튜플로 묶은 것이고, 튜플은 소괄호로 찍힌다. 딕셔너리는 넣은 순서대로 찍히므로 출력은 키 0 부터다. 빈칸은 각 튜플의 합이 먼저, 길이가 나중이다.

따라가기

  1. 0: [3, 5, 2, 4, 1] → 합 15, 길이 5
  2. 1: [4, 5, 1] → 10, 3
  3. 2: [4, 4, 1, 5, 4] → 18, 5
  4. 3: [4, 5] → 9, 2

헷갈리는 자리 — 튜플 안의 순서를 (길이, 합)으로 바꿔 적는 것. 코드에서 sum 이 앞이다. 덧셈 실수(셋째 줄 4 + 4 + 1 + 5 + 4 = 18)를 한 칸이라도 하면 그 칸만 틀리므로 여덟 칸을 하나씩 검산한다. 답은 여덟 값을 순서대로 적는다.

복원 코드를 Python 3.12 로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

03채점 뒤 할 일

왜 이걸 하나 — 점수보다 어느 장으로 돌아가느냐가 결과다. 문항마다 가는 장이 정해져 있다.

코드 8문항 중 C 4 · Java 3 · Python 1 이다. 15번은 삼항 · 비트 AND · 시프트 · && 가 한 줄씩 섞여 있어 연산자 우선순위 표를 옆에 두고 푼다. z & z >> 1 은 시프트가 먼저라 2 & 1 = 0 이 되고, 마지막 줄은 조건이 참이라 0 × 7 = 0 이다. 17번은 11 · 7 · 5 를 sum * 3 + value 로 모아 125, XOR 42 로 87, 100 을 더해 187.

5번 enum 은 Word.B.name().length() 가 1 이라 values()[1] 이 B, getText 가 AB 다. 7번은 길이를 세고 뒤에서 둘째 글자 E. 20번 Python 은 빈칸 여덟 개가 (합, 길이) 튜플이라 칸마다 부분 점수가 있다.

용어 12문항은 보안 3(OTP · OAuth · MAC/RBAC/DAC) · SW공학 3(패키지 다이어그램 · 조건 커버리지 · 테스트 케이스 3요소) · DB 2(R ÷ S · 용어 3칸) · SQL 2 · 네트워크 1(오류 제어 5칸) · 리눅스 명령 4칸이다. 1번 · 4번 · 18번은 2023년 3회 · 2회 · 1회에 나온 것이 그대로 다시 나온 문항이다.

문항마다 가는 장

틀린 문항의 「가는 장」을 열면 그 문항이 04절에 그대로 있고, 앞뒤로 같은 꼴의 문항이 붙어 있다. 몰라서 틀렸으면 그 장 03절부터, 알았는데 틀렸으면 05절만 읽는다. 판정 기준은 E01 의 03절 표와 같다.

문항분야가는 장무엇을 묻나
1UMLE15패키지 다이어그램
2CE02구조체 배열 원소의 문자열 포인터 + offset
3리눅스E16pwd · ls · cd · cp
4테스트E18조건 커버리지
5JavaE06enum values()[…] 과 name().length()
6네트워크E11오류 제어 용어 5칸 매칭
7CE03길이 세고 뒤에서 둘째 글자
8보안E13일회용 비밀번호 OTP
9보안E13OAuth
10보안E13MAC · RBAC · DAC 약자
11SQLE08CROSS JOIN + LIKE 패턴 행 수
12SQLE08COUNT(COL2) 는 NULL 을 안 센다
13JavaE05implements
14JavaE05super(side, side)
15CE04삼항 · 비트 AND · 시프트 우선순위
16DBE10R ÷ S 나눗셈 결과
17CE04연결 리스트 순회 sum*3 과 XOR
18DBE10튜플 · 릴레이션 인스턴스 · 카디널리티
19테스트E18테스트 케이스 3요소
20PythonE07enumerate 로 (합, 길이) 튜플 딕셔너리

이 회차에서 눈여겨볼 문항

문항왜 갈리나
11번Smith · Allen · Scott × S% · %T%. Smith 는 둘 다, Allen 은 %T% 아님, Scott 은 둘 다 → 4
12번COL1 IN (2, 3) OR COL2 IN (3, 5) 로 5행 전부 걸리지만 COUNT(COL2) 는 NULL 을 안 세 4
15번시프트 → 비트 AND → 비교 → && → 삼항 순. z 가 0 이 되면 z * x 도 z / x 도 0
16번R ÷ S 는 S 의 b1 · b2 를 전부 가진 A. a1 뿐이다. 열 이름 A 까지 표로 적는다

채점 결과는 오답노트에 회차별 점수와 틀린 문항 목록으로 모인다. 세트를 하나 끝낼 때마다 거기서 같은 장에서 반복해서 틀리는지를 본다. 두 세트에서 같은 장이 나오면 그 장의 06절 훈련을 그날 5문항 푼다.

04다음

왜 이걸 하나 — 세트의 결과는 다음에 열 장의 이름이어야 한다.