chapter 1. 컴퓨터 구조 시작하기

컴퓨터 구조를 알아야 하는 이유

→ 컴퓨터 구조를 이해하면 문법 만으로는 알기 어려운 성능, 용량, 비용까지 고려하며 개발할 수 있다.

컴퓨터 구조의 큰 그림

우리가 알아야 할 컴퓨터 구조 지식은 컴퓨터가 이해하는 정보와 컴퓨터의 네 가지 핵심 부품이 있다.

컴퓨터가 이해하는 정보는 0과 1 뿐이다. 이 0과 1로 표현되는 정보는 데이터와 명령어가 있다.

데이터(data)는 컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 가르키는 단어이자 컴퓨터와 주고받는 정보나 컴퓨터에 저장된 정보를 가리킬 때 편하게 데이터라 통칭하기도 한다. → 명령어를 위해 존재하는 일종의 재료

명령어(instruction)는 컴퓨터를 실질적으로 작동 시키는데 더 중요한 정보는 명령어. 데이터를 움직이고 작동 시키는 정보. → 이런 점에서 컴퓨터 프로그램은 ‘명령어들의 모음’이라 정의되기도 함.

컴퓨터의 네 가지 핵심 부품은 CPU(중앙 처리장치), 메모리(주 기억장치), 보조 기억장치, 입출력 장치가 있다.

메모리는 현재 실행되는 프로그램(=프로세스)의 명령어와 데이터를 저장하는 부품. 즉, 프로그램이 실행되려면 반드시 메모리에 저장되어 있어야 한다.

CPU는 컴퓨터의 두뇌. 메모리에 저장된 명령어를 읽어 들이고, 읽어 들인 명령어를 해석하고, 실행하는 부품.

CPU의 내부 구성 요소로 ALU(산술논리연산장치)와 레지스터, 제어 장치가 있다.

ALU(산술논리연산장치)는 계산기, 계산 만을 위해 존재하는 부품.

레지스터는 CPU 내부의 작은 임시 저장장치, 프로그램을 실행하는데 필요한 값들을 임시로 저장.

제어 장치(CU, control unit)는 제어 신호(control signal)라는 전기 신호를 보내고 명령어를 해석하는 장치이며, 제어 신호는 컴퓨터 부품들을 관리하고 작동 시키기 위한 일종의 전기 신호.

보조 기억장치는 전원이 꺼져도 보관될 프로그램을 저장하는 부품.

입출력 장치는 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품. ex) 키보드, 마우스 등

메인 보드는 마더보드라고도 부르며 여러 컴퓨터 부품을 연결.

시스템 버스는 컴퓨터의 네 가지 핵심 부품이 서로 정보를 주고받는 통로.

→ 컴퓨터의 네 가지 부품은 메인보드에 연결되어 시스템 버스를 통해 서로 정보 또는 데이터를 주고 받음.

chapter 2. 데이터

0과 1로 숫자를 표현하는 방법

비트(bit) : 컴퓨터가 표현하는 정보 단위 중 0과 1을 나타내는 가장 작은 정보 단위를 말한다. 전구 하나로 (꺼짐) 혹은 (켜짐), 두 가지 상태를 표현할 수 있듯이, 1비트는 0 또는 1, 두 가지 정보를 표현한다.

$$ n개의 전구로 표현할 수 있는 상태는 2^n가지. = n비트는 2^n가지 정보를 표현 할 수 ㅇ. $$

바이트(byte) : 8개의 비트를 묶은 단위로, 비트보다 한 단계 큰 단위. 1바이트는 8비트와 같으니 2의 8제곱인 256개의 정보를 표현할 수 있다.

2진법(binary) : 1을 넘어가는 시점에 자리 올림을 하여 0과 1만으로 모든 수를 표현 하는 방법. 2진법으로 표현한 수를 2진수라 한다.

2의 보수(two’s complement) : 2진수의 음수 표현 방법은 10진수 음수를 표현할 때는 단순히 숫자 앞에 마이너스 부호를 붙이는 것과 달리 컴퓨터는 0과 1만 이해할 수 있기 때문에 마이너스 부호를 사용하지 않고 0과 1만으로 음수를 표현해야 한다. 0과 1만으로 음수를 표현하는 방법 중 가장 널리 사용되는 방법은 2의 보수를 구해 이 값을 음수로 간주하는 방법이다. 2의 보수의 사전적 의미는 ‘어떤 수를 2보다 큰 2의 n제곱에서 뺀 값’을 의미한다.

2의보수.jpg

2의 보수값을 확인할 때 어떤 음수의 음수를 더하면 처음의 그 수가 되듯이 -(-a) = a, 2의 보수도 마찬가지로 어떤 수의 2의 보수를 두 번 구해보면 자기 자신이 된다. 2진수만 보고 이게 음수인지 양수인지 구분하기 어렵기 때문에 컴퓨터 내부에서 어떤 수를 다룰 때는 이 수가 양수인지 음수인지를 구분하기 위해 flag(플래그)를 사용한다. 플래그는 쉽게 말해 부가정보이다. 그리고 2의 보수 표현의 한계는 n비트로는 -2의 n제곱과 2의 n제곱이라는 수를 동시에 표현할 수 없다는 점이다.

10진법(decimal) : 1을 넘어가는 시점에 자리 올림을 해 0부터 9까지, 10개의 숫자만으로 모든 수를 표현하는 방법이다.

16진법(hexadecimal) : 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식. 16진수는 한 글자로 16종류( 0 ~ 9, A ~ F )의 정보를 표현할 수 있으니, 2진수에 비해 더 적은 자릿수로 더 많은 정보를 표현한다. 16진수 A ~ F를 쉽게 이해하는 방법으로 손가를 이용한다. 주먹을 쥐었을 때가 A이다. 손가락을 하나도 안폈으니 0, 손가락을 하나만 피면 1. 이런 식으로 이해하면 쉽다.

→ 숫자만으로 진수 구분이 혼동하기 쉬워 이를 예방하기 위해 진수 끝에 아래첨자를 붙이거나(수학적 표기) 2진수 앞에는 0b, 16진수 앞에는 0x를 붙여 구분한다.(코드 상에 표기할 때)

0과 1로 문자를 표현하는 방법

문자집합(character set) : 컴퓨터가 인식하고 표현할 수 있는 문자의 모음. 문자집합에 속한 문자라고 해서 컴퓨터가 그대로 이해할 수 있는 건 아니다. 문자를 0과 1로 변환해야 비로소 컴퓨터가 이해할 수 있는데 이 변환과정을 문자 인코딩(character encoding)이라 하고 인코딩 후 0과 1로 이루어진 결과 값이 문자코드가 된다. 인코딩의 반대과정, 즉 0과 1로 이루어진 문자코드를 사람이 이해할 수 있는 문자로 변환하는 과정을 문자 디코딩(character decoding)이라 한다.

아스키 코드 : 아스키 문자들은 각각 7비트로 표현되는데, 7비트로 표현할 수 있는 정보의 가짓수는 2의 7제곱으로 총 128개의 문자를 표현한다. 0부터 127까지 총 128개의 숫자 중 하나의 고유한 수에 일대일로 대응된다. 아스키 문자에 대응된 고유한 수를 아스키 코드라 부른다. 문자 인코딩에서 ‘글자에 부여된 고유한 값’을 코드 포인트(code point)라고 한다. ex) 아스키 코드 A의 코드 포인트는 65.

→ 아스키 문자 집합에 속한 문자들은 7비트로 표현하기에 128개보다 많은 문자, 즉 한글 뿐만 아니라 아스키 집합 외의 문자 등도 표현하지 못하는 단점이 있다.

그래서 한국을 포함한 영어권 외의 나라들은 자신들의 언어를 0과 1로 표현할 수 있는 문자집합과 인코딩 방식이 필요해 등장한 한글 인코딩 방식이 EUC-KR.

한글은 각 음절 하나하나가 초성, 중성, 종성의 조합으로 있기에 두 가지 방식, 완성형(한글 완성형 인코딩)과 조합형(한글 조합형 인코딩)이 존재한다.

EUC-KR : 한글을 2바이트 크기로 인코딩할 수 있는 완성형 인코딩 방식.

유니코드 : 여러 나라의 문자들을 광범위하게 표현할 수 있는 통일된 문자 집합이며, UTF-8, UTF-16, UTF-32는 유니코드 문자의 인코딩 방식이다.

chapter 3. 명령어

소스 코드와 명령어

고급언어 : 사람이 이해하고 작성하기 쉽게 만들어진 언어.

저급언어 : 컴퓨터가 직접 이해하고 실행할 수 있는 언어.

기계어 : 저급 언어인 기계어는 0과 1로 이루어진 명령어로 구성되어 있다.

어셈블리어 : 고급언어와 저급언어 사이에 있으며, 기계어를 사람이 읽기 편한 형태로 변역한 저급 언어.

고급언어를 저급언어로 변환되는 방식 2가지

명령어의 구조

명령어 : 연산 코드와 오퍼랜드로 구성된다.

연산코드 : 명령어가 수행할 연산을 의미한다.

오퍼랜드 : 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미한다.

주소 지정 방식 : 연산에 사용할 데이터 위치를 찾는 방법입니다.

대표적인 주소 지정 방식 5가지가 오퍼랜드 필드에 명시하는 값