22-1
아래 Java 프로그램이 스레드를 만들어 실행한 뒤 "A1 go"와 "done"을 차례로 출력하도록, 밑줄 친 빈칸에 들어갈 코드를 적으시오.
class Ticker implements Runnable {
private final String tag;
Ticker(String tag) {
this.tag = tag;
}
public void run() {
System.out.println(tag + " go");
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(new ________("A1"));
worker.start();
worker.join();
System.out.println("done");
}
}Ticker
[해설]
Thread 생성자에는 run()을 구현한 Runnable 객체를 넘겨야 한다. 이 코드에서 Runnable을 구현한 클래스는 Ticker뿐이다.
start()를 호출하면 새 스레드에서 run()이 실행되어 "A1 go"가 찍힌다. join()은 그 스레드가 끝날 때까지 main을 기다리게 하므로 "done"은 항상 뒤에 나온다.
start() 대신 run()을 직접 부르면 새 스레드 없이 main 스레드에서 그냥 메서드가 실행된다는 점도 함께 기억해 두자.
22-1
조직이 정보 자산을 지키기 위해 정책·조직·위험관리·보호대책을 체계적으로 수립하고 운영하는 '정보보호 관리체계'를 영문 약어로 적으시오.
ISMS
[해설]
정보보호 관리체계는 ISMS(Information Security Management System)다.
국내에서는 한국인터넷진흥원(KISA)이 인증을 주관한다. 개인정보 보호 요건까지 더한 통합 인증은 ISMS-P다.
22-1
다음 Java 프로그램을 실행했을 때 출력되는 값을 적으시오.
class Pair {
int p;
int q;
}
public class Main {
static void triple(Pair t) {
t.p *= 3;
}
static void absorb(Pair t) {
t.q += t.p;
}
static void reset(Pair t) {
t = new Pair();
t.p = 0;
}
public static void main(String[] args) {
Pair s = new Pair();
s.p = 15;
triple(s);
s.q = s.p - 5;
absorb(s);
reset(s);
System.out.print(s.p + s.q);
}
}130
[해설]
메서드에는 객체의 참조값이 복사되어 전달되므로, 매개변수로 필드를 바꾸면 main의 s 객체가 직접 바뀐다.
- triple(s): p = 15 × 3 = 45
- s.q = 45 − 5 = 40
- absorb(s): q = 40 + 45 = 85
- reset(s): 매개변수 t가 새 객체를 가리키게 될 뿐, s는 그대로
reset 안에서 참조 자체를 바꾼 것은 호출한 쪽에 영향이 없다. 따라서 45 + 85 = 130이 출력된다.
22-1
키보드·마우스 같은 별도 입력 장치 대신 사용자의 몸짓, 음성, 터치 같은 신체 동작으로 기기를 조작하는 사용자 인터페이스를 영문 약어로 적으시오.
NUI
[해설]
사람의 자연스러운 신체 동작을 그대로 입력으로 쓰는 인터페이스는 NUI(Natural User Interface)다.
몸짓·음성·터치처럼 평소에 하는 동작으로 기기를 조작하므로 별도의 입력 장치 사용법을 익힐 필요가 없다. 스마트폰 터치, 음성 비서, 동작 인식 게임기가 대표적인 예다.
혼동 주의: CLI는 명령어를 글자로 입력하고, GUI는 아이콘·메뉴를 마우스로 조작하며, OUI는 사물 자체가 입출력 장치가 되는 인터페이스다.
22-1
무선랜 보안 표준 WPA에서 WEP의 고정 키 문제를 보완하려고 도입한 '임시 키 무결성 프로토콜'을 영문 약어로 적으시오.
TKIP
[해설]
임시 키 무결성 프로토콜은 TKIP(Temporal Key Integrity Protocol)이다.
WEP은 같은 키를 계속 써서 키가 쉽게 노출되었다. TKIP은 패킷마다 키를 바꾸어 쓰고 메시지 무결성 검사(MIC)를 더해 이를 보완했다.
이후 WPA2에서는 AES 기반의 CCMP가 표준 암호 방식이 되었다.
22-1
다음 C 프로그램의 출력 결과를 적으시오.
#include <stdio.h>
int prime(int n) {
if (n < 2)
return 0;
for (int d = 2; d * d <= n; d++)
if (n % d == 0)
return 0;
return 1;
}
int main(void) {
int target = 1122, answer = 0;
for (int k = target; k >= 2; k--) {
if (target % k == 0 && prime(k)) {
answer = k;
break;
}
}
printf("%d", answer);
return 0;
}17
[해설]
k를 target부터 1씩 줄이다가 target의 약수이면서 소수인 첫 값에서 break하므로, 이 프로그램은 가장 큰 소인수를 구한다.
1122 = 2 × 3 × 11 × 17
17을 넘는 약수 1122·561·374·187·102·66·51·34·33·22는 모두 합성수라 처음 만나는 소수 약수는 17이다.
prime 함수는 d × d ≤ n인 범위까지만 나눠 봐도 소수인지 충분히 판정할 수 있다.
22-1
데이터베이스 장애 복구에 쓰이는 연산에 대한 설명이다. ①, ②에 해당하는 것을 [보기]에서 골라 적으시오.
- ① 로그를 살펴 시작(Start) 기록과 완료(Commit) 기록이 모두 남아 있는 트랜잭션을 찾아, 그 작업을 로그대로 다시 수행해 반영한다.
- ② 로그를 살펴 시작(Start) 기록은 있으나 완료(Commit) 기록이 없는 트랜잭션을 찾아, 그 트랜잭션이 바꿔 놓은 내용을 모두 되돌린다.
[보기] Checkpoint Recovery, Redo, Rollback, Shadow Paging Recovery, Undo
① Redo
② Undo
[해설]
장애 복구에서는 로그의 Start·Commit 기록을 보고 트랜잭션별 처리를 정한다.
- Redo — Start와 Commit이 모두 있는 트랜잭션은 완료된 결과를 지키기 위해 로그대로 다시 수행한다.
- Undo — Start만 있고 Commit이 없는 트랜잭션은 원자성을 지키기 위해 변경분을 모두 취소한다.
혼동 주의: Checkpoint Recovery는 검사점 이후 로그만 보고 Redo·Undo 범위를 줄이는 기법이고, Shadow Paging은 로그 없이 그림자 페이지 테이블로 되돌리는 방식이다.
22-1
다음 설명에 해당하는 공격 기법을 [보기]에서 골라 적으시오.
- 표적이 된 조직의 구성원이 평소 즐겨 찾는 정상 웹사이트를 먼저 알아낸다.
- 그 사이트를 미리 감염시켜 두고 기다리다가, 표적이 접속하면 그 PC에 악성코드를 내려보낸다.
[보기] Business SCAM, Cyber Kill Chain, Drive by Download, Pharming, Phishing, Ransomware, Watering Hole
Watering Hole
[해설]
표적이 자주 들르는 합법 사이트에 함정을 놓고 기다리는 방식은 워터링 홀(Watering Hole)이다. 맹수가 물웅덩이 근처에서 먹잇감을 기다리는 모습에서 이름이 왔다.
- Drive by Download: 방문만으로 악성코드가 설치되는 감염 수법 자체(표적을 정하지 않음)
- Pharming: DNS 등을 조작해 정상 주소 입력 시 가짜 사이트로 유도
- Phishing: 가짜 메일·사이트로 개인정보를 낚음
워터링 홀은 특정 조직을 노리는 APT 공격의 초기 침투에 주로 쓰인다.
22-1
다음 Python 코드의 실행 결과를 적으시오.
def bill(qty, rate=3):
print('qty=', qty, 'cost=', qty * rate)
bill(12)
bill(4, 10)qty= 12 cost= 36
qty= 4 cost= 40
[해설]
rate=3은 기본값 매개변수라서, 인자를 하나만 넘기면 rate에 3이 쓰인다.
- bill(12): rate=3 → 12 × 3 = 36
- bill(4, 10): 넘긴 10이 기본값을 덮어씀 → 4 × 10 = 40
print에 여러 값을 쉼표로 넘기면 사이에 공백 하나가 들어가므로 'qty='와 12 사이에도 공백이 생긴다. 출력은 qty= 12 cost= 36, qty= 4 cost= 40 두 줄이다.
22-1
아래 특징을 갖는 RAID 구성의 레벨을 숫자로 적으시오.
- 데이터를 일정 크기의 조각으로 쪼개 여러 디스크에 번갈아 나누어 기록(스트라이핑)한다.
- 같은 데이터를 복제해 두지도 않고, 오류 검출용 패리티 정보도 따로 두지 않는다.
- 여러 디스크가 동시에 읽고 쓰므로 속도와 가용 용량 면에서는 유리하지만, 디스크 하나만 고장 나도 데이터를 되살릴 수 없다.
0
[해설]
중복(미러링)도 패리티도 없이 스트라이핑만 하는 구성은 RAID 0이다.
디스크 전체 용량을 모두 쓸 수 있고 입출력이 분산되어 빠르다. 대신 한 디스크의 장애가 곧 전체 데이터 손실로 이어진다.
- RAID 1: 같은 데이터를 두 디스크에 그대로 복제(미러링)
- RAID 5: 패리티를 여러 디스크에 분산 저장, 디스크 1개 장애까지 복구
- RAID 6: 패리티를 이중으로 두어 디스크 2개 장애까지 복구
22-1
V 모델에서 왼쪽의 개발 단계와 오른쪽의 테스트 단계는 아래 표처럼 짝을 이룬다. ①~④에 들어갈 테스트 단계의 이름을 적으시오.
| 개발 단계(왼쪽, 위→아래) | 대응 테스트(오른쪽) | 검증 내용 |
|---|---|---|
| (사용자 요구 전체) | ( ④ ) | 사용자가 실제 운영 관점에서 받아들일 수 있는지 확인 |
| 요구 분석 | ( ③ ) | 요구 분석 결과대로 시스템 전체가 동작하는지 검증 |
| 시스템 설계 | ( ② ) | 모듈 사이의 인터페이스가 올바른지 검증 |
| 모듈 설계 | ( ① ) | 모듈 하나하나가 설계대로 동작하는지 검증 |
| 코딩 | — | V의 꼭짓점(구현) |
※ 테스트는 ① → ② → ③ → ④ 순서로 진행된다.
① 단위 테스트
② 통합 테스트
③ 시스템 테스트
④ 인수 테스트
[해설]
V 모델은 개발 단계마다 짝이 되는 테스트를 두어, 구현에서 가까운 것부터 단위 → 통합 → 시스템 → 인수 순으로 올라간다.
- 단위 테스트: 모듈 설계 ↔ 개별 모듈 검증
- 통합 테스트: 시스템 설계 ↔ 모듈 간 인터페이스 검증
- 시스템 테스트: 요구 분석 ↔ 시스템 전체 기능·비기능 검증
- 인수 테스트: 사용자 요구 ↔ 사용자 관점 최종 확인(알파·베타 테스트 포함)
22-1
[판매] 테이블에서 상품명과 수량을 조회하되, 수량이 많은 상품부터 차례로 나오게 하려 한다. SQL 문의 빈칸 ①~③을 채우시오.
[판매]
| 상품명 | 수량 |
|---|---|
| 연필 | 42 |
| 지우개 | 17 |
| 공책 | 65 |
| 자 | 9 |
| 색연필 | 30 |
SELECT 상품명, 수량 FROM 판매
( ① ) BY ( ② ) ( ③ );① ORDER
② 수량
③ DESC
[해설]
결과 행의 순서를 정하는 절은 ORDER BY이고, 정렬 기준은 수량 열이다.
정렬 방향을 생략하면 오름차순(ASC)이므로, 큰 값부터 나오게 하려면 DESC를 붙여야 한다.
실행하면 공책 65, 연필 42, 색연필 30, 지우개 17, 자 9 순으로 조회된다.
22-1
Python 리스트 메서드에 대한 설명이다. ①~③에 해당하는 메서드를 [보기]에서 골라 적으시오.
- ① 반복 가능한 객체를 인자로 받아, 그 안의 요소들을 리스트 끝에 하나씩 이어 붙여 리스트를 늘린다.
- ② 맨 끝 요소(또는 인덱스로 지정한 요소)를 리스트에서 빼내고, 빼낸 값을 돌려준다.
- ③ 리스트 안 요소들의 배치를 앞뒤로 뒤집는다.
[보기] extend( ), index( ), insert( ), pop( ), remove( ), reverse( ), select( ), sort( )
① extend( )
② pop( )
③ reverse( )
[해설]
설명에 맞는 Python 리스트 메서드는 extend(), pop(), reverse()다.
- extend()는 반복 가능한 객체의 요소를 하나씩 꺼내 리스트 끝에 덧붙인다.
- pop()은 맨 끝 요소(또는 지정한 인덱스의 요소)를 빼내고 그 값을 돌려준다.
- reverse()는 리스트 자체의 순서를 뒤집고 None을 반환한다.
혼동 주의: append([7, 8])은 리스트 전체를 요소 하나로 넣고, remove(x)는 값 x를 찾아 지우지만 반환값이 없다.
22-1
다음 설명에 해당하는 인터페이스 구현 검증 도구의 이름을 적으시오.
- xUnit 계열에 속하는, Java 언어용 테스트 도구이다.
- 에리히 감마(Erich Gamma)와 켄트 벡(Kent Beck) 등이 만든 오픈 소스 단위 테스트 프레임워크이다.
JUnit
[해설]
Java를 대상으로 하는 xUnit 계열 단위 테스트 프레임워크는 JUnit이다.
@Test를 붙인 메서드를 테스트로 실행하고, assertEquals 같은 단언문으로 기대값과 실제값을 비교한다.
- NUnit: .NET용 xUnit
- FitNesse: 웹 기반 테스트 케이스 설계·실행 도구
- Selenium: 웹 애플리케이션 테스트 자동화 도구
22-1
양의 정수의 자릿수를 거꾸로 뒤집어 출력하는 C 프로그램이다(예: 5821 → 1285). 빈칸 ①~③에 알맞은 연산자를 적으시오. 단, 일의 자리가 0인 정수는 고려하지 않는다.
#include <stdio.h>
int main(void) {
int n = 5821;
int rev = 0;
while (n ( ① ) 0) {
rev = rev * 10 + n ( ② ) 10;
n = n ( ③ ) 10;
}
printf("%d", rev);
return 0;
}① > (또는 !=)
② %
③ /
[해설]
반복마다 n % 10으로 끝자리를 떼어 rev 뒤에 붙이고, n / 10으로 끝자리를 버린다. n이 0이 되면 더 뗄 자리가 없으므로 조건은 n > 0(또는 n != 0)이다.
- 1회: rev=1, n=582
- 2회: rev=12, n=58
- 3회: rev=128, n=5
- 4회: rev=1285, n=0 → 종료
일의 자리가 0이면 뒤집은 수의 맨 앞 0이 사라지므로 문제에서 제외한 것이다.
22-1
소프트웨어 테스트 기법 목록이다. 이 가운데 명세 기반(블랙박스) 테스트 기법 세 가지를 찾아 적으시오.
- 결정 커버리지
- 경계값 분석
- 기초 경로 검사
- 기초 경로 커버리지
- 동등 분할
- 문장 커버리지
- 원인-결정 그래프
- 원인-결과 그래프
① 경계값 분석(Boundary Value Analysis)
② 동등 분할(Equivalence Partitioning)
③ 원인-결과 그래프(Cause-Effect Graph)
[해설]
명세만 보고 입력과 출력으로 검사하는 블랙박스 테스트 기법을 고르는 문제다.
- 경계값 분석은 오류가 잦은 입력 범위의 경계값과 그 바로 앞뒤 값을 테스트한다.
- 동등 분할은 같은 결과를 내는 입력끼리 그룹으로 나눠 그룹마다 대표값으로 테스트한다.
- 원인-결과 그래프는 입력 조건(원인)과 출력(결과)의 관계를 그래프로 분석해 테스트 케이스를 만든다.
혼동 주의: 문장·결정 커버리지와 기초 경로 검사는 코드 내부 구조를 보는 화이트박스 기법이고, 원인-결정 그래프는 실제로는 없는 기법 이름이다.
22-1
릴레이션의 키가 갖추어야 할 성질에 관한 설명이다. 빈칸 ①, ②에 알맞은 용어를 적으시오.
- 슈퍼키는 ( ① )만 만족하면 된다.
- 후보키는 ( ① )과 ( ② )을 모두 만족해야 한다.
① 유일성
② 최소성
[해설]
모든 튜플을 서로 구별할 수 있는 성질이 유일성이다. 슈퍼키는 이것만 만족하면 되므로 불필요한 속성이 섞여 있어도 된다.
속성을 하나라도 빼면 유일성이 깨지는 꼭 필요한 속성만으로 이루어졌다는 성질이 최소성이다. 후보키는 두 성질을 모두 갖추며, 그중 하나를 골라 기본키로 삼는다.
22-1
다음 C 프로그램의 출력 결과를 적으시오.
#include <stdio.h>
int calc(int n) {
if (n <= 2)
return n;
return n * calc(n - 2);
}
int main(void) {
int start = 7;
printf("%d", calc(start));
return 0;
}105
[해설]
calc 는 n 이 2 이하가 될 때까지 n−2 로 자신을 다시 호출하고, 돌아오면서 값을 곱하는 재귀 함수다.
- calc(7) = 7 × calc(5)
- calc(5) = 5 × calc(3)
- calc(3) = 3 × calc(1)
- calc(1) 은 종료 조건(n ≤ 2)에 걸려 1을 반환한다.
따라서 7 × 5 × 3 × 1 = 105가 출력된다.
22-1
소프트웨어 분석 도구에 관한 설명이다. ①, ②에 해당하는 것을 [보기]에서 골라 적으시오.
- ① 프로그램을 실행하지 않은 상태에서 원시 코드만 살펴 결함이나 코딩 규칙 위반을 찾는다.
- ② 프로그램을 실제로 실행하면서 동작과 반응을 추적·보고한다. 실행 중 모니터링이나 스냅샷 생성 기능을 이용한다.
[보기] Dynamic Analysis, React Analysis, Requirements Analysis, Running Analysis, Static Analysis
① Static Analysis
② Dynamic Analysis
[해설]
분석 도구는 코드를 실행하지 않으면 정적, 실행하면서 보면 동적 분석으로 나뉜다.
- Static Analysis(정적 분석)는 원시 코드만 살펴 결함과 코딩 규칙 위반을 찾는다(예: PMD, Checkstyle, SonarQube).
- Dynamic Analysis(동적 분석)는 프로그램을 실제로 실행하며 동작·메모리 사용 등을 추적한다(예: Valgrind).
외우는 요령: Static 은 '멈춰 있는' 코드, Dynamic 은 '움직이는' 프로그램을 본다고 기억한다.
22-1
정규화되지 않은 릴레이션에서 생기는 이상(Anomaly) 현상 가운데 삭제 이상이 무엇인지 간략히 서술하시오.
튜플을 삭제할 때 지우려던 것이 아닌 다른 정보까지 함께 삭제되는 현상
[해설]
삭제 이상은 정규화되지 않은 릴레이션에서 생기는 세 가지 이상(삽입·삭제·갱신) 가운데 하나다.
튜플 하나를 지웠는데 의도하지 않은 다른 정보까지 함께 사라지는 현상이다. 예를 들어 [수강] 릴레이션에서 어떤 강좌의 마지막 수강생을 지우면 그 강좌 정보도 함께 없어진다.
혼동 주의: 삽입 이상은 필요 없는 정보까지 있어야 입력할 수 있는 것이고, 갱신 이상은 일부 튜플만 수정돼 데이터가 서로 맞지 않게 되는 것이다.