✏️ 1주차 진도: Chapter 01 ~ 03
- 기본 숙제(필수): p. 51의 확인 문제 3번, p. 65의 확인 문제 3번 풀고 인증하기
- 추가 숙제(선택): p. 100의 스택과 큐의 개념을 정리하기
실력있는 개발자가 되기 위해서는 컴퓨터 구조를 반드시 알아야 한다!
같은 코드를 작성했는데도 컴퓨터 시스템에 따라 제대로 작동하지 않는 경우가 있을 수 있음!
컴퓨터 구조를 이해하고 있다면 문제 상황을 빠르게 진단할 수 있고, 문제 해결의 실마리를 다양하게 찾을 수 있다.
프로젝트에 알맞은 서버 컴퓨터나 클라우드 서비스를 선택하려면 컴퓨터 구조에 대해 알아야 함. 무조건 싸거나 비싼 것이 좋은 게 아님!
컴퓨터는 0과 1로 표현된 정보만을 이해 (데이터, 명령어)
데이터
컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보
명령어
데이터를 움직이고 컴퓨터를 작동시키는 정보
중앙처리장치(CPU)
메모리에 저장된 명령어를 읽고, 읽은 명령어를 해석, 실행하는 부품.
산술논리연산장치(ALU, Arithmetic Logic Unit)
- 컴퓨터 내부에서 수행되는 대부분의 계산을 ALU에서 수행함.
레지스터
- CPU 내부의 작은 임시 저장 장치.
제어장치(CU, Control Unit)
- 제어 신호(ex. 메모리 읽기, 메모리 쓰기)라는 전기 신호를 내보내고 명령어를 해석하는 장치.
주기억장치(메모리)
현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
저장된 값에 빠르고 효율적으로 접근하기 위해 '주소'를 사용함.
가격이 비싸 저장 용량이 적고, 전원이 꺼지면 저장된 내용을 잃음.
보조기억장치
메모리보다 크기가 크고 전원이 꺼져도 저장된 내용을 잃지 않는 메모리를 보조하는 저장 장치 (하드 디스크, SSD, USB, DVD, CD-ROM)
입출력장치
마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치
보조기억장치를 메모리를 보조하는 특별한 기능을 수행하는 입출력장치라고 볼 수도 있음.
메인보드와 시스템 버스
컴퓨터의 핵심 부품들은 모두 메인보드(마더보드)라는 판에 연결됨.
메인보드에 연결된 부품들은 버스라는 통로를 통해 서로 정보를 주고 받음. 컴퓨터의 핵심 부품을 연결하는 가장 중요한 버스는 시스템 버스이고, 시스템 버스는 주소 버스, 데이터 버스, 제어 버스로 구성되어 있음.
비트
0과 1을 나타내는 가장 작은 정보 단위
n bit는 2^n 가지의 정보를 표현할 수 있음
1byte == 8bit
1KB == 1000byte
1MB == 1000kB
1GB == 1000MB
1TB == 1000GB
워드
CPU가 한 번에 처리할 수 있는 데이터 크기
0과 1만으로 모든 숫자를 표현하는 방법
1을 넘어가는 시점에서 자리 올림을 하여 숫자를 표현함
이진수 표기 방법
수학적 표기 : 1000_(2)
코드 상 표기 : 0b1000
이진수로 음수를 표현하는 방법 중 가장 널리 사용되는 방법은 2의 보수(two's complement) 를 구해 이 값을 음수로 간주하는 방법.
2의 보수
어떤 수를 그보다 큰 2^n에서 뺀 값
0b11의 보수는
0b100에서 0b11을 뺀 값인 0b01
좀 더 쉽게 표현하자면,
모든 0과 1을 뒤집고 거기에 1을 더한 값
0b11
11 -> 00 -> 01
0b01
실제로 이진수만 봐서는 음수인지 양수인지 구분하기 어려움.
이를 구분하기 위해 사용하는 것이 flag
two's complement의 한계
수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식.
10, 11, 12, 13, 14, 15 대신 A, B, C, D, E, F를 사용.
십육진수 표기 방법
수학적 표기 : 15_(16)
코드 상 표기 : 0x15
십육진수는 한 글자당 16(2^4)종류의 숫자를 표현가능하므로, 십육진수 한 자리를 이진수로 표현하려면 4bit가 필요함.
십육진수의 각 자리를 따로 따로 이진수로 변환한 후 그 비트들을 이어 붙이면 십육진수를 2진수로 바꿀 수 있음!
0x1A2B
0b 0001 1010 0010 1011
이진수를 십육진수로 바꿀 때는 이진수의 숫자들을 4개씩 끊어 십육진수로 변환한 후 이어 붙이면 됨.
문자 집합
컴퓨터가 인식하고 표현할 수 있는 문자의 모음
문자 인코딩
컴퓨터가 이해할 수 있도록 문자를 0과 1로 변환하는 과정
같은 문자 집합에 대해서도 다양한 인코딩 방법이 있을 수 있음.
문자 디코딩
인코딩의 반대 과정.
0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정.
초창기 문자 집합 중 하나로, 영어 알파벳, 아라비아 숫자, 일부 특수 문자, 제어 문자(space, Backspace, Escape 등)를 포함함.
각 문자들은 7bit로 표현됨.
대표적인 한글 완성형 인코딩 방식
한글 한 글자에 2byte 코드가 부여됨.
집합에 정의되지 않은 한글은 표현 불가.
완성형 인코딩 : 초성, 중성, 종성의 좋바으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
조합형 인코딩 : 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식
유니코드
현대 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합.
여러 나라의 문자를 광범위하게 표현할 수 있음.
UTF-8
유니코드 문자에 부여된 값을 인코딩하는 방법 중 하나.
고급 언어
우리가 프로그램을 만들 때 사용하는 프로그래밍 언어
사람을 위한 언어
저급 언어
컴퓨터가 직접 이해하고 실행할 수 있는 언어
명령어로 이루어져 있음.
기계어
- 0과 1의 명령어 비트로 이루어진 언어.
어셈블리어
- 0과 1로 표현된 명령어를 사람이 읽기 편한 형태로 번역한 언어
고급 언어가 저급 언어로 변환되는 방식에는 컴파일 방식과 인터프리트 방식이 있음.
컴파일 언어
컴파일 방식으로 작동하는 프로그래밍 언어
컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행됨.
대표적인 컴파일 언어로는 C가 있음.
컴파일러가 소스 코드 내에서 오류를 하나라도 발견하면 해다 ㅇ소스 코드는 컴파일에 실패함.
컴파일러를 통해 저급 언어로 변환된 코드를 object code라고 함.
인터프리터 언어
인터프리트 방식으로 작동하는 프로그래밍 언어
인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어.
대표적인 인터프리터 언어로 Python이 있음.
인터프리터 언어는 컴퓨터와 대화하듯 소스 코드를 한 줄씩 실행하기 때문에 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없음.
소스 코드 N번째 줄에 문법 오류가 있어도 N-1번째 줄까지는 올바르게 수행됨.
일반적으로 인터프리터 언어는 컴파일 언어보다 느림.
-> 한 번 컴파일을 실행해서 나온 object code는 바로 컴퓨터가 이해하고 실행할 수 있는데, 인터프리터 언어는 소스 코드를 한 줄 한 줄 해석하면서 실행해야 하기 때문.
목적 파일
object code로 이루어진 파일
실행 파일
실행 코드로 이루어진 파일
.exe 확장자를 가진 파일이 대표적인 실행 파일
목적 파일이 실행 파일이 되기 위해서는 linking이라는 작업을 거쳐야 함.
-> 목적 파일에 없는 외부 기능을 목적 파일과 연결 짓는 작업이 필요
명령어는 연산 코드와 오퍼랜드로 구성되어 있음.
연산 코드(operation code)
기본적인 연산 코드 유형
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
오퍼랜드(operand)
명령어의 구조
operation code | operand
유효 주소(effective address)
연산 코드에 사용할 데이터가 저장된 위치
주소 지정 방식
연산에 사용할 데이터 위치를 찾는 방법
유효 주소를 찾는 방법
다음 설명의 빈칸에 들어갈 알맞은 내용을 써 보세요.
프로그램이 실행되려면 반드시 ( )에 저장되어 있어야 합니다.
답: 메모리
1101_(2)의 음수를 2의 보수 표현법으로 구해보세요
1101 -> 0010 -> 0011
답: 0011
가장 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식 (LIFO)
데이터를 차곡 차곡 쌓는 형태로 저장하는 방식
가장 먼저 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식 (FIFO)
자동차 터널처럼 데이터를 저장하는 방식
참고 자료
혼자 공부하는 컴퓨터구조 + 운영체제 (강민철, 한빛미디어)