20-4
아래 Python 프로그램을 실행했을 때 출력 결과를 적으시오.
grid = [[5, 8], [2, 4, 6, 1], [9, 3, 7]]
print(grid[2])
print(grid[1][2])
for row in grid:
for v in row:
print(v, end='')
print()[9, 3, 7]
6
58
2461
937
[해설]
grid[2]는 세 번째 리스트 자체이므로 리스트 형식 그대로 [9, 3, 7]이 찍힌다.
grid[1][2]는 두 번째 리스트 [2, 4, 6, 1]의 인덱스 2 원소인 6이다.
- 안쪽 for는 end=''라 줄을 바꾸지 않고 원소를 이어 붙인다.
- 한 행이 끝나면 print()가 줄을 바꾼다.
그래서 행마다 58, 2461, 937이 한 줄씩 출력된다.
20-4
네트워크 보안 위협 중 스니핑(Sniffing)이 무엇인지 간단히 서술하시오.
네트워크를 오가는 패킷을 몰래 엿들어(도청) 정보를 빼내는 수동적 공격
[해설]
스니핑은 네트워크로 전송되는 패킷을 도청해 계정·비밀번호 등을 가로채는 공격이다.
데이터를 바꾸지 않고 엿보기만 하므로 수동적 공격에 속하며, 이 때문에 탐지가 어렵다.
랜카드를 무차별 모드(Promiscuous Mode)로 두어 자기 앞이 아닌 패킷까지 수집하는 방식이 대표적이다. 대응책은 SSL/TLS·SSH 같은 암호화 통신 사용이다.
20-4
다음 설명에 해당하는 기술을 적으시오.
- 중앙 관리자 없이 P2P 네트워크의 참여자들이 같은 거래 장부를 나누어 보관하는 분산 원장 기술이다.
- 거래 기록을 묶은 '블록'을 앞 블록의 해시값과 이어 사슬 형태로 저장하므로, 한 곳을 고치면 뒤따르는 연결이 모두 깨져 위·변조가 사실상 불가능하다.
- 기록은 참여자 누구나 열람할 수 있다.
블록체인(Blockchain)
[해설]
중앙 관리자 없이 참여자가 같은 장부를 나눠 갖는 분산 원장 기술의 대표가 블록체인(Blockchain)이다.
각 블록은 앞 블록의 해시값을 담아 사슬처럼 이어진다. 그래서 과거 블록 하나를 고치면 뒤따르는 모든 해시가 어긋나 위·변조가 드러난다.
새 블록은 참여 노드들의 합의(작업증명 PoW, 지분증명 PoS 등)를 거쳐 붙으므로 탈중앙화된 신뢰가 만들어진다.
20-4
아래 Java 프로그램의 출력 결과를 적으시오.
class Base {
int calc(int n) {
if (n <= 1) return n;
return calc(n - 1) + calc(n - 2);
}
}
class Sub extends Base {
@Override
int calc(int n) {
if (n <= 1) return 1;
return calc(n - 2) + 2 * calc(n - 3);
}
}
public class Main {
public static void main(String[] args) {
Base obj = new Sub();
System.out.print(obj.calc(6));
}
}11
[해설]
obj는 Base 타입이지만 실제 객체가 Sub이므로, calc 호출과 그 안의 재귀 호출이 모두 Sub의 calc로 연결된다(동적 바인딩).
- n ≤ 1(음수 포함)이면 1: calc(1)=1, calc(0)=1, calc(-1)=1
- calc(2) = calc(0) + 2×calc(-1) = 3
- calc(3) = calc(1) + 2×calc(0) = 3
- calc(4) = calc(2) + 2×calc(1) = 5
- calc(6) = calc(4) + 2×calc(3) = 5 + 6 = 11
따라서 출력은 11이다. Base의 피보나치식 calc(6)=8로 계산하면 틀린다.
20-4
다음 설명에 해당하는 인터넷 프로토콜의 이름을 적으시오.
- 32비트 주소 체계의 한계로 주소가 부족해지는 문제를 풀기 위해 등장한 차세대 IP이다.
- 주소 길이를 128비트로 늘렸고, 인증·암호화(보안)와 이동 단말 지원을 기본 설계에 포함하였다.
IPv6
[해설]
128비트 주소를 쓰는 차세대 인터넷 프로토콜은 IPv6(Internet Protocol version 6)이다.
IPv4는 32비트라 약 43억 개의 주소밖에 만들 수 없다. IPv6는 16비트씩 8구간을 콜론(:)으로 나누어 16진수로 표기한다.
IPv6 주소 유형은 유니캐스트·멀티캐스트·애니캐스트 세 가지이며, IPv4의 브로드캐스트는 없다.
20-4
시험 점수에 따라 등급을 매기는 프로그램을 검사하려 한다. 등급 기준과 준비한 테스트 입력값이 다음과 같을 때, 적용된 블랙박스 테스트 기법의 이름을 적으시오.
| 점수 구간 | 등급 |
|---|---|
| 0 이상 60 미만 | 가 |
| 60 이상 70 미만 | 양 |
| 70 이상 80 미만 | 미 |
| 80 이상 90 미만 | 우 |
| 90 이상 100 이하 | 수 |
[테스트 입력값] -20, 42, 66, 73, 84, 97, 125
동치 분할 테스트(Equivalence Partitioning)
[해설]
입력값이 각 구간의 경계가 아니라 구간 안쪽의 대표값이므로 동치(동등) 분할 테스트이다.
- 유효 구간 다섯 개에서 하나씩: 42(가), 66(양), 73(미), 84(우), 97(수)
- 무효 구간 두 개에서 하나씩: -20(0 미만), 125(100 초과)
입력을 결과가 같은 묶음(동치 클래스)으로 나누고, 묶음마다 대표값 하나만 시험하는 방식이다.
59·60·89·90처럼 구간의 끝값을 고르면 경계값 분석이 된다.
20-4
아래 Java 프로그램은 정수 45를 6자리 2진수로 바꾸어 출력한다. 실행 결과가 101101이 되도록 빈칸 ①, ②에 알맞은 식을 적으시오.
public class Main {
public static void main(String[] args) {
int[] bits = new int[6];
int num = 45;
int pos = 0;
while ( ① ) {
bits[pos] = ( ② );
num = num / 2;
pos++;
}
for (int k = bits.length - 1; k >= 0; k--)
System.out.print(bits[k]);
}
}① num > 0
② num % 2
[해설]
10진수를 2진수로 바꾸려면 2로 나눈 나머지를 아래 자리부터 모으고, 몫이 0이 될 때까지 이를 되풀이한다.
- 반복 조건 num > 0: 몫이 0이 되면 더 만들 자릿수가 없으므로 반복을 멈춘다.
- 저장할 값 num % 2: 지금 자리의 비트(0 또는 1)이다.
45→1, 22→0, 11→1, 5→1, 2→0, 1→1 순서로 bits[0]~bits[5]가 채워진다. 뒤의 for 문이 bits[5]부터 거꾸로 출력하므로 101101이 된다.
20-4
운영체제의 프로세스 상태 전이를 표로 정리하였다. 빈칸 ①~③에 알맞은 상태의 이름을 적으시오.
| 현재 상태 | 사건 | 다음 상태 |
|---|---|---|
| 생성 | 승인(메모리 적재) | ( ① ) |
| ( ① ) | 디스패치(CPU 할당) | ( ② ) |
| ( ② ) | 할당 시간 만료(타이머 런아웃) | ( ① ) |
| ( ② ) | 입출력 요청 등 사건 대기 | ( ③ ) |
| ( ③ ) | 입출력 완료(웨이크업) | ( ① ) |
| ( ② ) | 작업 끝 | 완료(종료) |
① 준비(Ready)
② 실행(Running)
③ 대기(Waiting)
[해설]
프로세스는 생성 → 준비 → 실행 → 완료 순서로 진행하는 것이 기본이고, 실행 중 일어나는 사건에 따라 준비 상태나 대기 상태로 옮겨 간다.
- 준비(Ready): 메모리에 올라와 CPU를 배정받기만 기다리는 상태이며, 할당 시간이 끝난 프로세스도 이 상태로 돌아온다.
- 실행(Running): 디스패치로 CPU를 받아 명령을 수행하는 상태이다.
- 대기(Waiting): 입출력 같은 사건이 끝나기를 기다리며 멈춰 있는 상태로, Blocked라고도 한다.
혼동 주의: 대기 상태의 프로세스는 입출력이 끝나도 곧바로 실행 상태로 가지 않는다. 먼저 웨이크업으로 준비 상태에 들어간다.
20-4
다음 설명에 해당하는 운영체제를 적으시오.
- 1970년 무렵 벨 연구소에서 켄 톰슨과 데니스 리치 등이 개발하였다.
- 대부분이 C 언어로 작성되어 있어 다른 하드웨어로 옮기기(이식) 쉽다.
- 커널과 셸로 나뉜 모듈 구조이며, 다중 사용자·다중 작업을 지원한다.
- 파일 시스템이 루트(/)에서 뻗어 나가는 계층적 트리 구조라 파일 관리가 편하다.
유닉스(UNIX)
[해설]
벨 연구소에서 개발했고 C 언어로 작성해 이식성이 높은 운영체제는 유닉스(UNIX)이다.
- 커널은 하드웨어·프로세스·메모리를 관리하는 핵심 부분이다.
- 셸은 사용자가 입력한 명령을 해석해 커널에 전달하는 명령 해석기이다.
파일 시스템은 루트(/)에서 뻗어 나가는 계층적 트리 구조이다. 리눅스와 macOS가 이 설계를 이어받았다.
20-4
테스트 오라클의 종류 중 다음 설명에 해당하는 것을 적으시오.
- 가능한 모든 입력이 아니라, 미리 골라 둔 일부 입력값에 대해서만 올바른 기대 결과를 제공한다.
- 그 밖의 입력값에 대해서는 결과를 판정해 주지 않는다.
샘플링 오라클(Sampling Oracle)
[해설]
선택한 일부 입력에 대해서만 기대 결과를 주는 것은 샘플링 오라클(Sampling Oracle)이다.
- 참(True) 오라클: 모든 입력값에 대해 기대 결과를 제공해 모든 오류를 검출할 수 있다.
- 추정(Heuristic) 오라클: 샘플링 오라클을 개선해, 나머지 입력에는 추정으로 결과를 제공한다.
- 일관성(Consistent) 검사 오라클: 변경 전후 결과가 같은지를 확인한다.
테스트 오라클은 테스트 결과가 맞는지 판단하는 기준, 곧 참값을 대입해 비교하는 기법이다.
20-4
아래 Java 프로그램의 [실행 결과]를 참고해 빈칸 ①, ②에 들어갈 값을 적으시오. (단, 배열은 반복문이 접근하는 범위에 꼭 맞는 최소 크기로 선언한다.)
public class Main {
public static void main(String[] args) {
int[][] tbl = new int[ ① ][ ② ];
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 3; c++) {
tbl[r][c] = c * 4 + r + 1;
System.out.print(tbl[r][c] + " ");
}
System.out.println();
}
}
}[실행 결과]
1 5 9
2 6 10
3 7 11
4 8 12① 4
② 3
[해설]
바깥 반복 r이 0~3(4회), 안쪽 반복 c가 0~2(3회) 돌며 tbl[r][c]에 접근하므로 배열은 4행 3열이어야 한다.
값은 c×4 + r + 1이라 열이 하나 넘어갈 때마다 4씩 커진다. 예컨대 r=1, c=2이면 2×4+1+1=10이다.
따라서 ①은 4, ②는 3이다. 크기를 더 작게 잡으면 ArrayIndexOutOfBoundsException이 난다.
20-4
정보보안의 3대 요소 중 가용성(Availability)의 의미를 간단히 서술하시오.
인가된 사용자가 필요할 때 언제든 정보와 서비스를 이용할 수 있도록 보장하는 성질
[해설]
가용성은 권한 있는 사용자가 원할 때 서비스·자원을 중단 없이 쓸 수 있게 보장하는 특성이다.
- 기밀성(Confidentiality): 인가된 사용자만 정보에 접근할 수 있다.
- 무결성(Integrity): 인가된 사용자만 정보를 정해진 방법으로 고칠 수 있다.
- 가용성(Availability): 인가된 사용자가 필요할 때 쓸 수 있다.
가용성을 해치는 대표 공격은 DoS·DDoS이며, 이중화·백업·부하 분산으로 대비한다.
20-4
다음 설명에 해당하는 기술을 적으시오.
- 라우터가 패킷을 중계하면서, 내부망에서 쓰는 사설 IP 주소(와 포트)를 외부에 보이는 공인 IP 주소(와 포트)로 바꾸어 기록하고, 돌아오는 패킷은 반대로 되바꾼다.
- 공인 IP 주소 하나로 여러 내부 호스트가 인터넷을 쓸 수 있어 주소 부족을 덜고, 내부 구조를 숨기는 효과도 있다.
NAT
[해설]
사설 IP와 공인 IP를 서로 바꿔 주는 기술은 NAT(Network Address Translation, 네트워크 주소 변환)이다.
라우터는 나가는 패킷의 출발지 주소를 공인 IP로 바꿔 기록하고, 돌아오는 패킷은 그 기록을 보고 내부 사설 IP로 되돌린다. 외부에서는 내부 호스트 주소가 보이지 않아 내부 구조를 숨기는 효과도 있다.
혼동 주의: 포트 번호까지 바꿔 공인 IP 하나를 여러 호스트가 나눠 쓰는 방식은 NAT의 한 형태인 PAT(NAPT)다. 답은 상위 개념인 NAT로 쓴다.
20-4
[사원] 테이블에서 부서마다 사원(튜플)이 몇 명인지 구하는 SQL 문을 [조건]에 맞게 작성하시오.
[사원]
| 부서 | 이름 |
|---|---|
| 영업 | 김하준 |
| 기획 | 최서연 |
| 영업 | 정민호 |
| 개발 | 윤지아 |
| 영업 | 한도현 |
| 개발 | 서예린 |
[조건]
- WHERE 절은 쓰지 않는다.
- GROUP BY 절을 사용한다.
- 집계 함수를 사용하고, 그 결과 열에는 AS로 별칭을 붙인다.
- 대소문자는 구분하지 않으며, 끝의 세미콜론(;)은 생략해도 된다.
SELECT 부서, COUNT(*) AS 인원수 FROM 사원 GROUP BY 부서;
[해설]
부서별로 묶어야 하므로 GROUP BY 부서, 행 수를 세야 하므로 COUNT(*)를 쓴다.
COUNT(*) 대신 COUNT(부서)나 COUNT(이름)도 NULL이 없으니 같은 결과이며, 별칭 이름은 자유다.
| 부서 | 인원수 |
|---|---|
| 개발 | 2 |
| 기획 | 1 |
| 영업 | 3 |
그룹에 조건을 걸어야 할 때는 WHERE가 아니라 HAVING을 쓴다.
20-4
GoF(Gang of Four) 디자인 패턴을 목적에 따라 나누면 세 가지 유형이 된다. 빈칸에 알맞은 유형을 적으시오.
- 생성 패턴: 객체를 만드는 과정을 캡슐화한다.
- 구조 패턴: 클래스와 객체를 조합해 더 큰 구조를 만든다.
- ( ) 패턴: 객체들이 서로 상호작용하고 책임을 나누는 방법을 다룬다.
행위(Behavioral)
[해설]
객체 간 상호작용과 책임 분배를 다루는 유형은 행위(Behavioral) 패턴이다.
- 생성: Singleton, Factory Method, Abstract Factory, Builder, Prototype
- 구조: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
- 행위: Observer, Strategy, Command, Iterator, State, Template Method, Visitor 등
GoF 패턴은 이렇게 목적 기준 세 유형, 총 23개로 정리된다.
20-4
다음 설명에 해당하는 소프트웨어 프레임워크를 적으시오.
- Java로 작성된 오픈 소스 분산 처리 플랫폼이다.
- 값싼 범용 서버 여러 대를 묶어 하나의 거대한 가상 저장소(HDFS)를 만들고, 그 안의 대용량 데이터를 MapReduce로 나누어 병렬 처리한다.
- 야후, 페이스북 등 대형 인터넷 기업이 빅데이터 처리에 도입하였다.
하둡(Hadoop)
[해설]
HDFS와 MapReduce를 핵심으로 하는 오픈 소스 분산 처리 프레임워크는 하둡(Hadoop)이다.
- HDFS: 데이터를 블록으로 쪼개 여러 노드에 복제 저장하는 분산 파일 시스템
- MapReduce: 작업을 Map(분할 처리)과 Reduce(결과 취합)로 나누는 병렬 처리 모델
- YARN: 클러스터 자원을 관리·배분하는 계층
관계형 DB와 하둡 사이 데이터 이동에는 스쿱(Sqoop)을 쓴다.
20-4
아래 C 프로그램의 실행 결과를 적으시오.
#include <stdio.h>
int main(void) {
const char *s = "GALAXY";
printf("%s\n", s + 2);
printf("%c\n", *(s + 4));
printf("%s\n", s);
printf("%c\n", *s + 3);
printf("%c\n", *s);
return 0;
}LAXY
X
GALAXY
J
G
[해설]
s는 문자열 "GALAXY"의 첫 글자를 가리키는 포인터이고, 인덱스는 G0·A1·L2·A3·X4·Y5다. %s는 그 주소부터 널 문자 전까지, %c는 문자 하나만 출력한다.
- s + 2 — 인덱스 2부터 끝까지 출력해 LAXY.
- *(s + 4) — 인덱스 4의 문자 X.
- s — 문자열 전체인 GALAXY.
- *s + 3 — 'G'에 3을 더한 문자 J.
- *s — 첫 글자 G.
혼동 주의: *s + 3은 연산자 우선순위상 (*s) + 3이지 *(s + 3)이 아니다. 그래서 인덱스 3의 'A'가 아니라 G→H→I→J가 찍힌다.
20-4
정규화가 덜 된 릴레이션에서 데이터 중복 때문에 조작 시 예기치 않은 문제가 생기는 것을 이상(Anomaly) 현상이라 한다. 이상 현상의 종류 세 가지를 적으시오.
① 삽입 이상
② 삭제 이상
③ 갱신 이상
[해설]
이상 현상은 데이터를 넣을 때, 지울 때, 고칠 때 각각 생기므로 삽입 이상·삭제 이상·갱신 이상의 세 가지다.
- 삽입 이상: 원치 않는 값(NULL 등)까지 함께 넣어야 저장이 가능하다.
- 삭제 이상: 한 튜플을 지우면 남겨야 할 다른 정보까지 함께 사라진다(연쇄 삭제).
- 갱신 이상: 중복된 값 중 일부만 바뀌어 데이터가 서로 어긋난다(불일치).
이런 이상은 함수 종속을 분석해 릴레이션을 분해하는 정규화로 없앤다.
20-4
온라인 쇼핑몰 시스템을 UML로 모델링한 다이어그램을 글로 옮긴 것이다. 이 다이어그램의 명칭을 적으시오.
- 위쪽에 작은 탭이 붙은 폴더 모양 사각형 세 개가 있고, 각각 [주문], [가격], [상품]이라는 이름이 적혀 있다.
- [주문]에서 [가격]으로 점선 화살표가 그어져 있다.
- [주문]에서 [상품]으로도 점선 화살표가 있으며, 화살표 옆에 ≪import≫라고 표기되어 있다.
패키지 다이어그램(Package Diagram)
[해설]
위쪽에 탭이 달린 폴더 모양은 UML의 패키지 기호다. 따라서 이 그림은 패키지 다이어그램(Package Diagram)이다.
패키지 다이어그램은 모델 요소를 묶은 패키지들 사이의 의존 관계를 점선 화살표로 나타내는 구조 다이어그램이다. ≪import≫는 대상 패키지의 공개 요소를 가져와 쓴다는 뜻의 스테레오타입이다.
혼동 주의: ≪access≫도 같은 점선 화살표로 그린다. 다만 가져온 요소를 그 패키지 안에서만 비공개로 쓴다는 점이 ≪import≫와 다르다.
20-4
데이터베이스 장애 회복 기법 중 다음 설명에 해당하는 것을 적으시오.
- 트랜잭션이 실행되는 도중에도, 커밋을 기다리지 않고 변경 내용을 즉시 데이터베이스에 기록한다.
- 장애가 나면 로그를 바탕으로, 완료된 트랜잭션은 Redo하고 완료되지 않은 트랜잭션은 Undo한다. 즉 Redo와 Undo를 모두 사용한다.
즉각 갱신 회복 기법(Immediate Update)
[해설]
갱신을 곧바로 DB에 반영하므로 즉각 갱신(Immediate Update) 회복 기법이다.
커밋 전의 변경이 이미 디스크에 있을 수 있어 Undo가 필요하고, 커밋된 변경이 반영 전에 유실될 수도 있어 Redo도 필요하다.
반대로 지연 갱신(Deferred Update)은 커밋 시점까지 반영을 미루므로 Redo만 쓰고 Undo는 필요 없다.