CHAPTER 03
🩷 03-1 컴퓨터는 어떻게 일하나요?
🩵 CPU
CPU (Central Processing Unit) : 컴퓨터를 통제하고 주어진 작업을 수행하는 장치
- 다른 컴퓨터의 구성 요소와 정보를 주고받으면서 컴퓨터에서 이뤄지는 모든 일을 관할함
- 컴퓨터에 저장된 프로그램을 불러와서 기계어로 작성된 명령문을 해석하고 실행함
🩵 코어, 스레드, 클럭
🤍 코어
코어 : CPU 중 가장 핵심이 되는 부품
멀티코어 : 여러개의 코어가 이루어졌다는 것
- 요즈음 CPU 제조사들은 코어 자체의 속도를 높이기보다 여러 개의 코어를 탑재하는 방식을 택함
- 코어 앞에 오는 숫자나 수식어는 코어의 수를 의미
- 듀얼 (2), 쿼드 (4), 헥사 (6), 옥타 (8) 등
🤍 스레드
스레드 : 하나의 프로세스 안에서 돌아가는 한 개 이상의 작업 단위
🤍 클럭
클럭 : 기가헤르츠 (GHz) 단위로 표시되는 정보
- 코어의 속도를 의미함
- 기가헤르츠의 숫자가 클수록 코어의 속도가 빨라짐
🩵 메모리
메모리 : 컴퓨터의 작업에 사용되는 데이터를 일시적 또는 영구적으로 저장하는 장치
🤍 주기억장치
주기억장치 : 컴퓨터 내부에서 현재 CPU가 처리하고 있는 내용을 저장하고 있는 기억장치
- 비교적 용량이 크고 처리속도가 빠름
- CPU의 명령에 의해 기억된 장소에 직접 접근하여 읽고 쓸 수 있음
🤍 보조기억장치
보조기억장치 : 물리적인 디스크가 연결되어 있는 기억장치
- 컴퓨터의 전원을 끄더라도 저장된 데이터가 사라지지 않고 영구적으로 보관할 수 있음
🤍 램
램 (RAM : Random Access Memory) : 메모리 어느 위치에 있는 데이터든지 같은 속도로 읽고 쓸 수 있음
기억 장치 속도는 캐시 > 메인 메노리 > 보조 기억 장치 순으로 빠름
🤍 휘발성 메모리와 비휘발성 메모리
휘발성 메모리 : 전력이 끊겼을 때 데이터가 손실되는 메모리
비휘발성 메모리 : 전력이 끊겨도 데이터가 유지되는 메모리
🩵 입출력 장치
입출력 장치 (I/O : Input/Output) : 컴퓨터에 신호와 정보를 보내는 입력장치와 컴퓨터의 연산을 결과로 내보내는 출력 장치
- 모니터, 프린터, 키보드, 마우스 등이 해당됨
🩵 프로세스, 스레드
🤍 프로세스
프로세스 : 프로그램이 메모리에 올려져 CPU에 의해 실행되는 상태
여러 프로세스를 함께 처리하는 방법
- 병렬 처리 방법
- 병렬 처리 : 여러 작업을 동시에 실행하는 방법
- 2개 이상의 코어가 각기 다른 프로세스의 명령을 실행해서 각 프로세스가 같은 순간에 실행되도록 하는 방법
- 멀티 코어 환경에 맞게 프로그래밍만 잘 되어 있다면 코어의 개수만큼 빠른 일 처리 가능
- 병행 처리 방법
- 병행 처리 : 하나의 코어가 여러 프로세스를 돌아가면서 조금씩 처리하는 것
- 작업을 조금씩 나누어 실행하면서 컴퓨터가 마치 여러 작업을 동시에 실행하는 것처럼 보이게 하는 처리 방법
- 컨텍스트 스위칭 : 진행 순서를 바꾸는 것
- 컴퓨터에서는 컨텍스트 스위칭이 매우 빠르게 일어나기 때문에 사람 눈에는 여러 프로그램이 동시에 실행되는 것처럼 보임
- 멀티 프로세싱 : 여러 프로세스를 함께 진행하는 것
🤍 스레드
스레드 : 하나의 프로세스 안에서 돌아가는 한 개 이상의 작업 단위
- 프로세스와 같이 컨텍스트 스위칭을 통해 병행 처리됨
- 멀티 스레딩 : 여러 스레드가 함께 실행되는 것
🤍 프로세스와 스레드의 차이
프로세스 | 스레드 |
자기 영역을 명시해 둠 | 서로의 공간 구분하지 않음 |
멀티 프로세싱을 하면 메인 메모리가 배로 필요 | 스레드가 많아져도 메모리 추가로 차지하지 않음 |
🩷 03-2 바이트는 뭐고 자료형은 왜 쓰나요?
🩵 비트와 바이트
비트 (bit) : 2진 숫자 (binary digit) 의 약자로, 컴퓨터가 다루는 데이터의 최소단위이며 0 또는 1 이라는 2개의 값을 가짐
바이너리 파일
바이너리 파일 : 사람이 읽을 수 있는 텍스트 형식이 아니라 컴퓨터가 읽을 수 있는 이진 (바이너리) 숫자 형식으로 작성된 파일
● 이미지 파일, 동영상 파일, 각종 프로그램 실행 파일들이 해당됨
불리언 (boolean, 불) : true 혹은 false의 값만 가질 수 있는 값
바이트 : 비트 8개가 모인 것
0부터 255까지 총 256가지의 값을 가질 수 있음
🩵 자료형
자료형 : 프로그래밍 언어에서 여러 종류의 데이터를 저장하는 방식
자료형 | 비트 | 바이트 | 설명 |
byte | 8 | 1 | -2⁷ ~ -2⁷ - 1 사이의 정수 (-128 ~ 127) |
short | 16 | 2 | -2¹⁵ ~ 2¹⁵ - 1 사이의 정수 (-32,768 ~ 32,767) |
int | 32 | 4 | -2³¹ ~ 2³¹ - 1 사이의 정수 |
long | 64 | 8 | -2⁶³ ~ 2⁶³ - 1 사이의 정수 |
float | 32 | 4 | 소수점 6~7자리까지 정확도를 갖는 실수 |
double | 64 | 8 | 소수점 15자리까지 정확도를 갖는 실수 |
boolean | 1 | 1 | true, false (참 또는 거짓) |
char | 16 | 2 | 유니코드 문자 데이터 |
🩵 유니코드
유니코드 : 전 세계에서 사용되는 대부분의 문자를 포함한 문자열 셋
45 | - | 65 | A | 97 | a |
46 | . | 66 | B | 98 | b |
47 | / | 67 | C | 99 | c |
48 | 0 | 68 | D | 100 | d |
49 | 1 | 69 | E | 101 | e |
문자열 셋 : 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 숫자로 만든 것
문자 인코딩 : 문자열 셋을 사람이 입력하는 문자를 그에 해당하는 숫자로 변환하는 것
아스키 코드 (ASCII code) : 0 ~ 127까지의 7비트 공간 안에 대문자와 소문자 알파벳, 스페이스와 탭, 각종 부호 값들이 지정되어 있음
유니코드 : 하나의 (Uni) 의 표 안에 한글, 한자, 히라가나를 비롯한 세계 각국의 문자, 고대 문자, 이모티콘까지 문자를 포함하고있음
🩷 03-3 프로그래밍 언어 분류
🩵 컴파일 언어, 인터프리터 언어
컴파일 언어 : 실행되기 전 다른 형식으로 번역되는 언어
인터프리터 언어 : 작성된 코드 그대로 통역되어 실행되는 언어
컴파일 : 코드를 실행하기 전에 기계어나 다른 코드로 먼저 번역한다는 것
컴파일러 : 소스 코드를 다른 언어나 형태로 번역해 주는 프로그램
🤍 컴파일 언어와 인터프리터 언어 비교하기
컴파일 언어 | 인터프리터 언어 |
컴파일에 많은 시간 소모 | |
업데이트 과정에서 수정 후 전체를 다시 빌드해서 배포해야 함 | |
오류를 미리 발견해 배포 후의 문제를 어느 정도 방지할 수 있음 | 오류가 잘 발견되지 않음 |
배포된 후에는 빠르게 실행됨 | 프로그램 실행 속도 느림 |
통합 개발 환경 (IDE : Integrated Development Environment) : 프로그래머가 소프트웨어 코드를 효율적으로 개발하도록 돕는 소프트웨어 애플리케이션
런타임 : 프로그램이 배포된 다음 실행되는 시점
런타임 오류 : 프로그램 실행 중에 오류가 생기는 경우
정적 타입 : 자료형이 고정된 것, 컴파일 언어에 사용
동적 타입 : 자료형이 고정되지 않은 것, 인터프리터 언어에 사용
🩵 절차지향, 객체지향 프로그래밍
🤍 절차지향 프로그래밍
절차지향 프로그래밍 : 소스 코드를 위에서부터 차례대로 읽는 방법
- 소스 코드의 순서가 매우 중요
- 소스 코드의 순서가 바뀌면 결과가 달라질 수 있음
- 프로그램 전체가 유기적으로 연결되어 있음
- 사소한 문제 하나만 생겨도 시스템 전체가 작동하지 않음
🤍 객체지향 프로그래밍
객체지향 프로그래밍 : 프로그램을 다수의 객체로 만들고 이 객체끼리 서로 상호작용하는 방법
장점
- 각 객체의 역할이 나누어져 있음
- 사용하고자 하는 부분에서 각각의 객체가 따로 작동
- 하나의 객체가 고장 나더라도 해당 객체만 교체하면됨
- 유지 보수가 쉽고 생산성이 좋음
단점
- 모든 객체의 역할과 기능을 이해해야 하기 때문에 설계에 많은 시간이 걸림
- 처리 속도가 느림
- 대채로 난도가 높음
🤍 설계도
클래스 : 스펙을 정의하는 명세서
🤍 상속
상속 : 상위 클래스의 기능을 하위 클래스가 물려받아 기존 클래스에 기능을 추가하거나 재정의하는 것
- 기존에 작성된 클래스를 재사용해서 코드의 중복을 줄일 수 있음
- 상위 클래스를 수정하면 하위 클래스의 코드도 수정 효과를 보기 때문에 유지 보수에 드는 시간도 줄어듬
🩵 함수형 프로그래밍
함수형 프로그래밍 : 변수 사용을 최소화함으로써 스파게티 코드의 오류를 줄이는 프로그래밍
스파게티 코드 : 정상적으로 작동하긴 하지만, 코드의 구조를 파악하기 어려운 코드를 부르는 명칭
함수 (function) : 특정한 기능을 하는 소스 코드를 따로 빼서 묶어 놓은것
- 코드를 기능별로 구분해서 코드 분석이 편리해짐
- 같은 코드를 여러 번 사용하는 코드 중복을 줄일 수 있음
🩵 매니지드 언어, 언매니지드 언어
매니지드 언어 : 언어 자체에서 메모리를 관리해 주는 언어
언매니지드 언어 : 개발자가 직접 메모리를 관리해야 하는 언어
메모리 관리 : 메인 메모리를 관리하는 것
🩷 03-4 오류라는 위험에 대비하기
🩵 컴파일 오류, 런타임 오류
🤍 컴파일 오류
컴파일 오류 : 소스 코드를 컴파일하는 과정에서 일어나는 오류
- 해결하지 않으면 빌드 자체가 되지 않음
- 오류 발생 원인이 뚜렷하기 때문에 파악하기도 쉬움
🤍 런타임 오류
런타임 오류 : 프로그램 실행 도중 발생하는 오류
런타임 오류 발생 원인
- Null에 의한 오류
- 0으로 나눠서 생기는 오류
- 의도하지 않은 무한 루프
버그 : 개발자에 의해 발생
오류 : 프로그램 사용자에 의해 발생
🩵 논리 오류
논리 오류 : 컴파일과 실행 모두 성공하지만 실행 결과가 올바르지 않은 오류
- 알고리즘상의 논리적 결함이나 코드상의 문제로 발생함
- 눈에 띄지 않는 오류이기 때문에 가장 경계해야할 오류
🩵 예외처리
예외처리 : 오류 발생 시에도 프로세스를 지속시킬 수 있는 수단
- try - catch 구문 사용
- try : 오류를 예상
- catch : 해당 오류의 대처 방법
🩵 메모리 누수
메모리 누수 : 사용하지 않는 데이터가 비워지지 않고 메인 메모리 공간에 쌓여있는 현상
가비지 컬렉션 : 메인 메모리상 불필요한 데이터를 자동으로 치우는 기능
- 메모리 데이터 중에 사용할 일이 없는 데이터를 컴퓨터가 판단해서 주기적으로 치워주는 것
- 프로그램이 동작하는 도중 불특정 시점에 실행됨
- 프로그램이 부분적으로 혹은 전체적으로 중단됨
- 어떤 데이터가 더 이상 사용되지 않을지 또한 컴퓨터가 판단해야하므로 시간이 소요됨
컴파일 오류 | 컴파일 단계에서 발생하는 경우 | ● 키워드, 맞춤법이 틀린 경우 ● 필요한 문장 부호가 빠진 경우 ● 선언되지 않은 변수를 사용한 경우 |
런타임 오류 | 프로그램 실행 중 발생하는 경우 | ● 0으로 나누는 경우 ● 무한 루프에 빠지는 경우 ● Null 경우 |
논리 오류 | 컴파일 및 실행은 되지만 사용자가 의도한 결과가 나오지 않는 경우 | |
구문 오류 | 프로그래밍 언어의 사용법에 맞지 않는 코드로 인해 발생하는 경우 |
🩷 03-5 개발에 필요한 여러 가지 도구
🩵 패키지 매니저
패키지 : 소스 코드를 배포하기 위해 사용되는 코드 묶음
패키지 매니저 : 라이브러리의 설치, 업데이트, 삭제 등을 관리하는 소프트웨어 도구
운영체제 패키지 매니저 : 컴퓨터에서 사용할 프로그램들을 관리
프로그래밍 언어 패키지 매니저 : 소프트웨어를 개발할 때 사용할 수 있음
🩵 환경변수
환경 변수 : 프로그램이 작동할 환경에 지정된 변경 가능한 값
- 시스템 실행 파일이 있는 디렉터리를 지정하는 등 운영체제에서 작동하는 응용 프로그램이 참조하기 위한 설정 기록
🤍 필요한 프로그램의 실행 경로
path 환경 변수 : 컴퓨터에서 작동하는 프로그램을 필요로 하는 다른 프로그램이나 라이브러리의 위치를 모두가 접근할 수 있는 곳에 적어 두는 용도로 사용하는 환경 변수
🤍 개발 환경 용도 구분
일반적으로 기업에서는 같은 구조의 데이터베이스를 두 개 이상 두어 하나는 실제 서비스에 사용하고 나머지는 개발용 및 테스트용으로 사용함
만약 환경 변수를 사용하지 않는다면 개발 중에 개발용 데이터베이스를 사용하도록 코드를 작성한 뒤 배포할 때마다 빌드 전 코드를 서비스용 데이터베이스에 맞게 수정해야 함.
위 진행이 번거롭기도 하지만, 실수가 생길 가능성도 높고 어느 과정이든 누락될 경우 큰 문제로 이어질 수 있음
⭐ ∴ 프로그램을 개발할 때는 환경 변수를 사용해서 프로그램이 작동할 환경의 용도를 구분
🩵 런타임 환경
런타임 환경 : 프로그램이 작동할 수 있도록 해 주는 소프트웨어
런타임 라이브러리 : 프로그램이 실제 환경에서 실행되기 위해 필요한 모듈들
🩵 SDK
SDK (Software Development Kit) : 특정 언어나 환경의 소프트웨어를 개발할 수 있도록 제공되는 키트
🩷 03-6 타임머신을 타고 형팽우주를 누비는 개발자
🩵 VCS
VCS (버전 관리 시스템, version control system) : 프로젝트의 변경 내역을 관리하는 시스템
- 소프트웨어를 개발할 때 일정 시점과 단위로 프로젝트를 관리
- 소스 코드 백업과 복구를 쉽게 도와주고 협업을 용이하게 도와줌
🩵 깃
깃 (Git) : 가장 널리 사용되는 VCS
- 커밋 : 프로젝트 작업 상태를 저장
- 푸시 : 각 작업을 본 프로젝트에 업로드
- 풀 : 다른 작업자들이 수정한 코드를 가져옴
- 프로젝트를 관리하고 협업
🤍 리셋과 리버트
리셋 (reset) : 그 이전으로 뒤로 감기
리버트 (revert) : 특정 버전만 거꾸로 돌려 감기
🤍 브랜치
브랜치 : 하나의 프로젝트 폴더 안에 여러 차원을 분기할 수 있음
머지 (merge) : 버전에서 작업한 내용들을 메인 차원으로 가져오는 것
🩵 깃 호스팅 서비스
깃 호스팅 서비스 : 깃으로 관리하는 프로젝트를 저장하는 공용 저장소를 제공하는 서비스