기본 미션
p.51의 확인 문제 3번 풀고 인증하기
- 다음 설명의 빈칸에 들어갈 알맞은 내용을 써보세요.
프로그램이 실행되려면 반드시 ( )에 저장되어 있어야 합니다.
정답: 메모리
p.65의 확인 문제 3번 풀고 인증하기
- 1101(2)의 음수를 2의 보수 표현법으로 구해 보세요.
1101
↓ (모든 0과 1 뒤집기)
0010
↓ (1 더하기)
0011
정답: 1101(2)를 음수로 표현한 값은 0011(2) 입니다.
선택 미션
p.100의 스택과 큐의 개념을 정리하기
스택 (stack)
- 한쪽 끝이 막혀 있는 통과 같은 저장 공간
- LIFO (Last In First Out) 자료 구조: 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식 (후입선출)
큐 (queue)
- 양쪽이 뚫려 있는 통과 같은 저장 공간
- FIFO (First In First Out) 자료 구조: 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식 (선입선출)
내용 정리
1-1. 컴퓨터 구조를 알아야 하는 이유
- 문제 해결을 위한 다양한 실마리를 찾을 수 있음
- 개발한 프로그램의 성능과 용량, 비용을 고려할 수 있음
1-2. 컴퓨터 구조의 큰 그림
컴퓨터가 이해하는 정보
- 데이터: 컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보. 명령어를 위해 존재하는 일종의 재료
- 명령어: 컴퓨터를 작동시키는 정보
(컴퓨터는 명령어를 처리하는 기계임)
컴퓨터의 4가지 핵심 부품
- 중앙처리장치 (CPU): 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품
- 주기억장치 (메모리): 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
- 보조기억장치: 전원이 꺼져도 보관할 프로그램을 저장하는 부품
- 입출력장치: 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품
메모리
- 프로그램이 실행되기 위해서는 반드시 메모리에 저장되어 있어야 함
- 메모리는 현재 실행되는 프로그램 (프로세스)의 명령어와 데이터를 저장
- 메모리에 저장된 값의 위치는 주소로 알 수 있음
CPU
- CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치
- CPU 내부에는 ALU, 레지스터, 제어장치가 있음
- ALU는 계산하는 장치, 레지스터는 임시 저장 장치, 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치
시스템버스
: 컴퓨터의 네 가지 핵심 부품들이 서로 정보를 주고받는 통로
- 주소 버스, 데이터 버스, 제어 버스로 구성되어 있음
- 메인보드 내부에는 시스템 버스를 비롯한 다양한 버스가 있음
- CPU가 메모리에 값을 저장할 때 주소 버스, 데이터 버스, 제어 버스를 모두 사용할 수 있음
2-1. 0과 1로 숫자를 표현하는 방법
- 비트: 0과 1로 표현할 수 있는 가장 작은 정보 단위
- 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트는 비트보다 더 큰 정보 단위
- 워드(word): CPU가 한 번에 처리할 수 있는 데이터 크기 (x64 CPU는 64비트 워드 CPU)
- 이진법은 1을 넘어가는 시점에 자리 올림을 하여 0과 1만으로 수를 표현하는 방법
- 이진법에서 음수는 2의 보수로 표현 가능
- 2의 보수: 어떤 수를 그보다 큰 2^n에서 뺀 값
- 십육진법은 15를 넘어가는 시점에 자리 올림하여 수를 표현하는 방법
- 이진수와 십육진수 간의 변환이 쉽기 때문에 이진수와 더불어 십육진수가 많이 사용됨
2-2. 0과 1로 문자를 표현하는 방법
- 문자 집합은 컴퓨터가 인식할 수 있는 문자의 모음으로, 문자 집합에 속한 문자를 인코딩하여 0과 1로 표현할 수 있음
- 아스키 문자 집합에 0부터 127까지의 수가 할당되어 아스키 코드로 인코딩됨
- 문자 표현을 위해 사용되는 비트 7비트, 1비트는 패리티 비트로 오류 검출을 위해 사용
- EUC-KR은 한글을 2바이트 크기로 인코딩할 수 있는 완성형 인코딩 방식
- 유니코드는 여러 나라의 문자들을 광범위하게 표현할 수 있는 통일된 문자 집합이며, UTF-8, UTF-16, UTF-32는 유니코드 문자의 인코딩 방식
3-1. 소스 코드와 명령어
- 고급 언어: 사람이 이해하고 작성하기 쉽게 만들어진 언어
- 저급 언어: 컴퓨터가 직접 이해하고 실행할 수 있는 언어
- 저급 언어는 0과 1로 이루어진 명령어로 구성된 기계어와 기계어를 사람이 읽기 편한 형태로 번역한 어셈블리어가 있음
- 컴파일 언어: 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어
- 인터프리터 언어: 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 변환되어 실행되는 언어
컴파일 언어와 인터프리터 언어
- 컴파일 언어는 한 줄이라도 소스상에 오류가 있다면 실행될 수 없음
- 일반적으로 컴파일 언어가 인터프리터 언어보다 빠름
- 인터프리터는 인터프리터 언어로 작성된 소스 코드를 한 줄씩 저급 언어로 변환하여 실행함
- 컴파일러는 컴파일 언어로 작성된 소스 코드 전체를 목적 코드로 변환함
❓ Java는 컴파일 언어일까? 인터프리터 언어일까?
Java의 경우 저급 언어가 되는 과정에서 컴파일과 인터프리트를 동시에 수행
-
프로그래머가 작성한 프로그램은 텍스트 파일
- 확장자가 java
- [Workspace 이름] > [Project 이름] > src
- 메모장으로 열면 텍스트 형식 (인간이 읽을 수 있는 형태)
-
자바 소스 코드를 컴파일하면 실행 파일 생성
- 확장자가 .class
- [Workspace 이름] > [Project 이름] > bin
- 메모장으로 열면 이진 형식 (인간이 읽을 수 없는 형태)
-
실제로 실행되는 것은 클래스 파일
컴파일 과정
1. 자바 컴파일러는 자바 언어로 작성된 프로그램을 가상 컴퓨터의 기계어가 들어 있는 파일(바이트 파일)로 변환
2. 자바 가상 기계(JVM: Java Virtual Machine)라는 특수한 가상 컴퓨터 S/W가 바이트 코드를 한 줄씩 읽어서 해석한 후에 실행
두 단계로 나누어서 컴파일하고 실행하는 이유
: 응용 프로그램들을 다시 컴파일하지 않아도 모든 컴퓨터에서 실행되도록 하기 위해서
JVM만 가지고 있다면 어떤 바이트 코드도 다시 컴파일할 필요없이 JVM 위에서 실행할 수 있음. 동일한 바이트 코드 파일이 윈도우, 리눅스, Mac OS에서 변경없이 실행 가능
3-2. 명령어와 구조
- 명령어: 연산 코드와 오퍼랜드로 구성
- 연산 코드: 명령어가 수행할 연산을 의미
- 오퍼랜드: 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미
- 주소 지정 방식: 연산에 사용할 데이터 위치를 찾는 방법
연산 코드
- 데이터 전송 (MOVE, STORE, LOAD, PUSH, POP...)
- 산술/논리 연산 (ADD, INCREMENT, AND, COMPARE...)
- 제어 흐름 변경 (JUMP, HALT, CALL, RETURN...)
- 입출력 제어 (READ, WRITE, START IO, TEST IO...)
주소 지정 방식
- 즉시 주소 지정 방식
: 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 표현할 수 있는 데이터의 크기가 작아지는 단점
- 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 다른 주소 지정 방식들보다 빠름
-
직접 주소 지정 방식
: 오퍼랜드 필드에 유효 주소를 직접적으로 명시
- 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 커짐
- 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있음
-
간접 주소 지정 방식
: 유효 주소의 주소를 오퍼랜드 필드에 명시
- 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어짐
- 두 번의 메모리 접근이 필요하기 때문에 앞의 주소 지정 방식들보다 일반적으로 느림
-
레지스터 주소 지정 방식
: 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시
- CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르기 때문에, 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있음
- 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음 (직접 주소 지정 방식과 비슷한 문제를 공유)
-
레지스터 간접 주소 지정 방식
: 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시
- 간접 주소 지정 방식보다 빠름
정리
- 즉시 주소 지정 방식: 연산에 사용할 데이터
- 직접 주소 지정 방식: 유효 주소 (메모리 주소)
- 간접 주소 지정 방식: 유효 주소의 주소
- 레지스터 주소 지정 방식: 유효 주소 (레지스터 이름)
- 레지스터 간접 주소 지정 방식: 유효 주소를 지정한 레지스터