본문 바로가기
Book

[혼공컴운]혼공학습단11기_1주차+기본, 선택미션

by suuuuunnng 2024. 1. 7.

앞의 글

2024.01.07 - [Book] - 혼공학습단11기_혼공컴운 시작

 

혼공컴운 1주차

 

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

01-1 컴퓨터 구조를 알아야 하는 이유.

시작하기 전에.

컴퓨터 구조는 개발자가 되려면 반드시 알아야 할 기본 지식이다.

문제 해결.

가령 학습을 하면서, 코드를 똑같이 작성했는데 제대로 작동하지 않는다면 어떻게 할 것인가? 어떤 컴퓨터에선 작동이 되던 것이 다른 컴퓨터에선 작동되지 않는 경우가 있다. 이러한 경우에 컴퓨터 구조를 이해하고 있다면 문제 상황을 빠르게 진단하여, 문제 해결의 실마리를 다양하게 찾을 수 있다.

컴퓨터는 미지의 대상이 아닌 분석의 대상이다.

좋은 개발자가 되려면 프로그래밍 언어의 문법과 함께 컴퓨터의 근간을 알아야 한다.

컴퓨터 구조를 학습하면 컴퓨터를 관조 할 수 있는 능력을 배양(=문법에 맞는 소스코드를 컴퓨터에 입력만 하는 개발자에서 컴퓨터를 내려다보며 문제를 해결할 수 있는 개발자)

성능, 용량, 비용

CPU와 메모리의 수준에 따라서 성능, 용량, 비용이 다양하게 결정된다.

서버 컴퓨터를 구매하지 않고 클라우드 서비스를 이용하더라도 이와 비슷한 상황을 직면한다. 어떤 CPU를 사용할지, 어떤 메모리를 사용할지 등을 직접 판단, 현명한 선택을 해야한다. 결국 어떤 선택을 하는지에 따라 성능, 용량, 비용이 달라지기 때문이다.

선택 상황은 스스로 해결해야 하기 때문에 만약 개발한 프로그램이 어떤 환경에서 어떻게 작동하는지는 스스로 가장 잘 이해해야 하며, 프로그램을 위한 최적의 컴퓨터 환경을 스스로 판단할 수 있어야 한다.

사용자가 많은 프로그램일수록 성능, 용량, 비용이 고려되며 결국 컴퓨터 구조를 아는 것이 매우 중요하다.

즉, 컴퓨터 구조를 이해하면 입력과 출력에만 집중하는 개발을 넘어 성능, 용량, 비용까지 고려하며 개발할 수 있는 개발자가 될 수 있다.

마무리

핵심 포인트

  1. 컴퓨터 구조를 이해하면 문제 해결 능력이 향상된다.
  2. 컴퓨터 구조를 이해하면 문법만으로 알기 어려운 성능/용량/비용을 고려하며 개발할 수 있다.

01-2 컴퓨터 구조의 큰 그림.

시작하기 전에

컴퓨터 구조 지식은 크게 두 가지이다.

‘컴퓨터가 이해하는 정보’, ‘컴퓨터의 네 가지 핵심 부품’

컴퓨터가 이해하는 정보

컴퓨터는 0과 1로 표현된 정보만을 이해한다. 그 예시로 데이터와 명령어.

데이터 : 정적인 정보 (숫자, 문자, 이미지, 동영상)

0과 1로 다양한 데이터를 표현하는지 배운 다음엔 명령어를 학습한다. 데이터는 명령어 없이는 아무것도 할 수 없는 정보 덩어리일 뿐이지만, 명령어는 데이터를 움직이고 컴퓨터를 작동시키는 정보다.

즉, 명령어는 컴퓨터를 작동시키는 정보이고 데이터는 명령어를 위해 존재하는 일종의 재료라고 보면 된다.

컴퓨터의 4가지 핵심 부품.

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

메모리

현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품.

메모리 속에 저장된 명령어와 데이터의 위치는 정돈되어 있어야하는데 이때 주소라는 개념이 사용된다. (주소와 관련해선 후에 다룬다.)

3가지는 기억해야한다.

  1. 프로그램이 실행되기 위해서는 반드시 메모리에 저장되어 있어야 한다.
  2. 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다.
  3. 메모리에 저장된 값의 위치는 주소로 알 수 있다.

CPU

컴퓨터의 두뇌이다.

CPU메모리에 저장된 명령어를 읽어 들이고, 읽어 들인 명령어를 해석하고 실행하는 부품이다.

CPU의 내부 구성요소를 알아야 CPU의 역할과 작동원리를 구체적으로 이해하기 편한다. 내부 구성 요소 중 가장 중요한 세 가지는 산술논리연산장치(ALU), 레지스터, 제어장치 이다.

ALU : 계산기, 계산만을 위해 존재하는 부품이다. 컴퓨터 내부에서 수행되는 대부분의 계산을 담당한다.

레지스터 : CPU 내부의 작은 임시 저장 장치. 프로그램을 실행하는 데 필요한 값을 임시로 저장한다. CPU 안에는 여러 개의 레지스터가 존재하고, 각기 다른 이름과 역할이 있다.

제어장치 : 제어신호라는 전기 신호를 내보내고 명령어를 해석하는 장치. 제어신호는 컴퓨터 부품을 관리하고 작동시키기 위한 일종의 전기 신호이다. CPU가 메모리에 저장된 값을 읽고 싶을 땐 메모리를 향해 메모리 읽기라는 제어 신호를 보낸다. CPU가 메모리에 어떤 값을 저장하고 싶을 땐 메모리를 향해 메모리 쓰기라는 제어 신호를 보낸다.

CPU는 4, 5장에서 자세히 다룰 예정이고 3가지만 기억해도 된다.

  1. CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치다.
  2. CPU 내부에는 ALU, 레지스터, 제어장치가 있다.
  3. ALU는 계산하는 장치, 레지스터는 임시 저장 장치, 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치다.

보조기억장치

메모리는 2가지 약점이 있다. ‘가격이 비싸 저장 용량이 적다는 점’과 ‘전원이 꺼지면 저장된 내용을 잃는다는 점’

전원이 꺼지면 작업 내역이 없어지는 이유는 실행 중인 프로그램을 메모리에 저장되는데 전원이 꺼지면 저장된 내용이 날아가기 때문이다.

그래서 탄생한 것이 보조기억장치이다.

우리가 아는 HDD(하드디스크), SSD, USB 메모리, DVD, CD-ROM과 같은 것들이 보조기억장치이다.

메모리가 현재 ‘실행되는’ 프로그램을 저장한다면, 보조기억장치는 ‘보관할’ 프로그램을 저장한다고 생각해도 좋다. (7장에서 다룰 예정.)

입출력장치

마이크, 스피커, 프린터, 마우스, 키보드 처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치(주변장치로도 통칭)를 의미한다.

메인보드와 시스템 버스

앞서 설명한 핵심 부품들은 모두 메인보드라는 판에 연결된다.

마더보드라고도 부른다. 메인보드엔 여러 컴퓨터 부품을 부착할 수 있는 슬롯과 연결 단자가 있다.

이렇게 연결된 부품들은 서로 정보를 주고받을 수 있는데, 이는 메인보드 내부에 버스라는 통로가 있기 때문이다.

버스의 종류는 다양하지만, 그 중 컴퓨터의 네 가지 핵심 부품을 연결하는 가장 중요한 버스는 시스템 버스이다.

시스템 버스는 3가지로 구성되어 있는데 주소, 데이터, 제어 (이하 버스)이다.

주소 버스는 주소를 주고받는 통로, 데이터 버스는 명령와 데이터를 주고받는 통로, 제어 버스는 제어 신호를 주고받는 통로이다.

마무리

핵심 포인트

  1. 컴퓨터가 이해하는 정보에는 데이터와 명령어가 있다.
  2. 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다.
  3. CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품이다.
  4. 보조기억장치는 전원이 꺼져도 보관할 프로그램을 저장하는 부품이다.
  5. 입출력장치는 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품이다.
  6. 시스템 버스는 컴퓨터의 네 가지 핵심 부품들이 서로 정보를 주고받는 통로이다.

 

 

Chapter 2. 데이터

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

시작하기 전에.

이번 절에선 컴퓨터가 표현하는 정보 단위를 학습하고, 0과 1만으로 숫자를 표현하는 방법을 배운다.

정보 단위

0과 1를 나타내는 가장 작은 정보 단위비트 라고한다.

n비트는 2^n 가지 정보를 표현할 수 있다.

프로그램의 크기를 말할 땐 표현의 편의를 위해 비트보다 큰 단위를 사용하는데 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트 등이 있다.

바이트(byte)

여덟 개의 비트를 묶은 단위, 비트보다 한 단계 큰 단위, 1바이트는 8비트와 같으니 2^8(256)개의 정보를 표현할 수 있다.

킬로바이트(kB)

1바이트 1000개를 묶은 단위를 1킬로바이트

메가바이트(MB)

1킬로바이트 1000개를 묶은 단위

기가바이트(GB)

1메가바이트 1000개를 묶은 단위

테라바이트(TB)

1기가바이트 1000개를 묶은 단위

이진법

수학에서 0과 1만으로 모든 숫자를 표현하는 방법

십진법

0부터 9까지, 열 개의 숫자만으로 모든 수를 표현하는 방법.

이진수와 십진수

이진법으로 표현한 수, 십진법으로 표현한 수

이진수의 음수 표현

2의 보수를 구해 이 값을 음수로 간주하는 방법 : 0과 1만으로 음수를 표현하는 방법 중 가장 널리 사용된 방법

사전적 의미는 어떤 수를 그보다 큰 2^n 에서 뺀 값 이다.

예를들어 11(2)의 2의 보수는 11(2)보다 큰 2^n, 즉 100(2)에서 11(2)을 뺀 01(2)이 되는 것.

쉽게 표현하자면 ‘모든 0과 1을 뒤집고, 거기에 1을 더한 값’ 이다.

간혹 가다 이진수만으로 음수, 양수를 구분하기 어려운 경우가 있는데 컴퓨터 내부에서 어떤 수를 다룰 때 양수, 음수를 구분하기 위해 플래그란 걸 사용한다. (=부가정보 라는 뜻, 4장에서 다룰 예정)

십육진법

수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식.

한 글자당 열여섯 종류(0~9, A~F)의 숫자로 표현할 수 있다.

이진수를 십진수로 변환하는 것보다 이진수를 십육진수로 묶어 표현하는 것을 주로 한다.

마무리

핵심 포인트

  1. 비트는 0과 1로 표현할 수 있는 가장 작은 정보 단위
  2. 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트는 비트보다 더 큰 정보 단위.
  3. 이진법은 1을 넘어가는 시점에 자리 올림을 하여 0과 1만으로 수를 표현하는 방법
  4. 이진법에선 음수는 2의 보수로 표현할 수 있다.
  5. 십육진법은 15을 넘어가는 시점에 자리 올림하여 수를 표현하는 방법

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

시작하기 전에.

이번 절에선 0과 1로 문자를 표현하는 방법, 즉 컴퓨터가 문자를 이해하고 표현하는 다양한 방법에 대해 알아본다.

문자 집합과 인코딩

0과 1로 문자를 표현하는 방법을 학습하기 전에 반드시 알아야 할 세 가지 용어가 있다.

문자집합, 인코딩, 디코딩

컴퓨터가 인식하고 표현할 수 있는 문자의 모음 : 문자 집합

문자 집합의 속했는가 아닌가의 여부로 컴퓨터는 문자를 이해할 수 있거나 없다. 그리고 문자 집합에 속한 문자라고 해서 컴퓨터가 그대로 이해할 수 있는 건 아니다. 문자를 0과 1로 변환해야 이해 가능.

변환 과정을 문자 인코딩 이라 하고, 인코딩 후 0과 1로 이루어진 결과값이 문자 코드가 된다.

이와 반대 과정을 문자 디코딩 이라 하며, 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정이다.

아스키 코드

아스키 : 초창기 문자 집합 중 하나로, 영어 알파벳과 아라비아 숫자, 그리고 일부 특수 문자를 포함.

각각 7비트로 표현되는데, 7비트로 표현할 수 있는 정보의 가짓수는 2^7개로, 총 128개의 문자를 표현할 수 있다.

아스키 코드 : 0부터 127까지 총 128개의 숫자 중 하나의 고유한 수로 일대일 대응이 되는데 이 때 대응된 고유한 수를 뜻한다.

아스키 코드를 이진수로 표현 >> 아스키 문자를 0과 1로 표현할 수 있다.

장점은 매우 간단하게 인코딩 된다는 점, 단점은 한글을 표현할 수 없다는 점과 아스키 문자 집합 외의 문자, 특수문자도 표현할 수 없다는 점.

한글 인코딩 방식이 개발되었는데 EUC-KR 이다.

EUC-KR

한글의 특수성을 알아야 하는데 한글은 각 음절 하나하나가 초성, 중성, 종성의 조합으로 이루어져 있다.

한글 인코딩에는 두 가지 방식, 완성형과 조합형이 존재한다.

완성형 인코딩 방식은 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식.

조합형 인코딩 방식은 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자코드를 완성하는 방식.

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

예를 들어 한글 한 글자에 2바이트 코드가 부여되는데, EUC-KR로 인코딩된 한글 한 글자를 표현하려면 16비트가 필요하다. 그리고 16비트는 네 자리 십육진수로 표현이 가능하다.

그래서 EUC-KR 인코딩 방식으로 총 2,350개 정도의 한글 단어를 표현 가능. 하지만 ‘뷁’ 과 같은 글자는 표현이 불가하다. 이걸 보완하기 위해 등장한 것이 마이크로소프트의 CP949이다. 확장된 버전이지만 한글 전체를 표현하기엔 넉넉하진 않다.

유니코드와 UTF-8

유니코드는 EUC-KR 보다 훨씬 다양한 한글을 포함하며 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합이다.

현대 문자를 표현할 때 가장 많이 사용되고 있다.

아스키 코드와 EUC-KR과 같이 글자에 부여된 값을 그대로 인코딩 값을 삼은것과 달리 유니코드는 글자에 부여된 값 자체를 인코딩된 값으로 삼지 않고 이 값을 다양한 방법으로 인코딩한다. 크게 UTF-8, UTF-16, UTF-32 등이 있다.

마무리

핵심 포인트

  1. 문자 집합은 컴퓨터가 인식할 수 있는 문자의 모음으로 문자 집합에 속한 문자를 인코딩하여 0과 1로 표현할 수 있다.아스키 문자 집합에 0부터 127까지의 수가 할당되어 아스키 코드로 인코딩한다.
  2. EUC-KR은 한글을 2바이트 크기로 인코딩할 수 있는 완성형 인코딩 방식이다. 유니코드는 여러 나라의 문자들을 광범위하게 표현할 수 있는 통일도니 문자 집합이며, UTF-8, UTF-16, UTF-32 는 유니코드 문자의 인코딩 방식이다.

Chapter 3. 명령어

03-1 소스 코드와 명령어.

들어가기 앞서

작성한 소스 코드가 컴퓨터 내부에서 명령어가 되고 실행되는 과정을 학습한다.

고급 언어와 저급 언어

고급 언어 : 사람을 위한 언어, 우리가 알고 있는 대부분의 프로그래밍 언어들 (C++, C, Java, Python 등)

저급 언어 : 컴퓨터가 직접 이해하고 실행할 수 있는 언어, 명령어로만 이루어져 있다.

저급 언어의 두 종류 : 기계어와 어셈블리어.

기계어란?

0과 1의 명령어 비트로 이루어진 언어.

어셈블리어란?

0과 1로 표현된 명령어(기계어)를 읽기 편한 형태로 번역한 언어.

개발자의 입장에서 어셈블리어란, '작성의 대상' 일 뿐만 아니라 매우 중요한 '관찰의 대상' 이기도 하다.

개발 분야를 막론하고 앞서 설명한 고급 언어와 저급 언어의 차이를 이해하는 것이 매우 좋은 교양이기에 이제 입문한 초보 개발자 준비생들은 반드시 알아두는 것이 좋다.

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

고급 언어에서 저급 언어로 변환은 어떻게 될까? >> 컴파일 방식과 인터프리트 방식.

컴파일 언어 : 컴파일 방식으로 작동하는 프로그래밍 언어.

컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급언어.

컴파일 언어로 작성된 소스 코드는 코드 전체가 저급 언어로 변환되는 과정, 이는 즉 컴파일[compile] 이다.

이를 수행해주는 도구 : 컴파일러[compiler]

컴파일이 성공적으로 수행되면 개발자가 작성한 소스 코드는 컴퓨터가 이해할 수 있는 저급언어로 변환.

이렇게 저급 언어로 변환된 코드를 목적 코드[object code] 라고 한다.

인터프리터 언어 : 인터프리트 방식으로 작동하는 프로그래밍 언어.

인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어. (예. Python)

소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구 : 인터프리터[interpreter]

소스 코드내에 오류가 하나라도 있으면 컴파일이 불가능했던 컴파일 언어와는 달리, 인터프리터 언어는 소스 코드를 한줄씩 실행하기 때문에 소스 코드 N번째 줄에 문법 오류가 있더라도 N-1 번째 줄까지는 올바르게 수행된다.

마무리

핵심 포인트

  1. 고급 언어는 사람이 이해하고 작성하기 쉽게 만들어진 언어.
  2. 저급 언어는 컴퓨터가 직접 이해하고 실행할 수 있는 언어
  3. 저급언어는 0과 1로 이루어진 명령어로 구성된 기계어와 기계어를 사람이 읽기 편한 형태로 번역한 어셈블리어가 있다.
  4. 컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어
  5. 인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 변환되어 실행되는 언어.

03-2 명령어의 구조.

시작하기 전에.

명령어의 구조와 주소 지정 방식을 학습하며 명령어의 생김새와 작동 원리를 이해한다.

연산 코드와 오퍼랜드

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

연산 코드[operation code] : 명령어가 수행할 연산

오퍼 랜드[operand] : 연산에 사용할 데이터가 저장된 위치

주소 지정 방식

연산에 사용할 데이터 위치를 찾는 방법.

즉시 주소 지정 방식

연산에 사용할 데이터를 오버랜드 필드에 직접 명시하는 방식

직접 주소 지정 방식

오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식.

간접 주소 지정 방식

유효 주소의 주소를 오퍼랜드 필드에 명시. 앞서 방식보단 느리다.

레지스터 주소 지정 방식

직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법.

레지스터 간접 주소 지정 방식

연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법.

마무리

핵심 포인트

  1. 명령어는 연산 코드와 오퍼랜드로 구성.
  2. 연산 코드는 명령어가 수행할 연산을 의미
  3. 오퍼랜드는 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미.
  4. 주소 지정 방식은연산에 사용할 데이터 위치를 찾는 방법

기본 미션

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

p.51 3번.
p.65 확인 문제 3번

선택 미션

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

 

스택 : 한쪽 끝이 막혀 있는 통과 같은 저장 공간.

스택은 Last In First Out [리포] 자료구조 형태이다. 

예를 들어 1, 2, 3, 4 순으로 데이터를 저장한다면, 데이터를 뺄 때는 4, 3, 2, 1 순으로 뺀다.

이 과정에서 데이터를 저장하는 명령어는 PUSH, 데이터를 꺼내는 명령어는 POP 이다.

 

: 스택과 다르게 양쪽이 뚫려 있는 통과 같은 저장 공간.

한쪽으로 데이터를 저장하고, 다른 한쪽으론 먼저 저장한 순서대로 데이터를 뺀다.

큐는 First In First Out [피포] 자료구조 형태이다.

 

1주차 마무리 소감

이번 1주차 과정은 난이도가 낮은 부분인 듯 하다. 다음부터 나갈 2주차 과정부터는 책으로 혼자 공부하다기보단, 저자께서 찍은 영상(유튜브 인강)을 통해서 학습을 해야할 것 같다.