Chapter 01 컴퓨터 구조 시작하기
01-1 컴퓨터 구조를 알아야 하는 이유
- 컴퓨터 구조를 이해하고 있다면 문제 상황을 빠르게 진단할 수 있고, 문제 해결의 실마리를 다양하게 찾을 수 있다.
- 컴퓨터 구조를 이해하면 문법만으로 알기 어려운 성능/용량/비용을 고려하며 개발할 수 있다.
📝 웹 개발을 할 때는 브라우저에서 많은 것들을 처리해주지만 앱 개발 같은 경우 OS 위에서 돌아가기 때문에 컴퓨터구조, 운영체제는 필수로 알고 있어야 한다. 웹 개발 또한 운영체제 - 브라우저 위에서 동작하기 때문에 문제 발생시 더 좋은 해결책을 고민할 수 있을 것이다.
01-2 컴퓨터 구조의 큰 그림
컴퓨터가 이해하는 정보
- 컴퓨터는 0과 1로 표현된 정보만 이해
- 데이터 : 컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상 같은 정적인 정보
- 명령어 : 데이터를 움직이고 컴퓨터를 작동시키는 정보
컴퓨터의 4가지 핵심 부품
-
CPU : 컴퓨터의 두뇌로 CPU는 메모리에 저장된 명령어를 읽어 들이고, 읽어 들인 명령어를 해석하고, 실행하는 부품.
- 산술논리연산장치(ALU) : 계산기
- 레지스터 : CPU 내부의 임시 저장 장치
- 제어장치 : 제어 신호라는 전기 신호를 내보내고 명령어를 해석하는 장치
-
주기억장치(메모리) : 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품.
- 프로그램이 실행되기 위해서는 반드시 메모리에 저장되어 있어야 한다.
- 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다.
- 메모리에 저장된 값의 위치는 주소로 알 수 있다.
-
보조기억장치 : 전원이 꺼져도 보관될 프로그램을 저장하는 부품.
- 하드 디스크, SSD, USB, DVD, CD-ROM
-
입출력장치 : 마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치.
-
메인보드와 시스템 버스 : 네 가지 핵심 부품은 메인보드에 연결되어 시스템 버스를 통해 서로 정보 또는 데이터를 주고 받는다.
- 메인보드 : 여러 컴퓨터 부품을 부착할 수 있는 슬롯과 연결 단자가 있는 판.
- 시스템 버스 : 메인보드에 연결된 부품들이 서로 정보를 교환할 수 있는 통로.
📝 컴퓨터가 이해하는 정보는 0과 1 binary data 뿐이다. 정적인 정보들을 담는 데이터와 이 데이터들을 움직이고 컴퓨터를 동작시키는 명령어로 두개로 나뉜다. 컴퓨터의 핵심 4가지 부품은 CPU, 메모리, 보조기억장치, 입출력장치 4가지이다.
Chapter 02 데이터
02-1 0과 1로 숫자를 표현하는 방법
정보 단위
- 비트(bit) : 0과 1을 나타내는 가장 작은 정보 단위
- 단위
- 1byte = 8bit
- 1kB = 1000byte
- 1MB = 1000kB
- 1GB = 1000MB
- 1TB = 1000GB
- 워드(word) : CPU가 한 번에 처리할 수 있는 데이터의 크기
- 인텔의 x86 CPU는 32비트 워드, x64 CPU는 64비트 워드
- ✔️ 32비트 64비트 프로그램 차이는?
이진법
- 0과 1만으로 모든 숫자를 표현하는 방법
- 양수인지 음수인지 구분하기 위해 플래그를 사용.
십육진법
- 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식
- 0~9, A~F 정보로 표현
- 이진수 -> 십육진수, 십육진수 -> 이진수로 변환하기 쉽기 때문에 사용.
📝 bit는 가장 작은 정보 표현단위로 0과 1을 나타낸다. bit -> byte -> kB -> MB -> GB -> TB 순으로 정보 단위가 올라간다. 워드는 CPU가 한번에 처리할 수 있느 데이터의 크기로 보통 32비트, 64비트 두가지로 나누어지며 64비트 성능이 더 좋다.
02-2 0과 1로 문자를 표현하는 방법
문자 집합과 인코딩
- 문자 집합
- 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
- 문자 집합에 없는 문자는 이해할 수 없음.
- 인코딩 : 문자를 0과 1로 변환하는 과정
- 디코딩 : 0과 1로 표현된 문자 코드를 사람이 읽을 수 있는 문자로 변환하는 과정
아스키 코드
- 초창기 문자 집합 중 하나
- 총 128개의 문자를 표현할 수 있음. 문자에 1:1로 맵핍된 십진수로 변환 후 이진수로 변환되어 인코딩 됨.
- 한글을 표현할 수 없음.
EUC-KR
- 알파벳을 쭉 이어 쓰면 단어가 되는 영어와 달리, 한글은 음절 하나하나가 초성, 중성, 종성으로 이루어져 있음.
- 한글같은 경우는 완성형과 조합형이 존재
- 완성형 : 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
- 조합형 : 초성, 중성, 종성 각각에 코드를 부여해서 합하는 방식
- EUC-KR은 완성형 인코딩 방식이라 문자 집합에 정의되지 않은 쀍 이런 문자는 깨지는 문제가 발생.
유니코드와 UTF-8
- 또 하나 문제는 각 나라별로 인코딩 방식이 다르다면, 다국어 지원시 각 나라별로 다른 인코딩 방식을 적용해야 하는 번거로움이 있다.
- 유니코드는 다양한 한글을 초함하며, 대부분 나라의 문자, 특수문자, 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합이다.
- 유니코드는 다양한 방법으로 인코딩할 수 있는데 UTF-8, UTF-16, UTF-32 등이 있다.
📝 컴퓨터가 인식할 수 있는 문자 모음을 문자 집합이라고 하며, 문자를 0과 1로 변환시키는 과정을 인코딩, 사람이 읽을 수 있는 문자로 다시 변환시키는 작업을 디코딩이라고 한다. 초창기 문자 집합으로 아스키코드가 있었으나 128가지만 인식할 수 있다는 한계가 있었고, 그 다음 한글에 맞춰서 나온 문자집합인 EUC-KR은 완성형 인코딩 방식이라 모든 한글을 인식할 수 없다는 한계가 있었다. 게다가 각 나라별로 다른 인코딩 방식은 다국어 지원시 매우 번거로울수밖에 없는 작업이다. 그래서 나온게 유니코드이며 여러 나라의 문자를 광범위하게 통일된 형태로 표현할 수 있는 문자 집합이다. 이 유니코드를 인코딩하는 방식은 여러가지가 있다.
Chapter 03 명령어
03-1 소스 코드와 명령어
고급 언어와 저급 언어
- 고급 언어 : 사람을 위한 언어(프로그래밍 언어)
- 저급 언어 : 컴퓨터가 이해하고 실행할 수 있는 언어
- 기계어 : 0과 1 명령어 비트로 이루어진 언어
- 어셈블리어 : 기계어를 읽기 편한 형태로 번역한 저급 언어
컴파일 언어와 인터프리터 언어
-
고급언어가 저급언어로 변환되는 방법
-
컴파일 방식
컴파일 언어 : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환된어 실행되는 고급 언어
컴파일 : 소스 코드 전체가 저급 언어로 변환되는 과정
컴파일러 : 컴파일을 수행해주는 도구
목적 언어 : 컴파일를 통해 저급언어로 변환된 코드
-
인터프리터 방식
인터프리터에 의해 소스코드가 한줄씩 실행되는 고급 언어
인터프리터 언어는 소스 코드를 한줄씩 실행하기 때문에 저급언어로 변환하는 시간을 기다릴 필요가 없다.
-
컴파일 언어와 인터프리터 언어 흑과 백 방식으로 구분할 수 없다.
하나의 프로그래밍 언어가 반드시 둘 중 하나의 방식만으로 작동하지 않고, 두 가지 방식이 합께 사용되는 경우가 많기 때문.
-
목적 파일 VS 실행 파일
컴파일러로 저급 언어로 변환된 파일을 목적 파일이라고 하며 링킹 과정을 거쳐야지 실행 파일이 될 수 있음.
📝 프로그래밍 언어를 고급언어, binary data를 저급언어라고 한다. 고급언어에서 저급언어로 변환되는 방법은 2가지가 있으며 컴파일 방식, 인터프리터 방식이 있다. 컴파일 방식은 고급 언어를 컴파일러로 한번에 저급 언어로 변환하는 방식이며 중간에 오류가 있으면 도중에 중단되며 컴파일을 완료할 수 없다. 인터프리터 방식은 인터프리터가 한줄씩 읽으면서 실행하기 때문에 소스코드 중간에 오류가 있어도 그 전까지는 실행할 수 있으며 오류를 읽게되는 순간 중지된다.
03-2 명령어의 구조
연산 코드와 오퍼랜드
- 명령어는 연산 코드와 오퍼랜드로 구성
- 연산 코드(연산자)
- 오퍼랜드(피연산자)
- 연산에 사용할 데이터가 저장된 위치
- 메모리 주소나 레지스터 이름이 담긴다.
- 주소 필드라고 부름.
주소 지정 방식
- 오퍼랜드 필드 안에 데이터 자체를 넣지 않고 주소를 넣는 이유는 오퍼랜드의 크기가 한정적이기 때문이다. 그래서 메모리 주소로 표현하게 되면 표현할 수 있는 데이터의 크기가 하나의 메모리 주소에 저장할 수 있는 공간만큼 커지게 된다.