옳지 않은 것은 BSD 유닉스의 모든 코드가 어셈블리 언어로 작성되었다는 설명이다.
유닉스는 커널의 대부분을 C 언어로 작성해 이식성을 높인 운영체제이며, 하드웨어에 밀착된 극히 일부만 어셈블리로 작성된다. BSD 유닉스도 마찬가지다.
- 계층적(트리형) 파일 시스템과 다중 사용자를 지원한다는 설명은 옳다.
- 다중 프로그래밍(다중 작업)으로 CPU 이용률을 높인다는 설명은 옳다.
- 사용자 프로그램이 시스템 호출을 통해 커널 기능을 사용한다는 설명은 옳다.
공격자는 사용자의 합법적 도메인을 탈취하거나 도메인 네임 시스템(DNS) 또는 프락시 서버의 주소를 조하여, 사용자가 진짜 사이트로 오인하여 접속하도록 유도한 후 개인정보를 훔친다.
설명하는 공격은 파밍(Pharming)이다.
파밍은 DNS나 프락시 서버 주소를 조작해 사용자가 올바른 도메인 주소를 입력해도 가짜 사이트로 접속되게 만든 뒤 개인정보를 빼내는 공격이다.
- 스니핑은 네트워크를 지나는 패킷을 몰래 엿보아 정보를 가로채는 수동적 공격이다.
- 트로이 목마는 정상 프로그램으로 위장해 설치된 뒤 악의적 기능을 수행하는 악성 코드다.
- 하이재킹은 이미 인증된 세션 등을 가로채 정상 사용자처럼 행세하는 공격이다.
- ㄱ. ALTER
- ㄴ. DROP
- ㄷ. INSERT
- ㄹ. UPDATE
DDL 명령어는 ALTER와 DROP(ㄱ, ㄴ)이다.
DDL은 테이블·뷰·인덱스 같은 데이터베이스 구조(스키마)를 정의·변경·삭제하는 언어로 CREATE, ALTER, DROP 등이 속한다. INSERT와 UPDATE는 데이터 자체를 조작하는 DML이다.
- ㄱ. ALTER는 기존 테이블 구조를 변경하는 DDL이다.
- ㄴ. DROP은 테이블 등 스키마 객체를 삭제하는 DDL이다.
- ㄷ. INSERT는 튜플을 삽입하는 DML이다.
- ㄹ. UPDATE는 튜플의 값을 수정하는 DML이다.
Y는 이다.
1의 보수에서 최상위 비트가 1이면 음수이고, 전체 비트를 반전한 값이 크기다.
따라서 이다.
의 모든 비트를 반전하면 -21 = 이다.
| 입력 | 출력 | ||
|---|---|---|---|
| A | B | C | Y |
| 0 | 0 | 0 | 1 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 0 |
B
C
B
C
B
C
B
C진리표를 만족하는 함수는 이다.
출력이 1인 입력은 000, 011, 101, 110으로, 모두 1의 개수가 짝수인 경우다. 이는 3입력 XOR의 부정(짝수 패리티)이다.
- 는 A=B=C=0일 때 0이 되어 첫 행의 출력 1과 맞지 않는다.
- 는 1의 개수가 홀수일 때 1이 되므로 진리표와 정반대다.
- 는 XNOR을 두 번 거치며 부정이 상쇄되어 와 같으므로 진리표와 정반대다.
옳지 않은 것은 작업 집합 크기와 페이지 프레임 수가 매우 큰 경우 다중 프로그래밍 정도를 증가시킨다는 설명이다.
각 프로세스가 요구하는 작업 집합이 크면 한정된 프레임으로 수용할 수 있는 프로세스 수가 줄어든다. 이때 프로세스를 더 늘리면 스레싱이 심해지므로 오히려 다중 프로그래밍 정도를 낮춰야 한다.
- 작업 집합이 새로운 작업 집합으로 전이(지역성 변화)할 때 페이지 부재율이 일시적으로 높아질 수 있다는 설명은 옳다.
- 작업 집합 기법과 페이지 부재 빈도 기법이 프로세스 하나를 중단시켜 확보한 프레임으로 다른 프로세스의 스레싱을 줄일 수 있다는 설명은 옳다.
- 페이지 부재 빈도 기법이 부재율이 하한보다 낮아지면 보유 프레임 수를 줄인다는 설명은 이 기법의 동작(하한 미만이면 프레임 회수, 상한 초과면 프레임 추가)에 맞다.
- ㄱ. 단층 퍼셉트론은 배타적 합(Exclusive-OR) 연산자를 학습할 수 있다.
- ㄴ. 다층 신경망은 입력 층, 출력 층, 하나 이상의 은닉층들로 구성된다.
- ㄷ. 뉴런 간 연결 가중치(Connection Weight)를 조정하여 학습한다.
- ㄹ. 생물학적 뉴런 망을 모델링한 방식이다.
옳은 것은 ㄴ, ㄷ, ㄹ이다.
단층 퍼셉트론은 선형 분리가 가능한 문제만 학습할 수 있는데, XOR은 선형 분리가 불가능하므로 학습할 수 없다. XOR 문제는 은닉층을 둔 다층 신경망으로 해결한다.
- ㄱ. 단층 퍼셉트론이 XOR 연산자를 학습할 수 있다는 설명은 틀리다.
- ㄴ. 다층 신경망은 입력층, 하나 이상의 은닉층, 출력층으로 구성된다.
- ㄷ. 신경망은 뉴런 사이 연결 가중치를 조정하는 방식으로 학습한다.
- ㄹ. 인공신경망은 생물학적 뉴런 망을 모델링한 방식이다.
옳지 않은 것은 SMTP가 사용자 인터페이스 구성방법을 지정하는 전송 계층 프로토콜이라는 설명이다.
SMTP는 메일 서버 간 또는 클라이언트에서 서버로 전자우편을 전송하는 응용 계층 프로토콜이며, 전송 계층으로는 TCP를 이용한다. 사용자 인터페이스 구성과도 관계가 없다.
- IPv6는 128비트 주소를 쓰며 상태 비저장 주소 자동 설정 등 호스트 자동 설정 기능을 제공한다는 설명은 옳다.
- 광대역통합망(BcN)이 서비스별 SLA 품질 수준을 보장할 수 있다는 설명은 옳다.
- 모바일 와이맥스가 휴대형 단말기로 고속 무선 인터넷 접속을 제공하는 기술이라는 설명은 옳다.
class Super {
Super() {
System.out.print('A')
}
Super(char x) {
System.out.print(x)
}
}
class Sub extends Super {
Sub() {
super()
System.out.print('B')
}
Sub(char x) {
this()
System.out.print(x)
}
}
public class Test {
public static void main(String[] args)
{
Super s1 = new Super('C')
Super s2 = new Sub('D')
}
}출력 값은 CABD이다.
s1 생성: new Super('C')가 Super(char x)를 호출해 C를 출력한다.
s2 생성: new Sub('D')는 Sub(char x)를 호출하고, 그 첫 문장 this()가 Sub()를 호출한다.
Sub()의 super()가 Super()를 실행해 A를 출력하고, 돌아와 B를 출력한다.
마지막으로 Sub(char x)로 돌아와 D를 출력한다.
생성자 연쇄 호출에 따라 C → A → B → D 순으로 출력되므로 결과는 CABD이다.
설명에 해당하는 디자인 패턴은 Facade 패턴이다.
Facade(퍼사드)는 복잡한 서브시스템 앞에 단순화된 통합 인터페이스를 두어, 클라이언트가 내부 객체들을 직접 다루지 않고 이 창구를 통해 사용하게 하는 구조 패턴이다.
- Strategy 패턴은 알고리즘군을 캡슐화해 실행 중에 교체할 수 있게 하는 행위 패턴이다.
- Adapter 패턴은 호환되지 않는 인터페이스를 클라이언트가 기대하는 인터페이스로 변환하는 패턴이다.
- Singleton 패턴은 클래스의 인스턴스가 하나만 생성되도록 보장하는 생성 패턴이다.
- ○ 철수: 절차적 응집도+공통 결합도
- ○ 영희: 우연적 응집도+내용 결합도
- ○ 동수: 기능적 응집도+자료 결합도
- ○ 민희: 논리적 응집도+스탬프 결합도
가장 좋게 설계한 사람은 동수, 가장 좋지 않게 설계한 사람은 영희다.
좋은 모듈은 응집도는 높고 결합도는 낮아야 한다. 응집도는 기능적 > 순차적 > 교환적 > 절차적 > 시간적 > 논리적 > 우연적 순으로 좋고, 결합도는 자료 < 스탬프 < 제어 < 외부 < 공통 < 내용 순으로 낮다(좋다).
- 동수: 가장 강한 기능적 응집도와 가장 약한 자료 결합도로 최선의 조합이다.
- 영희: 가장 약한 우연적 응집도와 가장 강한 내용 결합도로 최악의 조합이다.
- 철수: 절차적 응집도에 공통 결합도로 중간 수준이다.
- 민희: 논리적 응집도에 스탬프 결합도로 중간 수준이다.
옳지 않은 것은 데크는 삽입과 삭제를 한쪽 끝에서만 수행한다는 설명이다.
데크(Deque, Double-Ended Queue)는 양쪽 끝 모두에서 삽입과 삭제가 가능한 자료구조다. 한쪽 끝에서만 삽입·삭제하는 것은 스택이다.
- 연결리스트로 구현된 스택은 노드를 동적으로 할당하므로 크기가 가변적이라는 설명은 옳다.
- 배열로 구현된 스택은 구현이 간단하지만 배열 크기로 용량이 고정된다는 설명은 옳다.
- 원형연결리스트는 마지막 노드가 첫 노드를 가리키므로 어느 노드에서든 다른 모든 노드에 접근할 수 있다는 설명은 옳다.
- ㄱ. 혼잡제어
- ㄴ. 인터넷 주소지정과 라우팅
- ㄷ. 신뢰성 있는 전달 서비스
- ㄹ. 패킷 단편화와 재조립
IPv4가 제공하는 기능은 ㄴ, ㄹ이다.
IPv4는 네트워크 계층의 비연결형·최선형(best-effort) 프로토콜로, 주소를 지정해 패킷을 목적지까지 라우팅하고 MTU에 맞춰 패킷을 단편화·재조립한다.
- ㄱ. 혼잡제어는 전송 계층의 TCP가 담당하며 IPv4는 제공하지 않는다.
- ㄴ. 인터넷 주소지정과 라우팅은 IPv4의 핵심 기능이다.
- ㄷ. 신뢰성 있는 전달(재전송·순서 보장)은 TCP가 제공하며 IPv4는 전달을 보장하지 않는다.
- ㄹ. 패킷 단편화와 재조립은 IPv4 헤더의 식별자·플래그·단편 오프셋 필드로 수행한다.
설명에 해당하는 방법은 조건 검증 기준(Condition Coverage)이다.
조건 검증 기준은 결정문 안의 개별 조건식 각각이 참과 거짓을 최소 한 번씩 갖도록 테스트 케이스를 설계한다.
- 문장 검증 기준은 프로그램의 모든 문장이 최소 한 번 실행되도록 하는 기준이다.
- 분기 검증 기준은 결정문 전체의 결과가 참·거짓 분기를 각각 한 번 이상 지나도록 하는 기준이다.
- 다중 조건 검증 기준은 결정문 내 조건식들의 참·거짓 가능한 모든 조합을 시험하는 기준이다.
옳지 않은 것은 가상 머신 모니터를 사용하면 반드시 호스트 운영체제가 필요하다는 설명이다.
가상 머신 모니터(하이퍼바이저) 중 네이티브(베어메탈)형은 하드웨어 위에서 직접 실행되어 호스트 운영체제 없이 게스트 운영체제를 구동한다. 호스트 운영체제가 필요한 것은 호스트형 방식뿐이다.
- 단일 컴퓨터에서 가상화로 여러 게스트 운영체제를 실행할 수 있다는 설명은 옳다.
- 가상 머신이 서로 간섭하지 않는 격리된 실행환경을 제공한다는 설명은 옳다.
- 자바 가상 머신이 바이트 코드를 다양한 운영체제에서 실행할 수 있게 한다는 설명은 옳다.
옳은 것은 IEEE 802.11n이 다중입력 다중출력(MIMO) 안테나 기술을 사용한다는 설명이다.
802.11n은 여러 안테나로 동시에 송수신하는 MIMO와 채널 결합 등을 도입해 이전 규격보다 전송률을 크게 높였다.
- 802.11a는 5GHz 대역에서 OFDM 방식을 쓰며 최대 54Mbps를 제공하므로, 5.5Mbps를 제공한다는 설명은 틀리다.
- 802.11b는 2.4GHz 대역에서 DSSS(CCK) 방식을 쓰며 OFDM을 사용하지 않으므로 틀리다.
- 802.11g는 2.4GHz 대역에서 OFDM을 사용하므로, 5GHz 대역에서 DSSS를 사용한다는 설명은 틀리다.
옳지 않은 것은 2단계 로킹에서 커밋 때까지 배타 로크를 해제하지 않으면 모든 교착상태를 방지할 수 있다는 설명이다.
배타 로크를 커밋까지 유지하는 엄격한 2단계 로킹은 연쇄 복귀를 막고 직렬 가능성을 보장하지만, 트랜잭션들이 서로의 로크를 기다리는 교착상태는 여전히 발생할 수 있다.
- 다중버전 동시성 제어가 데이터 항목 변경 시 이전 값(이전 버전)을 보존한다는 설명은 옳다.
- T2가 공유 로크를 보유한 상태에서 T3의 공유 로크 요청은 즉시 호환되므로, 기아 회피 기법이 없으면 배타 로크를 기다리는 T1보다 T3가 먼저 로크를 얻는다는 설명은 옳다.
- T1이 A의 공유 로크를 가진 유일한 트랜잭션이면 로크 전환(상승)으로 배타 로크를 얻을 수 있다는 설명은 옳다.
옳지 않은 것은 ISAM은 레코드 삽입을 위한 별도의 오버플로우 영역을 필요로 하지 않는다는 설명이다.
ISAM은 기본 데이터 영역이 키 순서로 고정 배치되므로, 새 레코드를 삽입할 자리가 없을 때 이를 담을 오버플로우 영역이 필요하다.
- VSAM이 B+ 트리 형태의 인덱스 구조를 사용한다는 설명은 옳다.
- 히프 파일은 레코드를 키 순서와 관계없이 들어온 순서대로 저장할 수 있다는 설명은 옳다.
- 순차 파일의 순서가 흐트러진 경우 파일 재구성으로 키 순서를 회복할 수 있다는 설명은 옳다.
#include <stdio.h>
int a = 10;
int b = 20;
int c = 30;
void func(void)
{
static int a = 100;
int b = 200;
a++;
b++;
c = a;
}
int main(void)
{
func();
func();
printf("a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}출력 값은 a = 10, b = 20, c = 102이다.
func 안의 a는 static 지역 변수라 처음 한 번만 100으로 초기화되고 값이 호출 사이에 유지된다. 지역 b는 호출마다 200으로 새로 만들어지며, c는 지역 선언이 없으므로 전역 c를 가리킨다.
첫 호출: static a = 101, 지역 b = 201, 전역 c = 101
둘째 호출: static a = 102, 지역 b = 201, 전역 c = 102
main의 a, b는 전역 변수로 바뀐 적이 없어 10, 20 그대로이고, c만 102로 바뀌어 출력된다.
옳지 않은 것은 선형 조사법이 연결리스트를 사용하여 오버플로우 문제를 해결한다는 설명이다.
선형 조사법은 충돌 시 테이블 안의 다음 빈 버킷을 차례로 찾는 개방 주소법이다. 연결리스트로 충돌 레코드를 잇는 방식은 체이닝이다.
- 서로 다른 탐색키가 같은 해시 주소로 사상될 수 있다(충돌)는 설명은 옳다.
- 충돌이 없는 해시 함수라면 해시 계산 한 번으로 위치를 찾으므로 탐색 시간 복잡도가 O(1)이라는 설명은 옳다.
- 폴딩 함수가 키를 여러 부분으로 나눠 더하거나 XOR하여 주소를 얻는다는 설명은 옳다.