01. 컴퓨터 구조 시작하기
컴퓨터가 이해하는 정보
컴퓨터의 네 가지 핵심부품

02. 데이터
0과 1로 숫자를 표현하는 방법
비트(bit): 0과 1을 나타내는 가장 작은 정보 단위. n비트는 '2의n승' 개 정보 표현 가능
바이트(byte): 1byte=8bit. 비트보다 한 단계 큰 정보 단위
- 이진법에서 음수 표현: 2의 보수를 구해 이 값을 음수로 간주한다. 이진법 수에서 모든 0과 1을 뒤집고, 거기에 1을 더한 값이 특정 값의 '2의 보수'다.
- 십육진법을 쓰는 이유: 이진수 <-> 십육진수 변환이 쉽기 때문
- 이진수->십육진수 변환: 이진수를 네 자리씩 끊고, 각 네 자리 이진수를 각각 십육진수로 변환해 이를 그대로 이어붙인다.
- 십육진수->이진수 변환: 십육진수 각 자리수를 4자리 이진수로 변환하고, 이 4자리 이진수를 모두 이어붙인다.
0과 1로 문자를 표현하는 방법
- ASCII(아스키코드): 초창기 문자 집합 중 하나로 영어알파벳과 아라비아숫자, 일부 특수문자 포함. 7비트로 표현 가능(정보 가짓수는 총 128개)
- ECU-KR: 영어권 외 나라에서 자신들의 언어를 0과 1로 표현할 수 있는 문자집합과 인코딩 방식이 필요해 개발됨. ECU-KR 한글인코딩은 '완성형 인코딩' 방식이며 초성, 중성, 종성이 모두 결합된 한글에 2바이트 크기의 코드 부여
- 유니코드와 UTF-8: 모든 언어를 아우르는 문자 집합과 통일된 표준 인코딩 방식의 필요에 의해 등장. 현대 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합. 글자에 부여된 값 자체를 인코딩된 값으로 삼지 않고, 이를 다양한 방법으로 인코딩한다. 가장 대중적인 방법이 UTF-8방식.
03. 명령어
소스코드와 명령어
고급언어와 저급언어
컴퓨터는 인간이 사용하는 프로그래밍 언어를 직접 이해할 수 없다. 인간이 사용하는 언어(고급언어)를 컴퓨터가 이해하는 언어(저급언어)로 변환 이루어진다.
- 고급언어
: C, C++, Java, Python과 같이 사람이 이해하고 작성하기 쉽게 만들어진 프로그래밍 언어
- 저급언어
: 컴퓨터가 이해하고 실행할 수 있는 언어. 기계어와 어셈블리어가 있다.
-- 기계어: 0과 1의 명령어 비트로 이루어진 언어
-- 어셈블리어: 기계어를 이해하기 편한 형태로 번역한 언어
컴파일 언어와 인터프리터 언어
개발자가 작성한 고급언어를 컴퓨터가 이해, 실행할 저급언어로 바꾸는 데 두 가지 방식이 있다. 컴파일 방식과 인터프리트 방식. 예를 들어 A언어로 쓰인 책을 한국어 쓰는 사람에게 설명하려 할 때, 컴파일 방식은 한국어로 모두 번역한 번역본을 한국사람에게 통째로 건네주는 방식, 인터프리트 방식은 A언어 책을 한 줄 한 줄 한국어로 번역해 설명해주는 방식이라고 이해할 수 있다. 속도는 컴파일 방식이 인터프리트 방식보다 빠르다.
- 컴파일 언어
: 컴파일러에 의해 소스코드 전체가 저급언어로 변해 실행되는 언어를 컴파일 언어라고 한다. C언어가 이에 속한다. 컴파일러가 소스코드를 쭉 훑어보며 문법적 오류 여부를 검사할 때 오류가 하나라도 발견되면 소스코드 전체가 실행되지 않는다.
- 인터프리터 언어
: 인터프리터에 의해 소스코드가 한 줄씩 실행되는 언어로, Python이 이에 속한다. 인터프리터 언어는 소스코드를 한 줄씩 실행하므로 n번째 줄에 문법 오류가 있더라도 n번째 줄 전까지의 소스코드가 실행된다.
명령어의 구조
연산코드와 오퍼랜드
명령어는 연산코드(operation code)와 오퍼랜드(operand)로 구성돼 있다.
- 연산코드: 명령어의 '작동' '연산' (주로 동사) 부분
- 오퍼랜드: 연산의 대상이 되는 '데이터' 또는 데이터가 저장된 '위치(주소)'가 담기는 부분. 주소필드라고도 한다. 오퍼랜드는 명령어 안에 없을 수도, 1개만 있을 수도, 2-3개 등 여러 개가 담길 수도 있다.
연산코드가 담기는 영역을 연산코드 필드, 오퍼랜드가 담기는 영역을 오퍼랜드필드라 한다.
주소지정방식
오퍼랜드 필드에 데이터터가 직접 담기기도 하나, 데이터가 저장된 주소(CPU의 레지스터, 메모리 등)를 담는 이유는 명령어의 길이(가 제한돼 있기) 때문. 오퍼랜드 필드 안에 데이터 주소가 담긴다면, 표현할 수 있는 데이터 크기는 메모리 주소에 저장할 수 있는 공간만큼 커지기 때문에 주소를 담는 것.
- 즉시주소지정방식: 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 직접주소지정방식: 오퍼랜드 필드에 데이터의 유효주소를 직접 명시
- 간접주소지정방식: 유효주소의 주소를 오퍼랜드 필드에 명시. 메모리 접근이 두 번 필요해 다른 주소지정방식들보다 느리다.
- 레지스터주소지정방식: 연산에 사용할 데이터를 저장한 레지스터를 직접 명시
- 레지스터간접지정방식: 연산에 사용할 데이터를 메모리에 저장하고 그 주소를 레지스터에 저장해 오퍼랜드필드에 레지스터 명시
* 기본 숙제
p51. 문제 3
프로그램이 실행되려면 반드시 (답: 메모리)에 저장되어 있어야 합니다.
p65. 문제 3
1101(이진수)의 음수를 2의 보수 표현법으로 구해보세요.
답: 0011(이진수)
* 추가 숙제
- p100. 스택과 큐의 개념 정리
-- 스택(stack)
: 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리방식. LIFO(Last Input First Out/ 후입선출) 자료구조. 한쪽 끝이 막힌 통과 같은 저장공간에 데이터를 차곡차곡 쌓으면 제일 나중에 쌓은 데이터를 제일 먼저 꺼내게 되는 것과 같음
-- 큐(queue)
: 제일 먼저 저장한 데이터부터 빼내는 데이터 관리방식. FIFO(First Input First Out/ 선입선축) 자료구조. 양쪽이 뚫린 통로와 같은 저장공간에, 한 쪽으로 데이터를 넣고 반대편에서 데이터를 꺼내는 것과 같음