컴퓨터는 0과 1로 이루어진 정보인 데이터와 명령어를 이해한다.
컴퓨터가 공통으로 가지는 핵심 부품 4가지
CPU는 컴퓨터의 두뇌로, 명령어를 읽어들이고 해석한뒤 명령어에 따른 실행 결과를 반환한다.
ALU
이름 그대로 산술논리와 관련된 연산을 실행한다. 쉽게 말해 계산기라고 할 수 있다.
레지스터
레지스터는 CPU의 임시저장장치이다. 레지스터는 CPU 내에 여러 개 있다.
제어장치
제어신호를 내보내는 장치이다. 제어신호는 각 컴퓨터 부품에 보내는 전기신호인데, 제어신호를 통해 명령어를 실행한다.
메모리는 주기억장치라고도하며, 현재 실행되는 프로그램의 데이터와 명령어를 저장한다.
어떠한 프로그램이 실행되기 위해서는 메모리에 데이터와 명령어가 저장되어있어야한다.
메모리는 가격이 비싸고, 전원이 꺼지면 저장된 내용을 모두 잃는다는 단점이 있다. 보조기억장치는 메모리보다 크기가 크고, 전원이 꺼져도 저장된 내용을 잃지 않는다.
보조기억장치의 예로는 하드디스크, SSD, USB, DVD 등이 있다.
메모리는 현재 실행되고 있는 프로그램을 저장하고, 보조기억장치는 삭제되면 안 되는, 보관할 프로그램을 저장한다.
입출력장치는 컴퓨터 외부에 연결되어 컴퓨터와 정보를 주고받는 장치이다.
마이크, 모니터, 키보드 등이 입출력장치에 해당한다.
버스
메인 보드 내부에서 정보를 전달하는 통로
시스템버스
메인보드 내에는 여러가지의 버스 중, 컴퓨터 핵심 부품을 연결하는 가장 주된 버스
시스템 버스는 어떠한 정보가 흐르는가에 따라 주소버스, 데이터버스, 제어버스로 나뉜다.
지금까지 설명한 컴퓨터구조를 그림으로 그리면 다음과 같다.
아스키 코드는 0~127개의 문자만 표현할 수 있고, 영어만 적을 수 있다는 단점이 있었다. 또한 한글 인코딩을 위한 EUC-KR도 모든 한글을 표현할 수 없다는 한계가 있다.
사람이 읽을 수 있는 고급언어를 기계가 이해하는 저급언어(기계어, 어셈블리어) 로 번역하는 방법은 컴파일 방법과 인터프리트 방법이 있다.
하나의 명령어는 연산코드(동작), 오퍼랜드(동작의 대상, 피연산자)으로 나뉜다. 오퍼랜드는 아예 없을 수도 있고, 여러 개 있을 수도 있다.
오퍼랜드에 데이터를 직접 담을 수도 있지만, 보통은 메모리나 레지스터의 주소값을 담는다.
51p 3번
프로그램이 실행되려면 반드시 메모리
에 저장되어 있어야 한다.
65p 3번
이진수 1101을 2의 보수 표현법으로 표현하면 0011
이다.
- push : 스택의 가장 꼭대기에 값을 저장한다.
- pop : 스택의 가장 꼭대기 값을 삭제하고 반환한다.
- peek : 스택의 가장 꼭대기 값을 삭제하지 않고 반환한다.
스택은 프로그래머스의 '같은 숫자는 싫어' 문제를 통해 구현해보았다.
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
int[] answer = {};
Stack<Integer> stack = new Stack<>(); // 스택 선언
stack.push(arr[0]); // 가장 첫 번째 값을 넣고 시작
for(int i=1; i<arr.length; i++){
if(stack.peek() != arr[i]){
stack.push(arr[i]);
}
}
answer = new int[stack.size()];
int i = answer.length - 1; // 인덱스값
while(!stack.isEmpty()){
answer[i] = stack.pop();
i--;
}
return answer;
}
}
- add : 큐에 값을 추가한다. 실패하면 예외처리한다.
- offer : 큐에 값을 추가한다. 실패하면 false를 리턴한다.
- remove : 큐에 가장 먼저 들어간 값을 제거한다. 실패하면 예외처리한다.
- poll : 큐에 가장 먼저 들어간 값을 제거한다. 실패하면 false를 리턴한다.
- peek : 큐에 가장 먼저 들어간 값을 리턴한다. (삭제X) 실패하면 null을 리턴한다.
큐를 이용한 문제는 추후에 풀어볼 예정이다.
파이팅~