웹 개발의 백엔드 영역에서의 발생하는 문제를 푸는 방법을 이해하고 사용하기 위해서는 컴퓨터 공학의 이론을 알아야 한다.
2010년 이후, 유니코드라 불리우는 인코딩 방식으로 통일 되어있다.
프로그래밍 언어마다 문자열을 다루는 자료형의 차이를 이해하기 위해선 기본적인 방식을 알고 있어야 한다.
전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다.
ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자를 다루기 위한 알고리즘 등을 포함하고 있다.
유니코드의 목적은 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이다.
인코딩(부호화)
- 어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것.
- 신호를 입력하는 인코딩과 문자를 해독하는 디코딩을 하기 위해서는 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 한다.
- 인코딩과 디코딩의 기준을 문자열 세트 또는 문자셋(charset)이라고 한다.
- 문자셋의 국제 표준이 유니코드이다.
영문 알파벳을 사용하는 대표적인 문자 인코딩이다.
7비트로 모든 영어 알파벳을 표현할 수 있다.
52개의 영문 알파벳 대소문자, 10개의 숫자, 32개의 특수 문자, 공백 문자를 포함한다.
인코딩 방식으로 UTF-뒤에 등장하는 숫자는 비트(bit)이다.
UTF-8의 특징은 아래와 같다.
유니코드 문자 하나를 나타내기 위해 1바이트(byte)에서 4바이트까지 사용한다.
let encoder = new TextEncoder(); // 기본 인코딩은 'utf-8' encoder.encode('코') // Uint8Array(3) [236, 189, 148] (236).toString(2) // "11101100" (189).toString(2) // "10111101" (148).toString(2) // "10010100"
코
라는 문자의 유니코드는U+CF54
로 표현된다. 이 문자를 이진법으로 표시하면
11101100 10111101 10010100
이 된다.
ASCII 코드는 7비트로 표현되고 1바이트의 결과로 만들 수 있다.
let encoder = new TextEncoder(); // 기본 인코딩은 'utf-8' encoder.encode('b') // Uint8Array [98] (98).toString(2) // "1100010"
바이트 순서를 따지지 않고, 순서가 정해져 있다.
코드 그대로 바이트로 표현이 가능하면 바이트 순서가 다양하다.
UTF-16은 유니코드 코드 대부분(U+0000부터 U+FFFF; BMP)을 16 bits로 표현한다.
대부분에 속하지 않는 기타 문자는 32 bit(4 bytes)로 표현하므로 UTF-16도 가변 길이라고 할 수 있으나, 대부분은 2바이트로 표현한다.
U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101 이다. 이 이진법으로 표현된 문자를 16 bits(2 bytes)로 그대로 사용하며, 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라진다.
UTF-8에서 한글은 3바이트, UTF-16에서는 2바이트를 차지한다.
비트맵(래스터) | 벡터 | |
---|---|---|
기반 기술 | 픽셀 기반 | 수학적으로 계산된 Shape 기반 |
특징 | 사진과 같이 색상의 조합이 다양한 이미지에 적합 | 로고, 일러스트와 같이 제품에 적용되는 이미지에 적합 |
확대 | 확대에 적합하지 않으며 보다 큰 사이즈의 이미지가 필요할 때 사용하려는 크기 이상으로 생성하거나 스캔해야 한다. | 품질 저하 없이 모든 크기로 확대가 가능하며 해상도의 영향을 받지 않는다. |
크기에 따른 파일 용량 | 큰 크기의 이미지는 큰 파일 사이즈를 가진다. | 큰 크기의 벡터 그래픽은 작은 사이즈를 유지할 수 있다. |
상호 변환 | 이미지의 복잡도에 따라 벡터로 변환하는 것에 오랜 시간이 걸린다. | 쉽게 래스터 이미지로 변환이 가능하다. |
대표적인 파일 포맷 | jpg, gif, png, bmp, psd | svg, ai |
웹에서의 사용성 | jpg, gif, png 등이 널리 쓰인다. | svg 포맷은 현대의 브라우저에서 대부분 지원한다. |
하드웨어에게 일을 시키는 주체이다.
운영체제가 없다면 응용 프로그램이 실행될 수 없다.
응용 프로그램은 컴퓨터를 이용해 다양한 작업을 하는것이 목적이다.
운영체제는 응용프로그램이 하드웨어에게 작업을 시킬 수 있도록 도와준다.
하드웨어를 구성하는 CPU, RAM, 디스크 등의 시스템 자원을 관리하는 주체가 운영체제이다.
모든 응용 프로그램이 시스템의 자원을 마음대로 사용한다면 해커의 공격에 무방비한 상태가 된다.
응용 프로그램의 권한에 대한 관리가 필요하다.
여러 사람이 하나의 기기를 사용하는 경우에는 사용자를 관리하는 일도 매우 중요하다.
응용 프로그램이 운영체제가 제공하는 기능을 통해 컴퓨터에게 일을 시키기 위해선 권한을 운영체제로부터 부여받아야 한다.
응용 프로그램이 운영체제와 소통하기 위해서는 운영체제가 API를 제공해햐 한다.
응용 프로그램이 시스템 자원을 사용할 수 있도록 운영체제 차원에서 다양한 함수를 제공하는 것을 시스템 콜(System call)이라 부른다.
운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스라고 부른다.
사용자가 애플리케이션을 실행 -> 운영체제로부터 필요한 메모리를 할당 받아 애플리케이션 코드 실행
하나의 애플리케이션은 여러 프로세스를 만들기도 한다.
하나의 스레드는 코드가 실행되는 하나의 흐름이다.
하나의 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개라는 의미이다.
각 스레드마다 call stack(실행 중인 서브루틴을 저장하는 자료구조)이 존재한다.
스레드는 다른 스레드와 독립적으로 동작한다.
운영체제는 멀티 태스킹을 할 수 있도록 프로세스마다 CPU 및 메모리 자원을 적절히 할당하고 병렬로 실행한다.
항상 멀티 태스킹이 멀티 프로세스를 의미하는 것은 아니다.
멀티 프로세스 : 애플리케이션의 멀티 태스킹
멀티 스레드 : 애플리케이션 내부 작업의 멀티 태스킹
프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우 메모리 공간과 시스템 자원의 소모가 줄어든다.
스레드 간 통신이 필요한 경우 별도의 자원이 아니라 Heap 영역을 이용한다.
프로세스 간 통신방법에 비해 스레드 간의 통신 방법이 간단하며 응답 시간이 단축된다.
멀티 프로세스에서 프로세스 간의 공유하는 자원이 없으므로 동일한 자원에 동시에 접근하는 일이 없지만
멀티 스레드에서는 공유하는 자원에 대한 고민이 필요하다.
멀티 스레딩 환경에서는 작업 처리 순서와 자원 접근을 제어할 동기화 작업이 필요하다.
동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 개수로 제한된다.
운영체제나 가상 머신은 각 스레드를 시간에 따라 분할하여 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 한다.
이런 방식을 시분할이라 한다.
다른 태스크가 시작할 수 있도록 이미 실행 중인 태스크를 멈추는 것
🎯 오늘의 학습목표
- 프로그램, 프로세스, 스레드에 대해 기본적인 개념을 설명할 수 있다.
- 프로그래밍에서 문자열을 다루는 방법과 유니코드 및 인코딩에 이해할 수 있다.
- 비트맵 이미지와 벡터 이미지의 차이를 이해할 수 있다.
😎 학습할 내용 중에 알고 있는 것
운영체제 기초 개념, UTF
✏️ 오늘 새롭게 학습한 것
컴퓨터공학에서 문자열과 그래픽을 어떻게 다루는지와 운영체제의 역할과 스레드의 기본 개념
🧷 오늘 학습한 내용 중 아직 이해되지 않은 부분
개념은 이해하였으나 설명하기에 암기가 부족해 단어 선택이 잘 안되었다.
💡 이해되지 않은 내용을 보완하기 위해 무엇을 할까
용어 위주로 다시 학습한다.