전 세계 언어를 하나의 코드 체계로 통합한 문자 코드는 Unicode이다.
Unicode는 국가별로 달랐던 문자 코드를 하나로 묶기 위해 만들어졌으며, 기본 다국어 평면의 문자를 2바이트로 표현해 한글·한자 등 다양한 언어를 함께 다룰 수 있다.
- ASCII 코드: 7비트로 영문자·숫자·제어 문자를 표현하는 코드로, 다국어 표현이 목적이 아니다.
- BCD 코드: 10진수 한 자리를 4비트 2진수로 표현하는 숫자 코드이다.
- EBCDIC 코드: BCD를 확장한 8비트 코드로 주로 IBM 대형 컴퓨터에서 사용된다.
TELNET을 대체하는 안전한 원격 접속 서비스는 SSH(Secure SHell)이다.
TELNET은 아이디·비밀번호와 명령을 평문으로 전송해 도청에 취약하지만, SSH는 통신 구간을 암호화하고 서버 인증을 제공한다.
- VoIP: IP 네트워크로 음성 통화를 전달하는 기술이다.
- SMTP: 전자우편을 전송하는 프로토콜이다.
- DHCP: 호스트에 IP 주소 등 네트워크 설정을 자동으로 할당하는 프로토콜이다.
MAC 주소는 48비트이므로 16진수 12자리로 표현한다.
16진수 한 자리는 4비트를 나타낸다.
보통 00-1A-2B-3C-4D-5E처럼 2자리씩 6묶음으로 표기하며, 앞 24비트는 제조사 식별 번호(OUI), 뒤 24비트는 제조사가 부여한 고유 번호이다.
- 4자리나 8자리로는 16비트·32비트밖에 표현하지 못해 MAC 주소 길이에 못 미친다.
- 16자리는 64비트에 해당해 MAC 주소 길이를 넘는다.
캐시에 가장 먼저 들어온(가장 오래된) 블록을 교체하는 방식은 FIFO(First-In First-Out)이다.
FIFO는 적재 순서만 기억하면 되므로 구현이 간단하지만, 자주 쓰이는 블록도 오래되었다는 이유로 교체될 수 있어 적중률이 높지 않다.
- LFU: 참조 횟수가 가장 적은 블록을 교체한다.
- LRU: 가장 오랫동안 참조되지 않은 블록을 교체한다.
- Random: 교체할 블록을 무작위로 선택한다.
+5에 대한 8비트 1의 보수는 11111010이다.
먼저 +5를 8비트 2진수로 나타낸다.
+5 → 00000101
1의 보수는 모든 비트를 반전(0↔1)하여 구한다.
00000101 → 11111010
- 11111110: 1을 반전한 값(00000001의 1의 보수)이다.
- 11111101: 2를 반전한 값(00000010의 1의 보수)이다.
- 11111011: +5의 2의 보수(1의 보수 11111010에 1을 더한 값)이다.
이진 탐색은 탐색 구간을 절반씩 줄여 가는 과정이 같은 형태로 반복되므로 재귀 호출로 구현할 수 있다.
중간값과 비교한 뒤 왼쪽 또는 오른쪽 절반에 대해 같은 함수를 다시 호출하면 되며, 반복문으로도 구현할 수 있다.
- 순차 탐색의 평균 시간 복잡도는 가 아니라 이다.
- 정렬된 데이터에서 효율적으로 탐색하는 알고리즘은 순차 탐색이 아니라 이진 탐색이다.
- 처음부터 끝까지 차례로 비교하는 방식은 이진 탐색이 아니라 순차 탐색이다.
RIP는 라우터 간 경로 정보를 교환하는 라우팅 프로토콜로, 응용 계층 프로토콜이 아니라 인터넷(네트워크) 계층의 경로 설정 기능에 속한다.
RIP는 홉 수를 기준으로 최적 경로를 정하는 거리 벡터 방식의 라우팅 프로토콜이다.
- FTP: 파일 전송을 위한 응용 계층 프로토콜이다.
- HTTP: 웹 문서를 주고받는 응용 계층 프로토콜이다.
- SMTP: 전자우편을 전송하는 응용 계층 프로토콜이다.
릴레이션의 속성은 더 이상 나눌 수 없는 원자 값만 가진다.
릴레이션의 특성은 튜플의 유일성, 튜플의 무순서성, 속성의 무순서성, 속성의 원자성이다.
- 튜플 중복 허용: 한 릴레이션에 똑같은 튜플은 존재할 수 없다.
- 튜플 간 순서: 튜플의 순서는 의미가 없다.
- 속성 간 순서: 속성의 순서도 의미가 없다.
ALU(산술 논리 연산 장치)는 연산을 수행하는 장치이지 레지스터가 아니다.
ALU는 덧셈·뺄셈 같은 산술 연산과 AND·OR 같은 논리 연산을 수행하며, 연산 대상과 결과는 레지스터에 저장된다.
- MBR: 메모리에서 읽거나 메모리에 쓸 데이터를 임시로 보관하는 레지스터이다.
- PC: 다음에 실행할 명령어의 주소를 저장하는 레지스터이다.
- IR: 현재 실행 중인 명령어를 저장하는 레지스터이다.
브릿지(bridge)는 MAC 주소를 기준으로 프레임을 전달하는 데이터 링크 계층 장비이다.
브릿지는 네트워크를 세그먼트로 나누고 MAC 주소 테이블을 이용해 프레임을 필터링·전달한다.
- 허브: 전송 계층이 아니라 물리 계층 장비이다.
- 라우터: 데이터 링크 계층이 아니라 IP 주소로 경로를 설정하는 네트워크 계층 장비이다.
- 리피터: 신호를 증폭·재생하는 물리 계층 장비이다.
비지도 학습은 레이블이 없는 데이터에서 알고리즘이 스스로 패턴이나 구조를 찾아내는 학습이다.
대표적인 기법으로 군집화(clustering), 차원 축소 등이 있다.
- 에이전트·환경·상태·액션·보상은 강화 학습의 핵심 개념이다.
- 군집화는 비지도 학습의 대표 기법이므로 사용할 수 없다는 설명은 틀리다.
- 누적 보상을 최대화하는 방향으로 학습하는 것은 강화 학습이다.
#include <stdio.h>
#include <string.h>
int main(void) {
char s[] = "COMPUTER";
char* p = s + 2;
*(p + 3) = 'X';
printf("%s\n", s);
printf("%zu\n", strlen(p));
return 0;
}
5
5
6
6
출력 결과는 첫 줄 COMPUXER, 둘째 줄 6이다.
s의 인덱스는 C(0) O(1) M(2) P(3) U(4) T(5) E(6) R(7)이다.
p = s + 2 이므로 p는 M을 가리킨다.
*(p + 3)은 s[5], 즉 T 위치이므로 T가 X로 바뀌어 s는 COMPUXER가 된다.
strlen(p)는 p가 가리키는 M부터 널 문자 전까지인 MPUXER의 길이를 세므로 6이다.
- COMXUTER: 바뀌는 위치를 s[3]으로 잘못 계산한 결과이다.
- 길이 5: p 이후의 문자 수를 하나 적게 센 결과이다.
(가)는 fork(), (나)는 0이다.
fork()는 호출한 프로세스를 복사해 자식 프로세스를 만들며, 부모 프로세스에는 자식의 PID(양수)를, 자식 프로세스에는 0을 반환한다. 이 반환값으로 부모와 자식의 실행 흐름을 구분한다.
- exec(): 새 프로세스를 복사하는 것이 아니라 현재 프로세스의 메모리를 다른 프로그램으로 대체하는 호출이다.
- 자식에게 1을 반환한다는 설명은 틀리며, 자식은 0을 받는다.
시스템 스택은 함수 호출 시 복귀 주소·지역 변수 등을 저장하고 복귀 시 꺼내어 호출과 복귀 순서를 관리한다.
가장 나중에 호출된 함수가 가장 먼저 복귀하므로 LIFO 구조인 스택이 적합하다.
- 먼저 삽입된 데이터가 먼저 삭제되는 FIFO 구조는 스택이 아니라 큐이다.
- 나중에 삽입된 데이터가 먼저 삭제되는 LIFO 구조는 큐가 아니라 스택이다.
- 큐는 배열로 구현할 수 있으며, 원형 큐가 대표적인 예이다.
○ 하드웨어 방식과 소프트웨어 방식으로 구분된다.
버스 중재기가 각 버스 마스터의 요구를 주기적으로 검사하는 방식은 폴링 방식이다.
폴링 방식은 중재기가 마스터들을 차례로 조사해 버스 사용권을 부여하며, 폴링 회로로 처리하는 하드웨어 폴링과 프로그램으로 처리하는 소프트웨어 폴링으로 나뉜다.
- 병렬 중재: 각 마스터가 독립적인 요구 신호선을 통해 중재기에 동시에 요청하는 방식이다.
- 직렬 중재: 버스 승인 신호가 마스터들을 데이지 체인으로 차례로 거쳐 전달되는 방식이다.
- 분산 중재: 중앙 중재기 없이 각 마스터의 중재 회로가 함께 사용권을 결정하는 방식이다.
| 프로세스 | 도착 시간 | 실행 시간 |
|---|---|---|
| 0 | 3 | |
| 2 | 8 | |
| 5 | 4 | |
| 8 | 3 |
FCFS로 처리했을 때 평균 반환 시간은 8이다.
도착 순서대로 실행하면 종료 시각은 다음과 같다.
: 0~3, : 3~11, : 11~15, : 15~18
반환 시간 = 종료 시각 − 도착 시각
LSTM은 합성곱 신경망이 아니라 순환 신경망(RNN)의 한 종류이므로 옳지 않다.
LSTM은 RNN의 장기 의존성 문제를 해결하기 위해 입력·망각·출력 게이트로 장기 및 단기 기억을 조절하는 구조이다.
- 딥러닝은 은닉층을 2개 이상 둔 심층 신경망으로, 음성 인식·자연어 처리 등에 활용된다.
- 합성곱 계층은 필터를 이용해 이미지의 특징을 추출한다.
- 순환 신경망은 이전 상태를 다음 입력 처리에 반영해 시계열처럼 연속성이 있는 데이터를 처리한다.
class Main {
public static void div(double a, double b){
try{
System.out.println(a / b);
}catch(ArithmeticException e){
System.out.println("divide by zero");
}
}
public static void main(String args[]) {
div(3, 2);
div(2, 0);
}
}Infinity
Infinity
divide by zero
divide by zero
출력 결과는 첫 줄 1.5, 둘째 줄 Infinity이다.
매개변수가 double이므로 div(3, 2)의 3과 2는 3.0, 2.0으로 변환되어 3.0 / 2.0 = 1.5가 출력된다.
div(2, 0)은 2.0 / 0.0인데, 실수 나눗셈은 0으로 나누어도 ArithmeticException이 발생하지 않고 Infinity를 결과로 낸다. 따라서 catch 블록은 실행되지 않는다.
- 1이 출력되려면 정수 나눗셈이어야 하지만 여기서는 double 나눗셈이다.
- divide by zero는 정수를 0으로 나눌 때 발생하는 예외의 경우이며 이 코드에서는 출력되지 않는다.
ㄴ. 일대일 모델은 다중 처리기에서 다중 스레드가 병렬로 수행되는 것을 허용하지 않는다.
ㄷ. 다대일 모델에서는 프로세스에 속한 하나의 스레드가 입출력 작업을 위해 대기 상태에 들어가도 나머지 스레드는 계속 실행된다.
옳은 설명은 ㄱ뿐이다.
스레드는 사용자 공간에서 관리되는 사용자 스레드와 운영체제가 관리하는 커널 스레드로 나뉜다.
- ㄴ: 일대일 모델은 사용자 스레드마다 커널 스레드가 대응하므로 다중 처리기에서 병렬 수행이 가능하다.
- ㄷ: 다대일 모델은 여러 사용자 스레드가 하나의 커널 스레드에 대응하므로 한 스레드가 입출력으로 대기하면 프로세스 전체가 멈춘다.
○ 외부에서 접근하는 것을 통제하기 위해 생성자를 private으로 선언한다.
객체를 하나만 생성하고 생성자를 private으로 막는 패턴은 Singleton 패턴이다.
Singleton은 외부에서 new로 객체를 만들지 못하게 하고, 클래스 내부의 정적 메서드를 통해 유일한 인스턴스에 접근하도록 한다.
- Adapter 패턴: 호환되지 않는 인터페이스를 변환해 함께 동작하게 하는 구조 패턴이다.
- Composite 패턴: 개별 객체와 복합 객체를 트리 구조로 묶어 동일하게 다루는 구조 패턴이다.
- Factory method 패턴: 객체 생성을 하위 클래스에 위임하는 생성 패턴이다.