커리큘럼 🫠


📃 기본 미션1

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

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

🖍 메모리, 램, RAM, 주기억장치

 

📃 기본 미션2

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

사진이 흐리다... 🥲

🖍 2의 보수 표현법은 2단계로 나누어진다.

1단계 : 모든 0과 1을 뒤집는다.

2단계 : 1을 더한다.

 

고로 1101의 경우 1단계에서 0010이 되며

2단계에서 0011이 된다.


📃 선택 미션

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

스택(stack)?
가장 먼저 입력된 자료가 가장 나중에 출력되는 자료형
push(add)와 pop(delete) 연산이 한 곳에서 발생되는 자료구조(LIFO, 후입선출)

실제로 이렇게 생긴건 아니고 추상화한 형태가 이렇다.
자료는 1,2,3의 순서로 입력되고 3,2,1의 순서로 출력된다.

큐(queue)?
가장 먼저 입력된 자료가 가장 먼저 출력되는 자료형
한쪽에서는 삽입연산만 발생 가능하고, 다른 한쪽에서는 삭제연산만 발생 가능한 자료구조(FIFO, 선입선출)

스택과 마찬가지로 추상화된 형태의 큐
자료는 1,2,3의 순서로 입력되고 1,2,3의 순서로 출력된다.


Chapter 1️⃣

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

  • 컴퓨터 작업의 문제 해결의 실마리를 다양하게 찾을 수 있다. 다양한 문제를 스스로 해결할 줄 아는 개발자가 되기 위한 소양 즉 문제 해결 능력이 향상된다.
  • 서비스 제공에서 필연적으로 고려되는 성능, 용량, 비용 문제에 대한 사고능력 증진
  • 컴퓨터 구조를 이해하면 우리는 컴퓨터를 미지의 대상에서 분석의 대상으로 인식하게 된다.

컴퓨터 구조의 큰 그림

1. 컴퓨터가 이해하는 정보

  • 컴퓨터는 0과 1로 표현된 정보 (데이터, 명령어)를 이해한다.
  • 데이터
    • 컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보
    • 컴퓨터와 주고 받는 정보, 컴퓨터에 저장된 정보를 가르키기도 한다.
  • 명령어
    • 컴퓨터를 실질적으로 작동시키는 중요한 정보
    • 데이터를 움직이고 컴퓨터를 작동시키는 정보

2. 컴퓨터의 핵심 부품

  • 중앙처리장치(CPU)
    • CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치이다.
    • ALU : 산술논리연산장치, 컴퓨터 내부에서 수행되는 대부분의 계산을 수행
    • 레지스터 : CPU 내부의 작은 임시 저장 장치, 여러 개의 레지스터가 존재하고 각기 다른 이름과 역할을 가지고 있음
    • 제어장치 : 제어신호를 내보내고 명령어를 해석하는 장치, 컴퓨터 부품을 관리하고 작동시키기 위해 필수
  • 주기억장치(메모리)
    • 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
    • 프로그램이 실행되려면 반드시 메모리에 저장되어 있어야 한다.
    • 주소(address) : 메모리에 저장된 값에 빠르고 효율적으로 접근하기 위한 위치 식별자
  • 보조기억장치
    • 전원이 꺼져도 저장된 내용을 잃지 않는, 메모리를 보조할 저장 장치
    • 일반적으로 주기억장치 보다 가격이 저렴하다.
  • 입출력장치
    • 마이크, 스피커, 프린터, 마우스, 키보드 등 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치 

✅ 메인보드와 시스템 버스메인보드에 연결된 부품들은 버스(bus)라는 데이터 전송 역할을 하는 통로로 정보를 주고 받는다.시스템 버스는 주소버스, 데이터 버스, 제어 버스로 구성되어있다.

  • 핵심 부품 4가지를 연결하는 가장 중요한 버스는 시스템 버스이다.
  • 컴퓨터 핵심부품은 모두 메인보드에 연결된다.

메인보드에 연결된 핵심부품들


Chapter 2️⃣

정보 단위

  • 0과 1을 나타내는 가장 작은 정보 단위를 비트(bit)라고 한다.
  • 8개의 비트를 묶어서 바이트(byte)라 하고 2⁸ (256)개의 정보를 표현한다.
  • 1바이트를 1000개 묶어서 1 킬로바이트
  • 1킬로바이트를 1000개 묶어서 1메가바이트
  • 1메가바이트를 1000개 묶어서 1기가바이트
  • 1기가바이트를 1000개 묶어서 1테라바이트

✅ 1024로 묶은 단위는 KiB, MiB, GiB, TiB이다.

✅ 워드(word) : CPU가 한 번에 처리할 수 있는 데이터 크기를 의미한다.

  • 워드의 절반 크기를 하프 워드(half word), 1배 크기를 풀 워드(full word), 2배 크기를 더블 워드(double word)라고 한다.
  • 현대 컴퓨터는 대부분 32비트 혹은 64비트의 워드 크기를 가진다.

이진법

  • 0과 1로 숫자를 표현한다.
  • 1000₍₂₎ 혹은 0b1000의 표기 형식을 가진다.

이진수의 음수 표현

  • 가장 널리 사용되는 방법은 2의 보수를 구해 음수로 간주하는 방법이 있다.
  • ‘어떤 수를 그보다 큰 2ⁿ 에서 뺀 값’
  • 간단하게 구하는 방법
    • 1단계 : 모든 0과 1을 뒤집는다.
    • 2단계 : 1을 더한다.
  • 컴퓨터 내부에서는 양수인지 음수인지를 구분하기 위해 플래그를 사용한다. (ex. flag가 음수면 이진수 값을 음수로 인지한다.)
  • 2의 보수를 취하는 방식은 널리 사용되지만 n비트로 -2ⁿ 과 2ⁿ 이라는 수를 동시에 표현 할 수 없다

십육진법

  • 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 로 16진법을 표시한다.
  • 15₍₁₆₎ 혹은 0x15의 표기 형식을 가진다.
  • 이진수와의 변환이 쉽기 때문에 쓰인다.

문자 집합

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

문자 인코딩

  • 문자를 0과 1로 변환하는 과정을 문자 인코딩이라 한다.

문자 디코딩

  • 인코딩의 반대 과정으로 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정

아스키 코드

  • 초창기의 문자 집합, 8비트 중 패리티 비트를 제외한 7비트로 문자를 나타낸다. 즉 2⁷ 개 (128개)의 문자를 표현할 수 있다.

EUC-KR

  • 완성형 인코딩 : 초성, 중성, 종성의 조합으로 이루어진 완성된 글자 하나에 고유한 코드를 부여하는 방식
  • 조합형 인코딩 : 자음 모음에 비트열을 할당하여 그것들을 조합하여 글자 코드를 완성하는 방식
  • EUC-KR은 2바이트 크기로 인코딩 할 수 있는 완성형 인코딩 방식이다.
  • 총 2350개의 한글 단어를 표현할 수 있지만 모든 글자를 표현할 순 없다.

유니코드와 UTF-8

  • 여러 나라의 문자를 광범위하게 표현할 수 있는 통일된 문자 집합
  • 현대 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합
  • 인코딩 방법에는 크게 UTF-8, UTF-16, UTF-32 등이 존재한다.

X로 표기된 부분에 이진수 값이 위치하는 것이 UTF-8의 인코딩 결과이다.


 

Chapter 3️⃣

고급 언어

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

저급 언어

  • 컴퓨터가 직접 이해하고 실행 할 수 있는 언어
  • 기계어, 어셈블리어가 있다.

기계어

  • 0과 1의 명령어 비트로 이루어진 언어
  • 오로지 컴퓨터만을 위해 만들어진 언어로 사람이 읽으면 의미를 이해하기 어렵다.

어셈블리어

  • 사람이 읽기 편한 형태로 번역한 저급 언어
  • 그래도 이해하기 쉽지 않아 복잡한 프로그램 개발엔 사용하기 힘들다.

컴파일 언어

  • 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
  • 소스 코드를 저급 언어로 변환하는 과정을 컴파일(compile)이라고 한다.
  • 컴파일을 수행해주는 도구를 컴파일러(compiler)라고 한다.
  • 소스 코드에서 문법적인 오류나 실행 불가능한 코드인지 따져 컴파일에 실패하기도 한다.
  • 컴파일러를 통해 저급언어로 변환된 코드를 목적 코드(object code)라고 한다.
  • 원론적으로 소스코드 전체를 살펴보고 컴파일을 수행한다.

인터프리터 언어

  • 인터프리터에 의해 한 줄씩 실행되는 고급 언어
  • 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구를 인터프리터(interpreter)라고 한다.
  • 소스코드 전체가 변환되길 기다릴 필요가 없다.
  • 일반적으로 컴파일 언어보다 실행 속도가 느리다. (한 줄씩 해석해야하기 때문)

명령어의 구조

  • 연산코드 : 명령어가 수행할 연산, 연산자
  • 오퍼랜드 : 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장될 위치, 피연산자
  • 연산 코드가 담기는 영역을 연산 코드 필드라 하고 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 한다.

오퍼랜드

  • 연산에 사용할 데이터 또는 연산에 사용할 데이터가 지정된 위치
  • 오퍼랜드 필드엔 데이터 주소값이 자주 저장되어 주소필드라고도 부른다.
  • 오퍼랜드가 명령어 안에 하나도 없는 명령어를 0-주소 명령어라고 한다.
  • 오퍼랜드가 명령어 안에 하나인 명령어를 1-주소 명령어라고 한다.
  • 오퍼랜드가 명령어 안에 두 개인 명령어를 2-주소 명령어라고 한다.
  • 오퍼랜드가 명령어 안에 세 개인 명령어를 3-주소 명령어라고 한다.

연산코드

  • 명령어가 수행할 연산을 의미
  • CPU마다 다르기 때문에 연산코드의 종류와 기능 정도만 알아 둘 것

연산코드의 종류

  • 데이터 전송
    • MOVE : 데이터를 옮겨라
    • STORE : 메모리에 저장하라
    • LOAD(FETCH) : 메모리에서 CPU로 제이터를 가져와라
    • PUSH : 스택에 데이터를 저장하라
    • POP : 스택의 최상단 데이터를 가져와라
  • 산술/논리 연산
    • ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라
    • INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
    • AND / OR / NOT : 논리연산을 수행하라
    • COMPARE : 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라
  • 제어 흐름 변경
    • JUMP : 특정 주소로 실행 순서를 옮겨라
    • CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
    • HALT : 프로그램의 실행을 멈춰라
    • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
    • RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
  • 입출력 제어
    • READ (INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
    • WRITE (OUTPUT) : 특정 입출력 장치로 데이터를 써라
    • START IO : 입출력 장치를 시작하라
    • TEST IO : 입출력 장치의 상태를 확인하라

주소 지정 방식 (addressing modes)

  • 연산에 사용할 데이터가 저장된 위치를 찾는 방법, 유효 주소를 찾는 방법, 다양한 명령어 주소 지정 방식이 있다.
  • 앞서 언급한 오퍼랜드 필드에 메모리나 레지스터의 주소를 담는 이유
    • 명령어의 길이 때문에 표현 할 수 있는 데이터가 한정적이기 때문
    • 오퍼랜드 필드에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.

✅ 유효주소(effective address) : 연산에 사용할 데이터가 저장된 위치

 

 

1. 즉시 주소 지정 방식 (immediate addressing mode)

  • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
  • 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 속도가 빠르다.

2. 직접 주소 지정 방식 (direct addressing mode)

  • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 유효 주소를 명시하는데에 한계가 있다. (즉시 주소 지정 방식과 동일한 문제 : 명령어의 길이)

3. 간접 주소 지정 방식 (indirect addressing mode)

  • 유효 주소의 주소를 오퍼랜드 필드에 명시하여 유효 주소의 범위가 넓다.
  • 두 번의 메모리 접근이 필요하기 때문에 일반적으로 느린 방식

4. 레지스터 주소 지정 방식 (register addressing mode)

  • 직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터 주소 값을 오퍼랜드에 명시하는 방법
  • 메모리에 접근하는 것보단 더 빠르다.
  • 직접 주소 지정 방식과 동일하게 유효 주소를 명시하는데에 한계가 있다.

5. 레지스터 간접 주소 지정 방식 (register indirect addressing mode)

  • 연산에 사용할 데이터를 메모리에 저장하고, 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
  • 메모리에 접근하는 횟수가 한 번으로 간접 주소 지정 방식보다 빠르다.

+ Recent posts