활동 내용

Chapter 1 ~ 3, 대략적인 컴퓨터 구조부터 데이터, 명령어까지

  • 기본 미션: p. 51의 확인 문제 3번, p. 65의 확인 문제 3번 풀고 인증하기
  • 선택 미션: p. 100의 스택과 큐의 개념을 정리하기

정리

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

컴퓨터 구조는 코드상의 문법적인 오류만이 아닌 컴퓨터 내부의 문제일 때, 문제 해결의 실마리를 찾을 수 있도록 도와줄 수 있다. 만약 '서버 컴퓨터'를 구매한다고 가정할 때, 어떤 CPU를 사용할지, 어떤 메모리를 사용할지 등을 직접 판단하고 현명하게 선택해야 한다. 어떤 선택을 하는지에 따라 성능, 용량, 비용이 달라지기 때문이다.

컴퓨터가 이해하는 정보

컴퓨터는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 가리킨 데이터(data)와 명령어(instruction)를 통해 정보를 알 수 있다.
그리고 둘 중 컴퓨터를 실질적으로 작동시키는 것은 명령어이다. 데이터는 명령어 없이 아무것도 할 수 없는 정보 덩어리지만, 명령어는 데이터를 움직이고 컴퓨터를 작동시키는 정보이기 때문이다. 그렇기에 누군가가 "컴퓨터를 한마디로 정의해 보세요"라고 묻는다면 보통 "컴퓨터는 명령어를 처리하는 기계입니다"라고 답할 것이다.

컴퓨터의 4가지 핵심 부품

컴퓨터의 핵심 부품은 중앙처리장치(이하 CPU, Central Processing Unit), 주기억장치(이하 메모리, main memory)와 보조기억장치(secondary storage), 입출력장치(input/output(I/O) device)가 있다.
이들은 모두 메인보드(main board) 안에 있으며, 시스템 버스(system bus)를 통해 각각 분리되어 있다.

  • CPU: 메모리에 저장된 명령어를 읽어 들이고, 읽어 들인 명령어를 해석하고 실행하는 부품이다. CPU 내부 구성 요소로는 산술논리연산장치(이하 ALU, Arithmetic Logic Unit), 레지스터(register), 제어장치(CL, Control Unit)이 있다.
    ALU는 컴퓨터 내부에서 수행되는 대부분의 계산을 도맡은 장치이며, 쉽게 말해 계산기로 볼 수 있다. 레지스터는 CPU 내부의 임시 저장 장치이다. 제어장치는 제어 신호(Control signal)라는 전기 신호를 내보내고 명령어를 해석하는 장치이다.
  • 메모리: 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다. 메모리에 저장된 값에 빠르고 효율적으로 접근하기 위해 주소(address)라는 개념이 사용된다. 메모리에 저장된 값의 위치는 주소로 알 수 있다.
    메모리는 크게 RAM(Random Access Memory)와 ROM(Read Only Memory)가 있지만, 메모리라는 용어는 보통 RAM을 지칭한다. 그렇기에 특별한 언급이 없는 한 주기억장치인 메모리는 RAM이라고 생각해도 무방하다.
    또한 메모리는 가격이 비싸 저장 용량이 적고, 전원이 꺼지면 저장된 내용을 잃는다는 단점이 있으며, 이를 보완하기 위해 보조기억장치가 있는 것이다.
  • 보조기억장치: 메모리보다 크기가 크고 전원이 꺼져도 저장된 내용을 잃지 않는 저장 장치이다. 하드 디스크, SSD, USB 메모리, DVD, CD-ROM과 같은 저장 장치가 보조기억장치의 일종이다.
  • 입출력장치: 마이크, 스피커, 키보드, 마우스처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치를 의미한다.
    입출력장치는 보조기억장치와 함께 주변장치(peripheral device)라 통칭하기도 한다. 그러나 보조기억장치는 일반적인 입출력장치에 비해 메모리를 보조한다는 특별한 기능을 수행하기에 구분해서 생각하는 것이 좋다.
  • 메인보드: 위의 컴퓨터 핵심 부품들은 전부 메인보드라는 판에 연결된다. 메인보드는 마더보드(mother board)라고 불리기도 하며, 컴퓨터 부품을 부착할 수 있는 슬롯과 연결 단자가 있다.
  • 시스템버스: 컴퓨터 핵심 부품들을 연결하는 가장 중요한 버스(bus)이다. 시스템버스는 주소 버스(address bus), 데이터 버스(data bus), 제어 버스(control bus)가 있다.

정보 단위

컴퓨터는 0 또는 1밖에 이해하지 못하며, 이를 나타내는 가장 작은 정보 단위를 비트(bit)라고 한다. n 비트는 2^{n} 가지 정보를 표현할 수 있다. 그리고 표현의 편의를 위해 비트보다 큰 단위를 사용하며, 이러한 단위가 바이트, 킬로바이트(KB, kilobyte), 메가바이트(MB, megabyte), 기가바이트(GB, gigabyte), 테라바이트(TB, terabyte) 등이다. 그 중 바이트(byte)는 1바이트 당 8비트이다.

단위상세
1바이트(1byte)8비트(8bit)
1킬로바이트(1KB)1000바이트(1000byte)
1메가바이트(1MB)1000킬로바이트(1000KB)
1기가바이트(1GB)1000메가바이트(1000MB)
1테라바이트(1TB)1000기가바이트(1000GB)

이진법

수학에서 0과 1만으로 모든 숫자를 표현하는 방법을 이진법(binary)이라고 하며, 이진법으로 표현한 수를 이진수라고 한다. 이진수 표기는 이진수 끝에 아래첨자 (2)를 붙이거나 이진수 앞에 0b를 붙인다. 전자는 주로 이진수를 수학적으로 표기할 때, 후자는 주로 코드 상에서 이진수를 표기할 때 사용한다.
그리고 이진수의 음수는 2의 보수(two's complement)를 구해 이 값을 음수로 간주하는 방법을 주로 사용한다. 2의 보수는 1의 보수에서 1을 더한 값인데, 1의 보수는 이진수에서 모든 0과 1을 뒤집은 값이다. 예를 들어 이진수 1101의 1의 보수는 0010이고, 2의 보수는 0011이다.

십육진법

십육진법(hexadecimal)은 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다. 십육진수는 한 글자로 열여섯 종류(0~9, A~F)의 정보를 표현할 수 있으며, 이진수와의 변환이 쉽기에 자주 쓰는 방식이다. 이진수와 마찬가지로 숫자 뒤에 아래첨자 (16)를 붙이거나 숫자 앞에 0x를 붙여 구분한다. 십육진수를 이진수로 변환은 십육진수 한 글자를 4비트의 이진수로 간주하고 변환하는 방법이 주로 쓰인다. 예를 들어 1A라는 십육진수가 있을 때, 각 숫자를 이진수로 표현하면 0001, 1010이다.

문자 집합과 인코딩

  • 문자 집합(character set): 컴퓨터가 인식하고 표현할 수 있는 문자의 모음이다. 예를 들어 문자 집합이 {a, b, c, d}인 경우 컴퓨터는 이 네 개의 문자는 이해할 수 있고 e 나 f 같은 문자는 이해하지 못한다.
  • 문자 인코딩(character encoding): 문자를 0과 1로 변환하는 과정이다. 인코딩 후 0과 1로 이루어진 결과값은 문자 코드라고 한다.
  • 문자 디코딩(character decoding): 인코딩의 반대 과정으로 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정이다.

아스키 코드

아스키(ASCII, American Standard Code for Information Interchange)는 초장기 문자 집합 중 하나로, 아스키 문자 집합에 속한 문자(이하 아스키 문자)들은 1비트의 패리티 비트(parity bit)라는 오류 검출을 위해 사용되는 비트와 7비트의 표현 비트로 나누어 진다. 이 중 표현 비트가 표현할 수 있는 정보의 가짓수는 2^{7}개로, 총 128개의 문자를 표현한다.
아스키 코드는 매우 간단하게 인코딩된다는 장점이 있지만, 128개의 문자 외의 문자들은 표현하지 못한다는 단점이 있다. 훗날 더 다양한 문자 표현을 위해 표현 비트가 8비트인 확장 아스키(Extended ASCII)가 등장하기도 했지만, 그럼에도 표현 가능한 문자의 수는 256개였기에 턱없이 부족하다.

한글 인코딩 방식

한글 인코딩에는 한글 완성형 인코딩과 한글 조합형 인코딩이 존재한다. 완성형 인코딩 방식은 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식이다. 반면 조합형 인코딩 방식은 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식이다.

EUC-KR

EUC-KR은 KS X 1001, KS X 1003이라는 문자 집합을 기반으로 하는 대표적인 완성형 인코딩 방식이다. 초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드를 부여한다.

유니코드와 UTF-8

유니코드(unicode)는 EUC-KR보다 훨씬 다양한 한글을 포함하여 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합이다.
유니코드는 아스키 코드나 EUC-KR이 글자에 부여된 값 그대로 인코딩하는 방식과 달리 글자에 부여된 값을 다양한 방법으로 인코딩한다. 이런 인코딩 방법에는 크게 UTF-8, UTF-16, UTF-32 등이 있다.
해당 책에는 가장 대중적인 UTF-8만 다루는데, UTF-8은 통상 1바이트부터 4바이트까지의 인코딩 결과를 만들어 낸다. 다시 말해 인코딩 값이 1바이트에서 4바이트 사이의 값이 된다는 것이다.

고급 언어와 저급 언어

고급 언어(high-level programming language)는 '사람을 위한 언어'로 C, C++, Java, Python과 같은 프로그래밍 언어이다. 반면에 저급 언어(low-level programming language)는 컴퓨터가 직접 이해하고 실행할 수 있는 언어이다. 기계어(machine code)와 어셈블리어(assembly language)로 구성되어 있다.
기계어는 0과 1로 이루어진 언어이다. 오로지 컴퓨터만을 위해 만들어진 언어이기에 사람이 읽으면 그 의미를 이해하기 어렵다. 그래서 등장한 저급 언어가 어셈블리어이다. 어셈블리어는 기계어를 읽기 편한 형태로 번역한 언어이다.

컴파일 언어와 인터프리터 언어

컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어이다. 이때, 변환되는 과정을 컴파일(compile)이라고 하며, 컴파일을 수행해 주는 도구를 컴파일러(compiler)라고 한다. 대표적인 컴파일 언어로는 C가 있다.

인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어이다. 대표적인 인터프리터 언어로는 Python이 있다. 이때, 변환을 실행하는 도구를 인터프리터(interpreter)라고 한다.
인터프리터 언어는 소스 코드 내에 오류가 하나라도 있으면 컴파일이 불가능했던 컴파일 언어와는 달리 소스 코드 N번째 줄에 문법 오류가 있더라도 N-1번째 줄까지 수행된다. 다만 인터프리터 언어는 한 줄 한 줄씩 코드를 해석하고 실행해야 하기에 컴파일 언어보다 느리다는 단점이 있다.

명령어의 구조

명령어는 '명령어가 수행할 연산'인 연산 코드(operation code)와 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'인 오퍼랜드(operand)로 구성되어 있다. 연산 코드는 연산자, 오퍼랜드는 피연산자라고도 부른다.

또한 오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 있고, 두 개 또는 세 개 등 여러 개가 있을 수 있다. 여기서 오퍼랜드가 N개이면 N-주소 명령어라고 한다.

주소 지정 방식

주소 지정 방식(addressing mode)은 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법이다. 다시 말해, 유효 주소를 찾는 방법이다. 유효 주소(effective address)는 연산의 대상이 되는 데이터가 저장된 위치이다.
주소 지정 방식은 즉시 주소 지정 방식(immediate addressing mode), 직접 주소 지정 방식(direct addressing mode), 간접 주소 지정 방식(indirect addressing mode), 레지스터 주소 지정 방식(register addressing mode), 레지스터 간접 주소 지정 방식(register indirect addressing mode)이 있다. 각각의 방식이 오퍼랜드 필드에 명시하는 값은 아래와 같다.

  • 즉시 주소 지정 방식: 연산에 사용할 데이터
  • 직접 주소 지정 방식: 유효 주소(메모리 주소)
  • 간접 주소 지정 방식: 유효 주소의 주소
  • 레지스터 주소 지정 방식: 유효 주소(레지스터 이름)
  • 레지스터 간접 주소 지정 방식: 유효 주소를 저장한 레지스터

기본 미션

p. 51의 확인 문제 3번, p. 65의 확인 문제 3번 풀고 인증하기


3. 다음 설명의 빈칸에 들어갈 알맞은 내용을 써 보세요.

프로그램이 실행되려면 반드시 (**메모리**)에 저장되어 있어야 합니다.

3. 1101의 음수를 2의 보수 표현법으로 구해 보세요.

0011

선택 미션

p. 100의 스택과 큐의 개념을 정리하기


스택(stack)

스택은 '나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식'인 후입선출(LIFO, Last In First Out) 자료 구조이다. 예를 들어 스택 안에 1-2-3 순으로 데이터를 저장하면 데이터를 빼낼 때는 3-2-1 순으로 빼낼 수 있다.
이때 스택에 새로운 데이터를 저장하는 명령어가 PUSH, 스택에 저장된 데이터를 꺼내는 명령어가 POP이다.

큐(queue)

큐는 '가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식'인 선입선출(FIFO, First In First Out) 자료 구조이다.

profile
안녕하세요.

0개의 댓글