2023년 1회 실전 E19

프로그래밍 8 · SQL·DB 4 · 보안 3 · 네트워크 2 · SW공학 2 · AJAX 1. 자바 생성자 체인과 추상 클래스, 비트 분해 빈칸이 갈림길이다

왜 이 장을 하나
2023년 1회는 코드 8문항이 전부 짧다. 대신 static 카운터의 출력 순서, this(500) 생성자 체인, 인자 없는 getName() 처럼 한 줄의 규칙이 답을 가른다. 용어 12문항은 2회분 진단보다 쉬운 편이라 여기서 15문항 아래면 용어 장을 다시 봐야 한다.
다루는 것2023년 1회 20문항 · 복원본
시계150분 · 실제 시험과 같다
끝나면문항마다 가는 장이 표로 나온다

01푸는 법

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

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

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

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

02실전 세트

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

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

2023-1회 · 1번Java

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

class StaticData { public int value = 20; static int count = 0; } public class Main { public static void main(String[] args) { int value = 10; StaticData.count = value; StaticData item = new StaticData(); System.out.println(StaticData.count++); System.out.println(item.count); System.out.println(value); System.out.print(item.value); } }
정답10
11
10
20
static 변수 b는 모든 객체가 공유하는 "공용 게시판"입니다. Static.b=a로 b=10이 되고, Static.b++는 10을 출력한 뒤 11로 증가. st.b는 같은 static이므로 11. 지역변수 a는 10, st.a는 인스턴스 변수 초기값 20. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「10111020」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 2번C

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

#include <stdio.h> int main(void) { char word[] = "Art"; char *p = word; printf("%s\n", word); printf("%c\n", *p); printf("%c\n", *word); printf("%s\n", p); for (int i = 0; word[i] != '\0'; i++) { printf("%c", word[i]); } return 0; }
정답Art
A
A
Art
Art
배열 이름 a와 포인터 p는 같은 곳(문자열 시작 주소)을 가리키는 쪽지입니다. %s는 \0 전까지 전부 출력, *p와 *a는 첫 글자 'A'. for문으로 한 글자씩 출력해도 결국 Art. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「ArtAAArtArt」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 3번C

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

#include <stdio.h> int main(void) { char *left = "qwer"; char *right = "qwtety"; for (int i = 0; left[i] != '\0'; i++) { for (int j = 0; right[j] != '\0'; j++) { if (left[i] == right[j]) { printf("%c", left[i]); } } } return 0; }
정답qwe
a의 q,w,e,r을 하나씩 들고 b에서 찾습니다. q(있음), w(있음), e(있음), r(없음) → "qwe". 이중 반복문은 "명단 대조 작업"으로 생각하면 됩니다. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「qwe」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 4번웹기술

JavaScript와 XML을 이용해 웹 페이지 전체를 새로고침하지 않고 서버와 비동기적으로 데이터를 교환하는 기술은? (Asynchronous JavaScript and XML)

정답AJAX
"페이지 전체를 다시 인쇄하지 않고 필요한 칸만 고쳐 쓰는 기술". 지도 앱에서 화면 이동 시 전체 새로고침 없이 지도만 갱신되는 것이 대표 예입니다.
2023-1회 · 5번네트워크

패킷교환 방식 2가지를 쓰시오. (하나는 연결형으로 경로를 미리 설정, 하나는 비연결형으로 각 패킷이 독립적으로 전송)

정답가상 회선 방식, 데이터그램 방식
가상 회선 = "미리 예약한 관광버스 노선"(순서 보장), 데이터그램 = "각자 택시 타고 알아서 도착"(순서 뒤바뀔 수 있음). 2024년 2회에 동일 개념 재출제!
2023-1회 · 6번보안

시스코의 L2F와 마이크로소프트의 PPTP를 조합한 VPN 터널링 프로토콜로, 자체 암호화 기능이 없어 IPsec과 함께 사용되는 것은?

정답L2TP
L2F + PPTP = L2TP(Layer 2 Tunneling Protocol). "터널만 뚫고 잠금장치(암호화)는 없어서 IPsec이라는 자물쇠를 함께 채운다"고 기억하세요.
2023-1회 · 7번보안

22번 포트를 사용하며, 암호화된 원격 로그인·원격 명령 실행·파일 전송을 제공하는 보안 프로토콜은?

정답SSH
Telnet(23번)의 "통화 내용이 다 들리는 스피커폰"을 암호화 이어폰으로 바꾼 것이 SSH(22번). 포트 번호 22와 함께 세트로 암기.
2023-1회 · 8번보안

악성코드 3종을 구분하시오. ㄱ) 자가 복제하며 네트워크로 스스로 전파됨 ㄴ) 정상 프로그램으로 위장해 숨어들며 자가 복제하지 않음 ㄷ) 자가 복제는 가능하나 스스로 전파되지 못하고 숙주 파일이 필요함

정답ㄱ 웜(Worm) / ㄴ 트로이 목마 / ㄷ 바이러스
웜 = "스스로 번식하고 스스로 이사 다니는 벌레", 바이러스 = "숙주(파일)가 있어야 사는 병원체", 트로이 목마 = "선물 상자로 위장한 병사"(복제 능력 없음). 전파 능력의 유무로 구분!
2023-1회 · 9번C

다음 C 프로그램에서 ①과 ②에 들어갈 연산자와 값을 순서대로 쓰시오.

#include <stdio.h> int main(void) { int input = 101110; int place = 1; int sum = 0; while (input != 0) { sum += (input ① 10) * place; place *= ②; input /= 10; } printf("%d", sum); return 0; }
정답① %, ② 2
input%10은 "맨 오른쪽 자릿수 한 개 떼기", input/10은 "뗀 자리 버리기". 자릿수마다 2의 거듭제곱(di)을 곱해 더하면 10진수가 됩니다. n%10, n/10 콤보는 코드 문제 단골 부품! 빈칸에 답을 넣어 실행하면 출력이 「46」 로 나오는 것을 확인했다. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「① %, ② 2」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 10번네트워크

IP 패킷 전송 중 오류 발생 시 오류 정보를 보고하고 진단하는 프로토콜로, ping 명령이 사용하는 것은?

정답ICMP
IP는 "말없이 배달만 하는 택배기사"라 문제가 생겨도 보고를 못 합니다. ICMP가 "배달 실패 사유서"를 써주는 역할. ping = ICMP Echo 요청/응답.
2023-1회 · 11번디자인패턴

특정 객체에 대한 접근을 제어하기 위해 그 객체의 대리자(surrogate)를 두어 원래 객체의 작업을 대신 처리하게 하는 GoF 디자인 패턴은?

정답Proxy (프록시)
"연예인(실제 객체)에게 직접 연락 못 하고 매니저(프록시)를 거친다". 키워드 "대리"가 보이면 무조건 Proxy.
2023-1회 · 12번DB

관계형 DB 용어: ① 릴레이션의 행(Row)에 해당하는 것 ② 실제 저장된 값(튜플)들의 집합 ③ 튜플의 개수

정답① 튜플 ② 릴레이션 인스턴스 ③ 카디널리티
엑셀로 비유하면 튜플=한 줄(행), 릴레이션 인스턴스=데이터가 채워진 시트, 카디널리티=행 개수, 디그리=열 개수. "카디널리티=행 수, 디그리=열 수"는 2024 2회에도 재출제!
2023-1회 · 13번SQL

학생 테이블에서 이름이 '민수'인 튜플을 삭제하는 SQL문을 작성하시오. (구문 끝에 세미콜론 포함)

정답DELETE FROM 학생 WHERE 이름 = '민수';
DELETE는 FROM과 세트, 문자열은 작은따옴표. WHERE를 빼먹으면 전체 삭제가 되므로 실전에서도 감점. DELETE 구문은 3년간 2회 이상 출제된 필수 암기 문법.
2023-1회 · 14번C

다음 C 프로그램에서 ①과 ②에 들어갈 변수명을 순서대로 쓰시오.

#include <stdio.h> void swap(int *arr, int idx1, int idx2) { int temp = arr[idx1]; arr[idx1] = arr[idx2]; arr[①] = temp; } void bubbleSort(int *arr, int length) { for (int i = 0; i < length - 1; i++) { for (int j = 0; j < length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); } } } } int main(void) { int values[] = { 85, 75, 50, 100, 95 }; int size = 5; bubbleSort(values, ②); return 0; }
정답① idx2, ② size
swap은 "두 컵의 물을 빈 컵(t) 하나로 맞바꾸기" — t에 A를 붓고, A에 B를 붓고, B에 t를 부으면 끝. 마지막 단계가 ①. 정렬 함수엔 배열과 크기를 전달하므로 ②는 nx. 확인 방법: 컴파일만 확인. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「① idx2, ② size」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 15번Python

다음 Python 프로그램의 실행 결과에 남는 집합 원소를 쓰시오. 원소의 출력 순서는 고려하지 않는다.

countries = {'한국', '중국', '일본'} countries.add('베트남') countries.add('중국') countries.remove('일본') countries.update({'홍콩', '한국', '태국'}) print(countries)
정답한국, 중국, 베트남, 홍콩, 태국(순서 무관)
세트(set)는 "중복을 자동으로 거르는 주머니". add('중국')은 이미 있어서 무시, remove('일본')로 제거, update는 여러 개 한꺼번에 추가(중복 '한국'은 무시). 최종 5개 원소. 확인 방법: 집합 원소 비교(순서 무관). (Python 3.12) 그랜드라이프 가답안 표기는 「한국, 중국, 베트남, 홍콩, 태국(순서 무관)」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 16번SQL

성적 테이블에서 과목이름별 최소점수·최대점수를 구하되, 평균 점수가 90 이상인 과목만 조회하는 SQL을 작성하시오. (컬럼 별칭: 최소점수, 최대점수)

정답SELECT 과목이름, MIN(점수) AS 최소점수, MAX(점수) AS 최대점수 FROM 성적 GROUP BY 과목이름 HAVING AVG(점수) >= 90;
"과목별로 묶어라"=GROUP BY, "묶음의 평균 조건"=HAVING(WHERE 아님!). 그룹 조건에 WHERE를 쓰면 오답 — WHERE는 묶기 전 개별 행, HAVING은 묶은 후 그룹 조건입니다.
2023-1회 · 17번Java

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

abstract class Vehicle { String name; abstract public String getName(String value); public String getName() { return "Vehicle name: " + name; } } class Car extends Vehicle { public Car(String value) { name = value; } public String getName(String value) { return "Car name: " + value; } } public class Main { public static void main(String[] args) { Vehicle vehicle = new Car("Spark"); System.out.println(vehicle.getName()); } }
정답Vehicle name: Spark
자식 객체 생성 시 부모 생성자가 먼저 실행되지만, 오버라이딩된 메서드는 항상 자식 것이 실행됩니다(동적 바인딩). "포장은 부모여도 행동은 내용물(자식)이 한다." 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「Vehicle name: Spark」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 18번DB

스키마 3계층: ① 사용자 관점의 뷰 ② 조직 전체의 논리적 구조 ③ 물리적 저장 구조

정답① 외부 스키마 ② 개념 스키마 ③ 내부 스키마
아파트로 비유: 외부=각 세대에서 보는 우리 집 구조, 개념=전체 설계도, 내부=배관·전기 배선도. "외개내" 순서로 암기.
2023-1회 · 19번테스트

다음 제어 흐름에서 분기 커버리지를 만족하도록 두 개의 실행 경로를 쓰시오.

제어 흐름도(그림을 표로 옮김)

노드내용다음
1POINTER = FALSE2
2X > K ?YES → 3, NO → 4
3POINTER = TRUE4
4X = X + 25
5CALL SUB(X, POINTER, RESULT)6
6RESULT > 1 ?YES → 1, NO → 7
7PRINT RESULT
정답1234561, 124567 (또는 1234567, 124561)
결정 노드는 2(X > K)와 6(RESULT > 1) 둘이고, 분기 커버리지는 각 결정의 참 · 거짓을 한 번씩 지나면 된다. 1234561 은 2 의 YES(→3)와 6 의 YES(→1)를, 124567 은 2 의 NO(→4)와 6 의 NO(→7)를 지나 네 분기가 다 덮인다. 6 에서 방향을 서로 바꾼 1234567 · 124561 도 같은 기준을 만족한다. 경로는 노드 번호를 이어 적고, 6 에서 1 로 돌아간 경로는 1 로 끝난다. 2025-2회 11번에 같은 흐름도가 다시 나왔다. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-1회 · 20번Java

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

class Parent { int x = 100; Parent() { this(500); } Parent(int x) { this.x = x; } int getX() { return x; } } class Child extends Parent { int x = 4000; Child() { this(5000); } Child(int x) { this.x = x; } } public class Main { public static void main(String[] args) { Child item = new Child(); System.out.println(item.getX()); } }
정답500
this(값)은 "같은 클래스의 다른 생성자에게 일을 넘기는 것". 생성자 체인을 따라가며 마지막에 x에 무엇이 저장되는지 추적하면 됩니다. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「500」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.

03채점 뒤 할 일

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

코드 8문항 중 C 4 · Java 3 · Python 1 이다. 빈칸 채우기가 둘(9번 자릿수 분해, 14번 버블 정렬)이라 코드를 끝까지 읽기 전에 빈칸부터 채우려는 습관을 경계한다. 빈칸은 그 줄이 무엇을 하려는지 앞뒤 줄이 말해 준다.

Java 세 문항이 전부 클래스 규칙이다. 1번은 static 필드가 인스턴스 사이에 공유되고 count++ 가 값을 먼저 찍는다는 것, 17번은 인자 없는 getName() 이 부모 것 하나뿐이라 오버라이딩이 아니라는 것, 20번은 this(500) 이 같은 클래스의 다른 생성자를 부른다는 것이다. 셋 다 E05 · E06 의 03절 첫 그림이다.

용어 12문항은 보안 3(L2TP · SSH · 악성코드 3종) · 네트워크 2(패킷 교환 · ICMP) · DB 4(용어 3칸 · DELETE · GROUP BY HAVING · 스키마) · 디자인 패턴(Proxy) · 커버리지 경로 · AJAX 다. 19번 분기 커버리지는 경로 두 개를 적는 문제라 부분 점수가 있다.

문항마다 가는 장

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

문항분야가는 장무엇을 묻나
1JavaE06static 변수와 인스턴스 변수의 공유
2CE02문자 배열과 포인터의 같은 자리 출력
3CE03두 문자열의 공통 문자 이중 반복
4웹기술E16AJAX 의 정의
5네트워크E11패킷 교환 2방식 이름
6보안E13L2TP 터널링 프로토콜
7보안E1322번 포트 SSH
8보안E14웜 · 트로이 목마 · 바이러스 구분
9CE04자릿수 분해 빈칸 — % 와 place *= 2
10네트워크E11ping 이 쓰는 ICMP
11디자인패턴E17대리자 Proxy 패턴
12DBE10튜플 · 릴레이션 인스턴스 · 카디널리티
13SQLE09DELETE 문 작성
14CE02swap · bubbleSort 빈칸 변수명
15PythonE07집합 add · remove · update 결과
16SQLE08GROUP BY + HAVING AVG 작성
17JavaE05추상 클래스 오버로딩 — 인자 없는 getName
18DBE10스키마 3계층 이름
19테스트E18분기 커버리지 경로 2개
20JavaE05this(…) 생성자 체인과 필드 가림

이 회차에서 눈여겨볼 문항

문항왜 갈리나
1번count 는 value 로 10 이 된 뒤 count++ 가 10 을 찍고 11 이 된다. 그다음 item.count 11, value 10, item.value 20 — 네 줄의 순서가 답이다
9번101110 을 10으로 나눈 나머지를 2의 자리값으로 모으면 2진수 → 10진수 변환이다. 첫째 빈칸 %, 둘째 빈칸 2
17번vehicle.getName() 은 인자가 없어 부모 getName() 하나뿐이다. Car 의 getName(String) 은 오버로딩이라 안 불린다
20번Child() → this(5000) → super() 암묵 호출 → Parent() → this(500). getX 는 Parent 의 x 를 돌려주므로 500

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

04다음

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