[2023년 1회] 정보처리기사 실기 복원 문제 해설
문제 1. Java static 변수와 인스턴스 변수
문제 코드
class Static{
public int a = 20;
static int b = 0;
}
public class Main{
public static void main(String[] args) {
int a;
a = 10;
Static.b = a;
Static st = new Static();
System.out.println(Static.b++);
System.out.println(st.b);
System.out.println(a);
System.out.print(st.a);
}
}
정답
10
11
10
20해설
실행 과정:
main() 함수:
int a = 10(지역 변수)
Static.b = a:Static.b = 10(static 변수는 클래스 변수)- 모든 인스턴스가 공유
Static st = new Static():st.a = 20(인스턴스 변수)Static.b = 10(static 변수, 변경 없음)
System.out.println(Static.b++):Static.b출력:10- 후위 증가 연산:
Static.b = 11
System.out.println(st.b):st.b는Static.b와 동일 (static 변수)- 출력:
11
System.out.println(a):- 지역 변수
a출력:10
- 지역 변수
System.out.print(st.a):- 인스턴스 변수
st.a출력:20
- 인스턴스 변수
변수 종류 비교:
| 변수 타입 | 선언 | 공유 범위 | 접근 방법 |
|---|---|---|---|
| static 변수 | static int b |
모든 인스턴스 공유 | 클래스명.변수 또는 인스턴스.변수 |
| 인스턴스 변수 | int a |
인스턴스별 독립 | 인스턴스.변수 |
| 지역 변수 | 메서드 내 int a |
메서드 내부만 | 변수명 직접 사용 |
메모리 상태:
Static 클래스:
static int b = 11 (모든 인스턴스 공유)
st 인스턴스:
int a = 20 (인스턴스 변수)
main() 지역:
int a = 10 (지역 변수)핵심 개념:
- static 변수: 클래스 변수, 모든 인스턴스가 공유
- 인스턴스 변수: 객체별로 독립적
- 후위 증가 연산: 값을 먼저 사용한 후 증가
문제 2. C언어 포인터와 배열
문제 코드
#include <stdio.h>
int main(){
char a[] = "Art";
char* p = NULL;
p = a;
printf("%s\n", a);
printf("%c\n", *p);
printf("%c\n", *a);
printf("%s\n", p);
for(int i = 0; a[i] != '\0'; i++)
printf("%c", a[i]);
}
정답
Art
A
A
Art
Art해설
실행 과정:
배열 초기화:
char a[] = "Art"→a[0]='A', a[1]='r', a[2]='t', a[3]='\0'
포인터 할당:
p = a→p는a[0]의 주소를 가리킴
출력:
printf("%s\n", a)→ 문자열 출력: "Art"printf("%c\n", *p)→*p는a[0]= 'A'printf("%c\n", *a)→*a는a[0]= **'A'`printf("%s\n", p)→p가 가리키는 문자열 출력: "Art"for루프:a[0]='A', a[1]='r', a[2]='t'→ "Art"
포인터와 배열 관계:
배열 a: [A][r][t][\0]
↑
│
포인터 p ─┘포인터 연산:
| 표현식 | 의미 | 값 |
|---|---|---|
a |
배열의 시작 주소 | &a[0] |
*a |
배열의 첫 번째 요소 | a[0] = 'A' |
p |
포인터가 가리키는 주소 | &a[0] |
*p |
포인터가 가리키는 값 | a[0] = 'A' |
a[i] |
배열의 i번째 요소 | *(a + i) |
핵심 개념:
- 배열 이름: 배열의 시작 주소를 나타냄
- 포인터: 주소를 저장하는 변수
- 역참조 연산자
*: 포인터가 가리키는 값에 접근
문제 3. C언어 문자열 비교
문제 코드
#include <stdio.h>
int main(){
char* a = "qwer";
char* b = "qwtety";
for(int i = 0; a[i] != '\0' ; i++){
for(int j = 0; b[j] != '\0'; j++){
if(a[i] == b[j]) printf("%c", a[i]);
}
}
}
정답
qwe
해설
실행 과정:
문자열:
a = "qwer"→a[0]='q', a[1]='w', a[2]='e', a[3]='r'b = "qwtety"→b[0]='q', b[1]='w', b[2]='t', b[3]='e', b[4]='t', b[5]='y'
이중 반복문:
| i | a[i] | j | b[j] | 비교 | 출력 |
|---|---|---|---|---|---|
| 0 | 'q' | 0 | 'q' | 같음 | q |
| 0 | 'q' | 1 | 'w' | 다름 | - |
| 0 | 'q' | 2 | 't' | 다름 | - |
| 0 | 'q' | 3 | 'e' | 다름 | - |
| 0 | 'q' | 4 | 't' | 다름 | - |
| 0 | 'q' | 5 | 'y' | 다름 | - |
| 1 | 'w' | 0 | 'q' | 다름 | - |
| 1 | 'w' | 1 | 'w' | 같음 | w |
| 1 | 'w' | 2 | 't' | 다름 | - |
| ... | ... | ... | ... | ... | ... |
| 2 | 'e' | 3 | 'e' | 같음 | e |
| ... | ... | ... | ... | ... | ... |
| 3 | 'r' | 모든 j | - | 없음 | - |
공통 문자:
a[0]='q'와b[0]='q'→ 'q' 출력a[1]='w'와b[1]='w'→ 'w' 출력a[2]='e'와b[3]='e'→ 'e' 출력a[3]='r'는b에 없음
출력 순서:
- 'q' → 'w' → 'e' → "qwe"
알고리즘:
- 두 문자열의 공통 문자를 찾는 알고리즘
a의 각 문자에 대해b의 모든 문자와 비교- 같은 문자가 있으면 출력
문제 4. AJAX
문제
( )은/는 비동기적인 웹 애플리케이션의 제작을 위해 JavaScript와 XML을 이용한 비동기적 정보 교환 기법이다.
( )은/는 필요한 데이터만을 웹서버에 요청해서 받은 후 클라이언트에서 데이터에 대한 처리를 할 수 있다.
보통 SOAP이나 XML 기반의 웹 서비스 프로토콜이 사용되며, 웹 서버의 응답을 처리하기 위해 클라이언트 쪽에서는 자바스크립트를 쓴다.
( )은/는 Google Map과 Google pages에서 사용한 기술에 기반하여 제작되었다.
정답
AJAX (Asynchronous JavaScript and XML)
해설
AJAX 특징:
| 특징 | 설명 |
|---|---|
| 목적 | 비동기적 웹 애플리케이션 제작 |
| 기술 | JavaScript + XML/JSON |
| 방식 | 필요한 데이터만 요청/응답 |
| 프로토콜 | SOAP, XML 기반 웹 서비스 |
| 기원 | Google Map, Google Pages 기술 |
AJAX 동작 과정:
[클라이언트] [서버]
│ │
├─ XMLHttpRequest 생성 │
│ │
├─ 비동기 요청 전송 ───────────→│
│ │
│←── XML/JSON 데이터 응답 ─────┤
│ │
├─ JavaScript로 DOM 조작 │
│ │
└─ 페이지 일부만 갱신 │전통적인 웹 vs AJAX:
| 구분 | 전통적인 웹 | AJAX |
|---|---|---|
| 요청 | 전체 페이지 | 필요한 데이터만 |
| 응답 | HTML 전체 | XML/JSON 데이터 |
| 갱신 | 페이지 전체 새로고침 | 일부만 갱신 |
| 사용자 경험 | 느림 | 빠름 |
AJAX 장점:
- 페이지 전체 새로고침 없음
- 빠른 응답 속도
- 서버 부하 감소
- 사용자 경험 향상
AJAX 사용 예시:
- 실시간 검색 자동완성
- 댓글 추가/삭제
- 좋아요 버튼
- 무한 스크롤
문제 5. 가상회선과 데이터그램
문제
구분 1:
- 회선교환 방식과 데이터그램 방식의 장점을 결합한 통신 기술이다.
- 처음 패킷으로 최적의 경로를 고정하고 경로가 고정되면 그 다음은 패킷으로 나누어 고속으로 전송할 수 있다.
- 통신기술에는 ATM이 있으며, 정해진 시간 안이나 다량의 데이터를 연속으로 보낼 때 적합하다.
구분 2:
- 패킷교환 방식으로 동작하면서 IP 주소를 사용하는 인터넷을 의미한다.
- 각 전송패킷을 미리 정해진 경로 없이 독립적으로 처리하여 교환하는 방식이다
- 특정 교환기의 고장 시 모든 패킷을 잃어버리는 가상회선과 달리, 그 경로를 피해서 전송할 수 있으므로 더욱 신뢰가 가능하다.
- 짧은 메시지의 패킷들을 전송할 때 효과적이고 재정렬 기능이 필요하다.
정답
구분 1: 가상회선 (Virtual Circuit)
구분 2: 데이터그램 (Datagram)
해설
패킷 교환 방식 비교:
| 구분 | 가상회선 | 데이터그램 |
|---|---|---|
| 경로 | 사전에 경로 설정 | 경로 없이 독립 전송 |
| 패킷 순서 | 순서 보장 | 순서 보장 안됨 (재정렬 필요) |
| 신뢰성 | 경로 고장 시 모든 패킷 손실 | 경로 우회 가능 (높은 신뢰성) |
| 적합한 경우 | 연속 데이터, 실시간 통신 | 짧은 메시지 |
| 예시 | ATM | IP 인터넷 |
가상회선 동작:
[송신] [수신]
│ │
├─ 연결 설정 요청 ────────→│
│ │
│←── 경로 설정 완료 ───────┤
│ │
├─ 패킷1 전송 ────────────→│
├─ 패킷2 전송 ────────────→│
├─ 패킷3 전송 ────────────→│
│ │
└─ 연결 해제 ─────────────→│데이터그램 동작:
[송신] [수신]
│ │
├─ 패킷1 (경로A) ─────────→│
├─ 패킷2 (경로B) ─────────→│
├─ 패킷3 (경로A) ─────────→│
│ │
└─ 독립적 전송 (순서 보장 안됨)통신 방식 비교:
| 방식 | 설명 | 특징 |
|---|---|---|
| 회선교환 | 물리적 경로 설정 | 전용 회선, 고정 대역폭 |
| 패킷교환 | 패킷 단위 전송 | 효율적, 공유 회선 |
| 가상회선 | 논리적 경로 설정 | 회선교환 + 패킷교환 |
| 데이터그램 | 경로 없이 독립 전송 | 유연성, 신뢰성 |
문제 6. L2TP
문제
2 계층(데이터링크 계층)에서 구현되는 터널링 기술 중 하나
L2F와 PPTP가 결합된 프로토콜로 VPN과 인터넷 서비스 제공자(ISP)가 이용
IPsec을 함께 사용하면 PPTP보다 훨씬 안전하지만 보안보다 익명화에 더 적합
정답
L2TP (Layer 2 Tunneling Protocol)
해설
L2TP 특징:
| 특징 | 설명 |
|---|---|
| 계층 | 데이터링크 계층 (2계층) |
| 기원 | L2F + PPTP 결합 |
| 사용처 | VPN, ISP |
| 보안 | IPsec과 함께 사용 시 강화 |
| 목적 | 익명화에 더 적합 |
VPN 프로토콜 비교:
| 프로토콜 | 계층 | 암호화 | 특징 |
|---|---|---|---|
| PPTP | 2계층 | 약함 | 빠르지만 보안 취약 |
| L2TP | 2계층 | IPsec 필요 | PPTP보다 안전 |
| IPsec | 3계층 | 강함 | 네트워크 계층 암호화 |
| SSL VPN | 7계층 | 강함 | 응용 계층 암호화 |
L2TP 구조:
[클라이언트] → [L2TP 터널] → [L2TP 서버] → [사설 네트워크]
(2계층)L2TP + IPsec:
[클라이언트] → [IPsec 암호화] → [L2TP 터널] → [서버]
(3계층) (2계층)L2TP 장점:
- L2F와 PPTP의 장점 결합
- IPsec과 함께 사용 시 보안 강화
- 익명화에 적합
문제 7. SSH
문제
( ) 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 응용 프로그램 또는 그 프로토콜을 가리킨다.
( ) 보안 접속을 통한 rsh, rcp, rlogin, rexec, telnet, ftp 등을 제공하며, IP spoofing (IP스푸핑, 아이피 위/변조 기법중 하나)을 방지하기 위한 기능을 제공한다.
( ) 기본적으로 포트는 22번이다.
정답
SSH (Secure Shell)
해설
SSH 특징:
| 특징 | 설명 |
|---|---|
| 목적 | 원격 로그인, 명령 실행, 파일 복사 |
| 보안 | 암호화된 통신 |
| 대체 | rsh, rcp, rlogin, telnet, ftp의 보안 버전 |
| 방어 | IP spoofing 방지 |
| 포트 | 22번 |
SSH vs 기존 프로토콜:
| 프로토콜 | 보안 | 포트 | 용도 |
|---|---|---|---|
| Telnet | ❌ 평문 | 23 | 원격 로그인 |
| FTP | ❌ 평문 | 21 | 파일 전송 |
| rsh | ❌ 평문 | - | 원격 셸 |
| SSH | ✅ 암호화 | 22 | 모든 기능 통합 |
SSH 통신 과정:
[클라이언트] [서버]
│ │
├─ SSH 연결 요청 ────────────→│
│ │
│←── 공개키 전송 ──────────────┤
│ │
├─ 암호화된 세션 키 전송 ──────→│
│ │
│←── 암호화된 통신 시작 ───────┤
│ │
└─ 암호화된 데이터 교환 ────────┘SSH 주요 기능:
- 원격 로그인 (rlogin 대체)
- 원격 명령 실행 (rsh 대체)
- 파일 전송 (SCP, SFTP - FTP 대체)
- 포트 포워딩
- X11 포워딩
문제 8. 악성코드 종류
문제
구분 1:
- 감염된 컴퓨터 시스템에서 스스로 복제해 다른 컴퓨터로 복사본을 확산시킬 수 있는 악성 프로그램이다.
- 독자적으로 실행되며 다른 실행 프로그램이 필요하지 않으며, 파일 전송 기능을 착취하도록 설계된다.
- 자가 복제 및 네트워크를 통한 전파도 가능하다.
구분 2:
- 정상적인 프로그램으로 가장해 사용자가 직접 컴퓨터에 설치하도록 위장하며, 백도어를 만들어 공격자가 침입할 수 있도록 만들거나 시스템을 파괴한다.
- 정상적인 프로그램으로 위장하여 시작부터 끝까지 램에 상주하며, 시스템 내부 정보를 공격자의 컴퓨터로 빼돌리는 프로그램이다.
- 좀비PC처럼 내부정보 유출뿐만 아니라 컨트롤까지 가능한 종류가 있고, 단순히 내부 데이터만 유출할 수 있는 타입의 트로이 목마가 있다.
- 감염된 후에 스스로를 복제하는 능력은 없다.
구분 3:
- 대상(정상파일)을 감염시키는 형태로 실행되며, 감염시킬 대상이 존재하지 않을 때에는 실행되지 않으며 다른정상파일로의 자기 복제 기능이 있다.
- 컴퓨터 시스템에 침입해 프로그램에 기생하며 시스템을 변경하거나 사용할 수 없도록 만드는 악성코드이다.
- 네트워크를 통해 전파되지 않으며 방식 및 위치에 따라 여러형태로 나뉜다.
정답
1. 웜 (Worm)
2. 트로이 목마 (Trojan Horse)
3. 바이러스 (Virus)
해설
악성코드 비교:
| 구분 | 웜 | 트로이 목마 | 바이러스 |
|---|---|---|---|
| 실행 | 독자적 실행 | 정상 프로그램 위장 | 다른 프로그램에 기생 |
| 복제 | 자가 복제 가능 | 복제 불가 | 자가 복제 가능 |
| 전파 | 네트워크 전파 | 사용자 설치 | 파일 감염 |
| 대상 | 필요 없음 | 사용자 속임 | 정상 파일 필요 |
악성코드 특징 표:
| 악성코드 | 특징 | 전파 방법 | 예시 |
|---|---|---|---|
| 웜 | 독자 실행, 자가 복제 | 네트워크 | Code Red, Slammer |
| 트로이 목마 | 정상 프로그램 위장 | 사용자 설치 | Backdoor, Keylogger |
| 바이러스 | 파일 감염, 기생 | 파일 복사 | CIH, Melissa |
악성코드 전파 과정:
웜:
[감염된 PC] → [네트워크 스캔] → [다른 PC 감염] → [반복]트로이 목마:
[위장된 프로그램] → [사용자 다운로드] → [설치] → [백도어 생성]바이러스:
[감염된 파일] → [실행] → [다른 파일 감염] → [확산]문제 9. 이진수 변환 코드
문제 코드
#include <stdio.h>
int main() {
int input = 101110;
int di = 1;
int sum = 0;
while (1) {
if (input == 0) break
else {
sum = sum + (input (a)(b)) * di;
di = di * 2;
input = input / 10;
}
}
printf("%d", sum);
return 0;
}
정답
(a) % (나머지 연산자)
(b) 10
또는
(a) & (비트 AND)
(b) 1
해설
이진수 변환 과정:
입력: 101110 (이진수로 가정)
변환 과정:
| 반복 | input | input % 10 | di | sum 누적 |
|---|---|---|---|---|
| 1 | 101110 | 0 | 1 | 0 × 1 = 0 |
| 2 | 10111 | 1 | 2 | 0 + 1×2 = 2 |
| 3 | 1011 | 1 | 4 | 2 + 1×4 = 6 |
| 4 | 101 | 1 | 8 | 6 + 1×8 = 14 |
| 5 | 10 | 0 | 16 | 14 + 0×16 = 14 |
| 6 | 1 | 1 | 32 | 14 + 1×32 = 46 |
계산:
101110₂=46₁₀
코드 동작:
input % 10: 일의 자리 숫자 추출di: 현재 자리수 값 (1, 2, 4, 8, ...)input / 10: 일의 자리 제거
대안 방법 (비트 연산):
input & 1: 최하위 비트 추출input >> 1: 오른쪽 시프트 (2로 나누기)
이진수 변환 알고리즘:
101110 (이진수)
↓
각 자리수 × 2의 거듭제곱
↓
0×2⁰ + 1×2¹ + 1×2² + 1×2³ + 0×2⁴ + 1×2⁵
↓
0 + 2 + 4 + 8 + 0 + 32 = 46문제 10. ICMP
문제
( )은/는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜이다.
( ) 프로토콜은 보통 다른 호스트나 게이트웨이와 연결된 네트웍에 문제가 있는지 확인하기 위한 목적으로 주로 사용된다.
( )을/를 이용한 공격에는 ( ) Flooding가 있는데 ping 명령어를 통한 ( ) 패킷을 연속적으로 계속 보내어 서버의 요청에 응답으로 인한 다른작업을 하지 못하도록 하는 공격이다.
정답
ICMP (Internet Control Message Protocol)
해설
ICMP 특징:
| 특징 | 설명 |
|---|---|
| 목적 | IP 패킷 처리 문제 알림 |
| 용도 | 네트워크 문제 확인 |
| 공격 | ICMP Flooding (Ping Flooding) |
| 계층 | 네트워크 계층 (3계층) |
ICMP 메시지 종류:
| 메시지 | 설명 |
|---|---|
| Echo Request | ping 요청 |
| Echo Reply | ping 응답 |
| Destination Unreachable | 목적지 도달 불가 |
| Time Exceeded | 시간 초과 |
| Redirect | 경로 재지정 |
ICMP Flooding 공격:
[공격자] [서버]
│ │
├─ ICMP Echo Request ─────────→│
├─ ICMP Echo Request ─────────→│
├─ ICMP Echo Request ─────────→│
│ │
│←── ICMP Echo Reply ──────────┤ (응답 처리로 인한 부하)
│ │
└─ ... (반복) ────────────────→│ (서버 마비)ICMP 사용 예시:
ping: 호스트 연결 확인traceroute: 경로 추적- 네트워크 진단
방어 방법:
- 방화벽에서 ICMP 패킷 제한
- ICMP 응답 속도 제한
- DDoS 방어 시스템
문제 11. Proxy 패턴
문제
- 다른 무언가와 이어지는 인터페이스 역할을 하는 클래스를 의미한다.
- 실제 객체를 호출하면 행위를 중간에 가로채서 다른 동작을 수행하는 객체로 변경한다.
- 객체를 정교하게 제어해야 하거나 객체 참조가 필요한 경우 사용한다.
- 분리된 객체를 위임함으로써 대리 작업을 중간 단계에 삽입할 수도 있으며 분리된 객체를 동적으로 연결함으로써 객체의 실행 시점을 관리할 수도 있다.
정답
Proxy (프록시 패턴)
해설
Proxy 패턴 특징:
| 특징 | 설명 |
|---|---|
| 역할 | 인터페이스 역할 |
| 동작 | 행위 가로채기 |
| 목적 | 객체 제어, 참조 관리 |
| 기능 | 대리 작업, 실행 시점 관리 |
Proxy 패턴 구조:
[클라이언트] → [Proxy] → [RealSubject]
│
├─ 접근 제어
├─ 지연 로딩
└─ 추가 기능Proxy 패턴 종류:
| 종류 | 설명 |
|---|---|
| Virtual Proxy | 실제 객체 생성을 지연 |
| Remote Proxy | 원격 객체에 대한 로컬 대리 |
| Protection Proxy | 접근 권한 제어 |
| Cache Proxy | 결과 캐싱 |
Proxy 패턴 예시:
// 실제 객체
class RealImage {
void display() { ... }
}
// 프록시 객체
class ProxyImage {
private RealImage realImage;
void display() {
if (realImage == null) {
realImage = new RealImage(); // 지연 로딩
}
realImage.display();
}
}
Proxy 패턴 장점:
- 실제 객체 생성 지연 (메모리 절약)
- 접근 제어 및 보안 강화
- 추가 기능 부여 (로깅, 캐싱 등)
- 정보 은닉
문제 12. 데이터베이스 용어
문제
구분 1:
- 셀 수 있는 수량의 순서 있는 열거이다.
- 어떤 요소의 집합, 혹은 테이블에서의 행을 가리키지만 일반적인 집합과는 달리 중복이 허용될 수 있다.
- 리스트와 동일하게 여러 객체를 모아서 담으며, 숫자, 문자, 객체, 배열, 튜플 안의 튜플 전부 가능하다.
구분 2:
- 어느 한 시점에 릴레이션의 내용(상태), 즉 저장된 데이터 전체를 의미한다.
- 단순히 릴레이션 또는 릴레이션 외연(Relation Extension)라고도 한다.
구분 3:
- 특정 데이터 집합의 유니크(Unique)한 값의 개수이다.
- 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.
정답
1. 튜플 (Tuple)
2. 릴레이션 인스턴스 (Relation Instance)
3. 카디널리티 (Cardinality)
해설
데이터베이스 용어 비교:
| 용어 | 설명 | 특징 |
|---|---|---|
| 튜플 | 릴레이션의 행, 순서 있는 열거 | 중복 허용 가능 |
| 릴레이션 인스턴스 | 특정 시점의 릴레이션 내용 | 저장된 데이터 전체 |
| 카디널리티 | 유니크한 값의 개수 | 중복 제거 후 개수 |
릴레이션 구조:
학생 릴레이션 (스키마)
┌────────┬────────┬──────────┐
│ 학번 │ 이름 │ 전공 │ ← 속성 (Attribute)
├────────┼────────┼──────────┤
│ 1001 │ 김철수 │ 컴공 │ ← 튜플 (Tuple)
│ 1002 │ 이영희 │ 전자 │ ← 튜플
│ 1003 │ 박민수 │ 기계 │ ← 튜플
└────────┴────────┴──────────┘
↑
릴레이션 인스턴스
(현재 저장된 데이터)카디널리티 예시:
| 컬럼 | 값 | 카디널리티 |
|---|---|---|
| 학번 | 1001, 1002, 1003 | 3 (모두 유니크) |
| 전공 | 컴공, 전자, 기계, 컴공 | 3 (중복 제거) |
| 이름 | 김철수, 이영희, 박민수 | 3 |
튜플 특징:
- 순서 있는 열거
- 중복 허용 가능
- 다양한 데이터 타입 포함 가능
문제 13. SQL DELETE
문제
[학생] 테이블에서 학생 이름이 '민수'인 튜플을 삭제하는 쿼리를 작성하시오.
조건:
- 컬럼의 값이 문자열일 경우 작은 따움표 (' ')를 표시하시오.
- SQL 마지막에 세미콜론(;)은 표기하지 않아도 관계 없습니다.
정답
DELETE FROM 학생 WHERE 이름 = '민수'
해설
DELETE 문법:
DELETE FROM 테이블명
WHERE 조건;
실행 과정:
- 테이블 선택:
FROM 학생 - 조건 확인:
WHERE 이름 = '민수' - 삭제: 조건에 맞는 행 삭제
예시:
삭제 전:
| 학번 | 이름 | 전공 |
|------|------|------|
| 1001 | 김철수 | 컴공 |
| 1002 | 민수 | 전자 |
| 1003 | 박민수 | 기계 |
삭제 후:
| 학번 | 이름 | 전공 |
|------|------|------|
| 1001 | 김철수 | 컴공 |
| 1003 | 박민수 | 기계 |
주의사항:
WHERE절 없이 실행 시 모든 행 삭제- 문자열은 작은따옴표로 감싸기
- 트랜잭션 사용 권장 (롤백 가능)
문제 14. Java 버블 정렬
문제 코드
public class Sort {
public static void swap(int[] arr, int idx1, int idx2){
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[( 1 )] = temp;
}
public static void Usort(int[] array, int length){
for (int i = 0; i < length; i++) {
for (int j = 0; j < length - i - 1; j++) {
if (array[j] > array[j + 1]) {
swap(array, j, j + 1);
}
}
}
}
public static void main(String[] args) {
int[] item = new int[] { 5, 3, 8, 1, 2, 7 };
int nx = 6;
Usort(item, ( 2 ));
for (int data : item) {
System.out.print(data + " ");
}
}
}
출력 값: 1 2 3 5 7 8
정답
(1) idx2
(2) nx
해설
swap() 함수:
- 두 배열 요소의 값을 교환
arr[idx1]과arr[idx2]를 교환arr[(1)] = temp→arr[idx2] = temp
버블 정렬 과정:
초기 배열: [5, 3, 8, 1, 2, 7]
1회전 (i=0):
- j=0:
5 > 3→ 교환 →[3, 5, 8, 1, 2, 7] - j=1:
5 > 8→ 안함 - j=2:
8 > 1→ 교환 →[3, 5, 1, 8, 2, 7] - j=3:
8 > 2→ 교환 →[3, 5, 1, 2, 8, 7] - j=4:
8 > 7→ 교환 →[3, 5, 1, 2, 7, 8]
2회전 (i=1):
- j=0:
3 > 5→ 안함 - j=1:
5 > 1→ 교환 →[3, 1, 5, 2, 7, 8] - j=2:
5 > 2→ 교환 →[3, 1, 2, 5, 7, 8] - j=3:
5 > 7→ 안함
최종: [1, 2, 3, 5, 7, 8]
버블 정렬 알고리즘:
for i = 0 to length-1:
for j = 0 to length-i-2:
if array[j] > array[j+1]:
swap(array[j], array[j+1])시간 복잡도:
- 최선: O(n)
- 평균: O(n²)
- 최악: O(n²)
문제 15. Python 집합(Set)
문제 코드
a = {'한국', '중국', '일본'}
a.add('베트남')
a.add('중국')
a.remove('일본')
a.update({'홍콩', '한국', '태국'})
print(a)
정답
{'한국', '중국', '베트남', '홍콩', '태국'}
해설
실행 과정:
초기화:
a = {'한국', '중국', '일본'}
a.add('베트남'):a = {'한국', '중국', '일본', '베트남'}
a.add('중국'):- 집합은 중복 허용 안함
a = {'한국', '중국', '일본', '베트남'}(변화 없음)
a.remove('일본'):a = {'한국', '중국', '베트남'}
a.update({'홍콩', '한국', '태국'}):- 여러 요소 추가
- '한국'은 이미 존재 (중복 무시)
a = {'한국', '중국', '베트남', '홍콩', '태국'}
집합 연산:
| 연산 | 설명 | 예시 |
|---|---|---|
add() |
요소 하나 추가 | a.add('x') |
remove() |
요소 제거 | a.remove('x') |
update() |
여러 요소 추가 | a.update({x, y}) |
union() |
합집합 | `a |
intersection() |
교집합 | a & b |
집합 특징:
- 중복 허용 안함
- 순서 없음 (인덱싱 불가)
- 가변 객체
문제 16. SQL GROUP BY와 HAVING
문제
성적 테이블에서 과목별 점수의 평균이 90점 이상인 '과목이름', '최소점수', '최대점수'를 검색하고자 한다.
조건:
- where 사용하지 말아야 한다.
- SELECT절에 별칭을 사용하여 작성해야 한다.
- SQL 구문 마지막에 세미콜론 생략 가능하다.
- 반드시 GROUP BY와 having을 사용해야 한다.
- 집계함수를 사용해야 한다.
정답
SELECT
과목이름,
MIN(점수) AS 최소점수,
MAX(점수) AS 최대점수
FROM 성적
GROUP BY 과목이름
HAVING AVG(점수) >= 90
해설
SQL 실행 순서:
- FROM: 테이블 선택
- WHERE: 행 필터링 (사용 안함)
- GROUP BY: 그룹화
- HAVING: 그룹 필터링
- SELECT: 컬럼 선택
예시 데이터:
성적 테이블:
| 학생명 | 과목이름 | 점수 |
|--------|---------|------|
| 김철수 | 수학 | 95 |
| 이영희 | 수학 | 85 |
| 박민수 | 수학 | 90 |
| 최지영 | 영어 | 92 |
| 정수진 | 영어 | 88 |
GROUP BY 실행:
| 과목이름 | 점수들 | 평균 |
|---|---|---|
| 수학 | 95, 85, 90 | 90 |
| 영어 | 92, 88 | 90 |
HAVING 필터링:
| 과목이름 | 평균 | 최소점수 | 최대점수 |
|---|---|---|---|
| 수학 | 90 | 85 | 95 |
| 영어 | 90 | 88 | 92 |
WHERE vs HAVING:
| 구분 | WHERE | HAVING |
|---|---|---|
| 사용 시점 | GROUP BY 전 | GROUP BY 후 |
| 대상 | 개별 행 | 그룹 |
| 집계함수 | 사용 불가 | 사용 가능 |
집계함수:
MIN(): 최소값MAX(): 최대값AVG(): 평균SUM(): 합계COUNT(): 개수
문제 17. Java 추상 클래스와 상속
문제 코드
abstract class Vehicle {
String name;
abstract public String getName(String val);
public String getName() {
return "Vehicle name: " + name;
}
}
class Car extends Vehicle {
public Car(String val) {
name=super.name=val;
}
public String getName(String val) {
return "Car name:" + val;
}
public String getName(byte val[]) {
return "Car name:" + val;
}
}
public class Main {
public static void main(String[] args) {
Vehicle obj = new Car("Spark");
System.out.println(obj.getName());
}
}
정답
Vehicle name: Spark
해설
실행 과정:
객체 생성:
Vehicle obj = new Car("Spark")obj는 Vehicle 타입이지만 Car 인스턴스
생성자 실행:
Car(String val)호출name = super.name = valname = "Spark",super.name = "Spark"
obj.getName()호출:obj는 Vehicle 타입getName()은 오버로딩된 메서드 (매개변수 없음)- 메서드 오버라이딩은 적용 안됨 (매개변수 다름)
- Vehicle 클래스의
getName()실행 "Vehicle name: " + name="Vehicle name: Spark"
메서드 오버로딩 vs 오버라이딩:
| 구분 | 오버로딩 | 오버라이딩 |
|---|---|---|
| 정의 | 같은 이름, 다른 매개변수 | 부모 메서드 재정의 |
| 다형성 | 적용 안됨 | 적용됨 |
| 예시 | getName(), getName(String) |
getName() 재정의 |
메서드 매칭:
| 호출 | 매개변수 | 매칭되는 메서드 |
|---|---|---|
obj.getName() |
없음 | Vehicle.getName() |
obj.getName("x") |
String | Car.getName(String) (오버라이딩) |
핵심 개념:
- 추상 메서드:
abstract키워드로 선언, 구현 없음 - 메서드 오버로딩: 같은 이름, 다른 매개변수
- 메서드 오버라이딩: 부모 메서드 재정의 (매개변수 동일)
문제 18. 데이터베이스 스키마
문제
구분 1:
- 사용자나 응용 프로그래머가 개인의 입장에서 필요한 데이터베이스의 논리적 구조를 정의한다.
- 전체 데이터베이스의 한 논리적인 부분으로 볼 수 있기 때문에 서브 스키마라고도 한다.
- 하나의 데이터베이스 시스템에는 여러 개의 외부 스키마가 존재할 수 있다.
- 하나의 외부 스키마를 여러개의 응용 프로그램 혹은 사용자가 공유할 수 있다.
구분 2:
- 데이터베이스의 전체적인 논리적 구조로, 모든 응용 프로그램이나 사용자들이 필요로 하는 데이터를 종합한 조직 전체의 데이터베이스로 하나만 존재한다.
- 개체 간의 관계(Relationship)와 제약 조건을 나타내고 데이터베이스의 접근 권한, 보안 및 무결성 규칙에 관한 명세를 정의한다.
- 데이터베이스 파일에 저장되는 데이터의 형태를 나타내는 것이다.
- 기관이나 조직체의 관점에서 데이터베이스를 정의한 것이다
구분 3:
- 물리적인 저장장치 입장에서 데이터가 저장되는 방법을 기술한 것이다.
- 실제 데이터베이스에 저장될 레코드의 물리적인 구조를 정의한다.
- 저장 데이터 항목의 표현방법, 내부 레코드의 물리적 순서, 인덱스 유/무 등을 나타낸다.
- 시스템 프로그래머나 시스템 설계자가 관리한다.
정답
1. 외부 스키마 (External Schema)
2. 개념 스키마 (Conceptual Schema)
3. 내부 스키마 (Internal Schema)
해설
3단계 스키마 구조:
[외부 스키마 1] [외부 스키마 2] [외부 스키마 3]
↓ ↓ ↓
[개념 스키마 (Conceptual Schema)]
↓
[내부 스키마 (Internal Schema)]
↓
[물리적 저장장치]스키마 비교:
| 구분 | 외부 스키마 | 개념 스키마 | 내부 스키마 |
|---|---|---|---|
| 관점 | 사용자/응용 | 조직 전체 | 물리적 저장 |
| 개수 | 여러 개 | 1개 | 1개 |
| 관리자 | 사용자/프로그래머 | DBA | 시스템 설계자 |
| 내용 | 필요한 부분만 | 전체 구조 | 저장 방법 |
스키마 특징:
외부 스키마:
- 서브 스키마라고도 함
- 사용자별로 다른 뷰 제공
- 여러 개 존재 가능
개념 스키마:
- 전체 데이터베이스 구조
- 개체, 관계, 제약조건 정의
- 하나만 존재
내부 스키마:
- 물리적 저장 구조
- 인덱스, 저장 순서 등
- 시스템 레벨
문제 19. 제어 흐름 그래프 - 분기 커버리지
문제
아래 제어 흐름 그래프가 분기 커버리지를 만족하기 위한 테스팅 순서를 쓰시오.
제어 흐름 그래프:
1
↓
2
↙ ↘
3 4
↓ ↓
5 6
↘ ↙
7정답
1234561, 124567 또는 1234567, 124561
해설
분기 커버리지 (Branch Coverage):
- 모든 분기(조건문)의 각 분기를 최소한 한 번씩 실행
- 각 엣지(화살표)를 최소한 한 번씩 통과
제어 흐름 그래프 분석:
노드: 1, 2, 3, 4, 5, 6, 7
엣지: 1→2, 2→3, 2→4, 3→5, 4→6, 5→7, 6→7분기 커버리지 조건:
- 모든 엣지를 최소 한 번씩 통과해야 함
테스트 경로:
방법 1:
- 경로 1:
1→2→3→5→7(엣지: 1→2, 2→3, 3→5, 5→7) - 경로 2:
1→2→4→6→7(엣지: 1→2, 2→4, 4→6, 6→7) - 모든 엣지 커버: ✅
방법 2:
- 경로 1:
1→2→3→5→6→7(엣지: 1→2, 2→3, 3→5, 5→6, 6→7) - 경로 2:
1→2→4→5→6→1(엣지: 1→2, 2→4, 4→5, 5→6, 6→1) - 모든 엣지 커버: ✅
엣지 커버리지 표:
| 엣지 | 경로1 | 경로2 |
|---|---|---|
| 1→2 | ✅ | ✅ |
| 2→3 | ✅ | - |
| 2→4 | - | ✅ |
| 3→5 | ✅ | - |
| 4→6 | - | ✅ |
| 5→7 | ✅ | - |
| 6→7 | - | ✅ |
정답:
1234567, 124567(모든 엣지 커버)- 또는
1234561, 124561(순환 포함)
문제 20. 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 obj = new Child();
System.out.println(obj.getX());
}
}
정답
500
해설
실행 과정:
new Child()호출:Child()생성자 실행
Child()생성자:this(5000)호출Child(int x)생성자 실행
Child(int x)생성자:this.x = 5000(Child의 x)- 부모 생성자 자동 호출:
super()(매개변수 없음)
Parent()생성자:this(500)호출Parent(int x)생성자 실행
Parent(int x)생성자:this.x = 500(Parent의 x)
obj.getX()호출:getX()는 Parent 클래스의 메서드return x→ Parent의x반환x = 500
생성자 호출 순서:
Child()
→ Child(5000)
→ Parent() (super() 자동 호출)
→ Parent(500)변수 상태:
| 객체 | Parent의 x | Child의 x |
|---|---|---|
| 초기값 | 100 | 4000 |
| 생성자 실행 후 | 500 | 5000 |
메서드 호출:
getX()는 Parent 클래스의 메서드- Parent의
x를 반환:500
핵심 개념:
- 생성자 체이닝:
this()로 같은 클래스의 다른 생성자 호출 - super(): 부모 생성자 호출 (자동 호출됨)
- 변수 숨김: Child의
x가 Parent의x를 숨김 - 메서드 상속:
getX()는 Parent의 메서드
정리
출제 영역별 분류
| 영역 | 문제 수 | 문제 번호 |
|---|---|---|
| 프로그래밍 언어 | 8 | 1, 2, 3, 9, 14, 15, 17, 20 |
| 데이터베이스 | 4 | 12, 13, 16, 18 |
| 네트워크 | 4 | 5, 6, 7, 10 |
| 소프트웨어 공학 | 2 | 4, 11 |
| 보안 | 1 | 8 |
| 테스트 | 1 | 19 |
핵심 개념 정리
- static 변수: 클래스 변수, 모든 인스턴스 공유
- 포인터와 배열: 배열 이름은 주소, 포인터는 주소 저장
- 문자열 비교: 이중 반복문으로 공통 문자 찾기
- AJAX: 비동기 웹 통신 기술
- 가상회선/데이터그램: 패킷 교환 방식
- L2TP: 2계층 터널링 프로토콜
- SSH: 보안 원격 접속 (포트 22)
- 악성코드: 웜, 트로이 목마, 바이러스
- 이진수 변환: 나머지 연산으로 자리수 추출
- ICMP: 네트워크 제어 메시지 프로토콜
- Proxy 패턴: 객체 접근 제어
- 튜플/인스턴스/카디널리티: 데이터베이스 용어
- SQL DELETE: 행 삭제
- 버블 정렬: 인접 요소 비교 및 교환
- Python 집합: 중복 없는 요소 집합
- GROUP BY/HAVING: 그룹화 및 그룹 필터링
- 추상 클래스: abstract 키워드
- 3단계 스키마: 외부/개념/내부 스키마
- 분기 커버리지: 모든 분기 테스트
- 생성자 체이닝: this(), super() 호출
작성일: 2023년
시험: 정보처리기사 실기 2023년 1회
유형: 복원 문제
'BackEnd > 정보처리기사' 카테고리의 다른 글
| 정보처리기사 실기 - 2023년 3회 - 문제해설 (0) | 2026.02.24 |
|---|---|
| [2023년 2회] 정보처리기사 실기 - 문제해설 (0) | 2026.02.24 |
| 2024년 정보처리기사 실기 2회 -문제해설 (0) | 2026.02.23 |
| [2024년 1회] 정보처리기사 실기 복원 문제 해설 (0) | 2026.02.22 |
| [2025년 2회] 정보처리기사 실기 - 문제 해설 (0) | 2026.02.22 |