03-1 컴퓨터는 어떻게 일하나요?
CPU
- 중앙처리장치 (Central Process Unit)
- 컴퓨터에서 이뤄지는 모든 일을 관할. 컴퓨터의 뇌.
코어, 스레드, 클럭
- 코어
- CPU 중에서 가장 핵심이 되는 부품
- 예전에는 하나의 코어를 가지고 코어의 속도를 높여가는 방식으로 발전했으나 발열 등 물리적 문제가 발생. 여러개의 코어를 탑재하는 방식을 택함
- 스레드 (로봇의 분신술)
- 클럭
메모리
- 기억 장치
- 주 기억 장치 (메인 메모리)
- 보조 기억 장치
- 하드디스크(C 드라이브 같은거), 플래시 메모리, USB 메모리, CD롬, 플로피 디스크
- 기억 장치 속도: 캐시, 메인 메모리, 보조 기억 장치 순
- 휘발성 메모리와 비휘발성 메모리 (전기가 끊겼을 때 날아가면 휘발성)
- 휘발성 메모리
- 비휘발성 메모리
- 실행 속도와 용량이 낮아 메인 메모리로 사용되지 않는다.
- 컴퓨터와 외부를 연결해주는 소통의 통로
- 입력장치: 키보드, 마우스, 터치패드, 펜 태블릿, 웹캠, 스캐너, 마이크...
- 출력장치: 모니터, 사운드 카드, 스피커, 프린터...
- 입출력 둘 다 하는 장치: 터치스크린, 스캐너 기능을 갖춘 프린터...
- 다른 기기와 정보를 주고받는 장치: 네트워크 카드, 모뎀...
프로세스, 스레드
- 프로세스: 프로그램이 메인 메모리로 올라와 실행되고 있는 상태
- 크롬 브라우저는 여러 탭을 열었을 때 각 탭에 프로세스가 하나씩 부여된다.
- 여러 프로세스를 함께 처리하는 방법
- 병렬 처리 방법: 여러 작업을 동시에 실행
- 각 프로세스가 같은 순간에 실행되도록 하는 방법
- 병행 처리 방법: 하나의 코어가 여러 프로세스를 돌아가면서 조금씩 처리
- 작업을 조금씩 나누어 실행하면서 컴퓨터가 마치 여러 작업을 동시에 실행하는 것처럼 보이게 하는 처리방법
- 컨텍스트 스위칭: 진행 순서를 바꾸는 것
- 멀티 프로세싱: 여러개의 프로세스를 함께 진행하는 것 (병렬로 병행해서~)
- 스레드
- 한 프로세스 안에 하나 이상 진행될 수 있는 일의 단위
- 한 개의 버거를 요리하는 작업이 하나의 프로세스라면 빵을 데우는 작업, 패티를 굽는 작업, 야채를 써는 작업은 스레드
- 멀티 스레딩: 여러 스레드가 함께 실행되는 것
- 프로세스와 스레드의 차이
- '메인 메모리를 어떻게 함께 사용하는가'
- 멀티 프로세싱: 각각의 프로세스는 자기 영역을 명시. 동시에 진행되는 프로세스가 많아지면 메인 메모리는 그 배수만큼 필요
- 멀티 스레드: 서로의 공간을 구분하지 않는다. 스레드가 많아져도 메모리를 추가로 차지하지 않는다. 컨텍스트 스위칭에 드는 부담도 덜하다.
- 같은 메모리 공간을 여러 스레드가 사용하기 때문에 그 과정에서 발생할 수 있는 오류에 대비해서 프로그래밍 해야 함!
03-2 바이트는 뭐고 자료형은 왜 쓰나요?
비트와 바이트
- 비트(bit)
- 2진 숫자(binary digit)의 약자. 0 또는 1
- 컴퓨터가 다루는 데이터의 최소 단위
- 바이너리 파일: 이진(바이너리) 숫자 형식으로 작성된 파일
- png, jpg, mp3, 동영상 파일, 각종 프로그램 실행 파일 등
- 16비트, 32비트: 몇 자리의 이진수로 표현할 것인가
- 불리언, 불(boolean, bool): true, false 중 하나의 값만 가지는 자료형
- 컴퓨터에서 데이터를 주고받을 때 데이터의 종류마다 몇 비트를 사용해서 표현할지 약속한다.
- 바이트
- 비트가 8개 모인 것. 1byte = 8bit(2의 8제곱, 0~255)
자료형
- 자료형을 명시하는 이유: 어디서부터 몇 비트를 읽어야하는지 알려줘야하기 때문
- 자료형마다 비트가 할당되어 있다
- 정수 자료형 중 byte: 8비트, short: 16비트, int: 32비트 등
문자 인코딩, 유니코드
- 컴퓨터는 0과 1 이진 숫자로 이루어져 있다.
- A, B, C와 같은 문자를 표현하기 위해서는 숫자로 표기하는 약속이 필요
- 문자열 셋: 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 숫자로 만든 것
- 문자 인코딩: 문자열 셋을 통해 사람이 입력하는 문자를 그에 해당하는 숫자로 변환하는 것
- 아스키 코드 (ASCII code): 0~127까지의 7비트 공간 안에 대문자와 소문자 알파벳, 스페이스와 탭, 각종 부호 값을 지정한 것.
- 한국어를 표시하기 위한 문자열 셋 및 인코딩 방식: EUC-KR, UTF-8
- 서로 다른 문자 인코딩을 사용하는 경우 글자가 깨져버린다~
- 유니코드(Unicode)
- 전 세계의 모든 문자를 포함할 수 있는 거대한 문자열 셋
03-3 프로그래밍 언어 분류
컴파일 언어, 인터프리터 언어
- 컴파일 언어: 배포되기 전 다른 형태로 변환되는 언어
- 실행, 배포할 때마다 컴파일 과정을 거친다
- 프로그램에 따라 컴파일에 많은 시간 소모
- 실행 중인 프로그램에 업데이트할 내용이 생기면 코드를 수정한 다음 전체를 다시 빌드
- 컴파일 과정에서 오류를 미리 발견해 배포 후의 문제를 어느 정도 방지
- 빌드 과정이 번거롭지만 한 번 배포된 후에는 빠르게 실행됨
- 자료형 고정 (정적 타입)
- 인터프리터 언어: 작성된 그대로 실행되는 언어
- 프로그래밍과 배포, 오류 수정이 수월
- 프로그램 실행 속도는 컴파일 언어에 비해 느림
- 프로그래밍 과정에서 오류가 잘 발견되지 않음
- 런타임 시 자료형 부여. 변수의 자료형이 바뀔 수 있음 (동적 타입)
- 컴파일: 코드를 실행하기 전에 기계어나 다른 코드로 먼저 번역하는 것
- 컴파일러: 소스 코드를 다른 언어나 형태로 번역해주는 프로그램
- 런타임
- 런타임: 프로그램이 배포된 다음 실행되는 시점
- 런타임 오류: 프로그램 실행 중에 오류가 생기는 경우
절차지향, 객체지향 프로그래밍
- 절차지향 프로그래밍
- 소스 코드를 위에서부터 차례대로(순차적으로) 실행. 소스 코드의 순서 중요. 프로그램 전체가 유기적으로 연결
- 실행 속도가 빠르다
- 단점
- 사소한 문제 하나만 생겨도 시스템 전체가 돌아가지 않는다
- 소스 코드의 순서가 바뀌면 결과가 달라진다
- 객체지향 프로그래밍
- 코드를 작성할 때 구성 요소를 객체라는 단위로 묶어서 이들의 조합으로 프로그램을 만든다
- 프로그램을 다수의 객체로 만들고 객체끼리 상호작용하는 방법
- 하나의 객체가 고장이 나더라도 해당 객체만 수리하거나 교체하면 간단히 해결 가능
- 유지보수가 쉽고, 생산성이 좋음
- 단점
- 설계에 많은 시간이 걸림
- 처리 속도가 느림
- 난이도가 높음
- 클래스
- 객체 지향 프로그래밍에서 각 종류의 객체가 어떤 정보를 가지고 있고, 어떤 기능을 수행할지 스펙을 정의한다.
- 클래스: 객체의 스펙을 정의하는 명세서
- 상속
- 기본 속성을 물려받는 것.
- 다른 특성은 물려받은 속성 위에 각 버튼만의 기능을 추가한다
- 중복을 줄일 수 있음
함수형 프로그래밍
- 변수 사용을 최소화함으로써 스파게티 코드의 오류를 줄이는 프로그래밍
- 프로그래밍 언어가 제공하는 기능들을 사용해서 어떤 '상태 값(변수)'을 두지 않고 기능을 설계
- 멀티 스레딩이 많이 이루어지는 환경에서 함수형 프로그래밍은 특히 유용
매니지드 언어, 언매니지드 언어
- 매니지드 언어: 메모리를 프로그래밍 언어가 직접 관리
- C, C++, 어셈블리어 등을 제외한 대부분의 언어
- 언매니지드 언어: 메모리를 개발자가 직접 관리
- C언어
- 메모리 공간을 원하는대로 조작하여 매니지드 언어로 작성한 것보다 빠르고, 효율적으로 작동하는 프로그램을 만들 수 있다.
- 메모리 관리: 메인 메모리를 관리하는 것
확인 문제
- 다음 중 틀린 것은?
3번
- 알맞은 단어를 찾아 쓰시오
보기) 스레드, 상속
- 함수형 프로그래밍을 사용하면
스레드
가 많이 사용되는 환경에서 변수 문제로부터 안전한 코드를 작성할 수 있다.
- 객체지향 프로그래밍에서는
상속
을 사용해서, 기본이 되는 부모 클래스로부터 추가 속성이나 기능이 있는 자식 클래스를 파생할 수 있다.
- 프로그래밍 언어와 연관이 깊은 개념
1) 자바 - JVM
2) C언어 - 포인터
3) 스칼라 - 함수형 프로그래밍
4) 자바스크립트 - 인터프리터 언어
- 다음중 A, B, C, D에 알맞은 언어를 보기에서 찾아 쓰시오.
보기) 자바, 자바스크립트, C언어, C++
언매니지드 언어: C언어, C++
객체지향 언어: C++, 자바, 자바스크립트
인터프리터 언어: 자바스크립트