포스텍 POSTECH의 MOOC (https://pabi.smartlearn.io/) 청년 AI, BigData 아카데미 온라인 기초과정 중
컴퓨터공학 입문 1을 수강하고 정리한 내용입니다.
1. 문제 해결 problem solving
목차
- 문제해결
- 컴퓨터공학 사고력
- 컴퓨터 공학적 문제 해결 방법
< 문제해결 >
문제가 있을때 그 문제를 우리는 어떻게 해결해야할지 고민하게 된다.
그래서 문제가 있을때 문제를 분석하고 그 순서에 따라서 절차를 만들게 된다. 그 절차에 따라서 문제가 해결이 되면 해결 방법을 출력하게 된다.
그런 내용을 문제해결 방법과 절차라하며, 문제해결과정에 있어서 문제가 입력되면 이 문제를 해결할 수 있는 해결방법과 절차를 알고리즘(Algorithm)이라 한다. 그 후에 해결 방법을 만들게 된다.
what is Computational Thinking?
CT는 읽기, 쓰기, 셈하기와 더불어 누구나 갖춰야하는 기본 역량
CT는 컴퓨터과학의 이론, 기술, 도구를 활용하여 현실의 복잡한 문제를 해결하는 사고 방식이다. 의학, 법, 경제, 정치, 예술 등 사회 모든 분야에서 보편적으로 필요한 핵심 능력이다. (Jeannette M. Wing)
=> CT라 하는 이 사고력은 꼭 컴퓨터과학에서만 이용되는 것이 아니라 모든 분야에서 다 사용될 수 있으므로 우리는 이 컴퓨터과학에서 하는 이론과 기술을 활용해야 한다는 것.
(이 수업에서 정의하는) 컴퓨터공학 사고력
주어진 문제를 분석, 이해하고 문제의 해결 방법을 컴퓨터 공학의 원리를 적용하여 알고리즘을 도출하고 컴퓨터가 이해하는 프로그래밍 언어로 제시하는 사고능력
=> 우리가 문제 해결방법을 위해 일상생활에서 사용되는 것은 일반적으로 컴퓨터를 사용하지 않고도 활용할 수 있는 부분들이 많다. 이 수업에서는 컴퓨터공학의 원리를 적용해서 프로그래밍 언어로 제시할 수 있는 능력을 향상시키기 위해 C프로그래밍 언어를 활용할 예정이다.
일반적으로 우리는 문제가 있으면 이 문제를 이해하고 분석하는 단계는 일반 문제 해결과정과 컴퓨터 공학적 문제해결과정과 동일하다.
그런데, 이 문제를 이해하고 분석한 다음에 일반적 이해과정에서는 문제 해결방안을 탐색한 후 해결방법을 만들게 되고 그후에 실행 후 평가한다.
그렇다면 컴퓨터공학적 문제해결과정은 어떤 차이가 있을까?
컴퓨터공학적 문제해결과정에서는 컴퓨터공학원리를 적용한다는 부분과 그것을 알고리즘 설계와 프로그래밍 언어로 구현한다는 부분이 다르게 된다. 그리고 결과를 검토하게 된다.
컴퓨터공학적 문제 해결과정
- 컴퓨터공학적 문제해결
- 컴퓨터공학의 원리 적용
컴퓨터 공학적 문제 해결과정(정리)
- 문제 이해 및 분석
- 이 문제를 컴퓨터 공학적 원리 적용
- 문제 해결 방법의 설계(이를 알고리즘 설계라 한다)
- 문제 해결 방법의 프로그래밍(알고리즘 구현, 코딩)
- 결과 검토
문제 해결 방법의 설계(알고리즘 설계)
분할정복(divide and conquer) 알고리즘
- 가장 많이 쓰이는 알고리즘 중 하나
- 어떤 문제를 해결하는 알고리즘에서 원래 문제를 성질이 똑같은 여러개의 부분 문제로 나누어 해결하여 원래의 문 의 해를 구하는 방식
- 보통 프로그래밍 언어에서 이 알고리즘을 이용해서 다양한 문제를 해결하고 있다.
의사 코드(pseudo code 수도 코드)와 순서도(flow chart)를 이용하여 코딩하기 전에 설계도를 만들게 된다.
의사코드는 일반적인 언어(영어, 한국어 등)로 코드를 흉내 내어 알고리즘을 써놓은 코드. 하지만 의사코드는 그대로 코드에 집어넣을 수는 없다. 하지만 프로그래밍으로 문제해결과정에서는 의사코드로 순서를 정해서 표현할 수 있는 능력이 중요하다. 그리고 이 의사코드를 잘 만들었다면 이 순서대로 순서도를 만들 수도 있다.
순서도는 여러 종류의 상자와 화살표를 이용해 명령의 순서(알고리즘)를 보여주는 도형이다.
이 설계도가 완성이 되면 쉽게 코드화가 가능하다.
요약
- 문제해결 방법으로 컴퓨터공학 사고력을 말했다
- 일반적 문제 해결방법과 컴퓨터 공학적 문제해결방법의 차이를 말했다
- 컴퓨터공학적 문제 해결방법을 살펴보았다
- 거기서 많이 사용되는 분할정복 알고리즘을 보았다
- 의사코드, 순서도를 보았다
2. 컴퓨터와 자료 표현
목차
1) 컴퓨터와 프로그램
2) 하드웨어의 정의와 소프트웨어
3) 컴퓨터와 자료 표현
4) 문자코드
1) 컴퓨터와 프로그램
- 컴퓨터
- 전자적으로 계산을 수행하는 장치
- 프로그램
- 컴퓨터가 수행할 작업을 지시하는 명령어(컴퓨터가 이해할 수 있는 프로그래밍 명령어)들의 집합
2) 하드웨어와 소프트웨어의 정의
- 하드웨어
- 정의 : 컴퓨터를 구성하는 물리적인 장치(device)
- CPU, RAM, 입력장치, 출력장치와 같은 컴퓨터를 구성하는 장치들을 의미함
- 소프트웨어
- 정의 : 컴퓨터가 수행할 작업을 지시하는 명령어들의 집합(문서작업을 포함.. 프로그램 소스코드만 말하는 것이 아니라 그것에 의해 만들어진 것들도 포함)응용 소프트웨어(어플리케이션, 앱, 워드프로세서, 게임.. 필요해 의해 만들어진 것들을 말함)
- 시스템 소프트웨어(운영체제 - 컴퓨터 하드웨어와 소프트웨어 사이에서 전반적으로 운영해주는 소프트웨어, 컴파일러 - 프로그래밍언어로 작성된 언어를 기계어로 번역해줌)
- 응용 소프트웨어(어플리케이션, 앱, 워드프로세서, 게임.. 필요해 의해 만들어진 것들을 말함)
- 정의 : 컴퓨터가 수행할 작업을 지시하는 명령어들의 집합(문서작업을 포함.. 프로그램 소스코드만 말하는 것이 아니라 그것에 의해 만들어진 것들도 포함)응용 소프트웨어(어플리케이션, 앱, 워드프로세서, 게임.. 필요해 의해 만들어진 것들을 말함)
3) 컴퓨터와 자료 표현
- 컴퓨터는 어떻게 자료를 표현할까? 컴퓨터가 정보를 표현하기 위한 기본 원리는 '전기신호'이다.
전기 신호가 있고(1) 없고(0)의 두 가지 경우이다. 그래서 컴퓨터는 이진수라는 체계로 정보를 관리한다.- 자료 표현 원리
- 2진수(binary) 체계를 사용
- 전기 신호 : ON(1), OFF(0)
- 자료 표현 원리
- 그렇다면 이 2진수로 작성된 정보 비트라는 이름으로 부른다. 그런데 이 하나의 비트는 0, 1만 표현할 수 있기에 우리는 문자와 같이 사람이 인지하기 편한 것을 표현하기 위해서는 비트가 너무 작다. 그래서 바이트라는 단위를 또 사용하게 된다.
- 비트(bit) : Binary Digit, 0또는 1의 두 개 정보를 표현하는 정보의 최소 단위
- 바이트(byte) : 연속된 8개의 비트(256개), 문자를 표현하는 단위
4) 문자코드 "컴퓨터와 사람의 의사소통"
- 문자 코드란? : N비트의 조합에 일정한 문자를 할당하여 지정한 것
- 비트나 바이트만 가지고 컴퓨터와 사람이 의사소통을 하기는 힘들다. 그래서 문자코드를 이용한다.
- 국제 표준 문자 코드 : 아스키코드, 유니코드
- 아스키 코드 ASCII(American Standard Code for Information Interchange)
- 미국에서 시작한 국제적인 표준으로 사용하는 문자 코드 체계로서 7비트를 사용하여 128개의 문자, 숫자, 특수문자 코드를 규정.
- 우리 사람은 A B C D나 숫자가 편하다. 하지만 컴퓨터는 전기 신호 ON, OFF와 같은 두 개의 신호만을 가지기에 Binary라는 이진수 체계가 편하다. 사람은 10진수 8진수 2진수 모두 사용 가능하지만 2진수는 사람들이 직접 계산하여 쓰기에는 불편하다.
- 컴퓨터는 bit라는 단위를 쓰는데 두 개의 비트로 쓸 수 있는 것은 00, 01, 10, 11과 같이 4개가 있다.
- 사람이 표현할 수 있는 문자를 이렇게 문자코드로 만든다고 하면 영어를 기반으로 알파벳 대문자, 소문자, 숫자, 그리고 특수 기호를 고려해서 약 7개의 비트인 128개정도로 만들 수 있지 않을까 생각했다고 한다. 그래서 만들어진 것이 아스키코드이다.
- 우리가 A를 입력하면 7개의 비트로 1000001이 할당된 이 코드가 인식이 되며 이것은 십진수로 65에 해당한다. B, C, D가 10진수로 1씩 늘어나는 그러한 코드 체계로 저장이 되어 있다.
- 0부터 시작해서 쭉 내려갈때 127개가 된다. 십진수로 128개를 이루며, 대문자 A를 2진수로 표현하면 1000001에 해당하는 코드가 부여된다. 그래서 십진수로는 65. A부터 대문자 Z까지 십진수를 기준으로 1씩 늘어나는 값들을 가지고 있음을 볼 수 있다.
- 특수기호인 느낌표, 따옴표의 경우 순서가 있는 문자들은 아니다. 그러나 알파벳은 일반적으로 순서를 부여하고 있다. 이를 잘 찾기위해서도 그렇다. 그래서 아스키 문자표를 부여할때 1씩 늘어나는 일률적인 번호를 부여했다고 볼 수 있다.
- 소문자 a는 십진수로 97에 해당하며 이도 1씩 늘어나는 형태로 구성된다.
- 이 아스키코드는 우리가 컴퓨터공학적으로 문제를 해결하는데에 있어서 문자, 숫자처리를 자주하기 때문이다. 그런데 이 문자도 컴퓨터는 숫자로 저장이 되어있다는 것이다. 숫자로 처리가 가능하다. 그래서 이 문자를 숫자화하여 계산할 땐 컴퓨터에서 가능해진다.
요약
- 컴퓨터와 사람의 상호작용을 하기 위해 어떠한 정보, 자료들을 저장하고 문자코드로 만들어서 표현하는지 살펴보았다.
- bit : 정보표현 가장 작은 단위
- 1 byte : 8bit(256) / 문자 표현 단위
- ASCII(7bit), UNICODE(16bit)
3. 프로그래밍 언어 종류
목차
1) 프로그래밍 언어
2) C, C++, Java, Python
3) 컴파일러
1) 프로그래밍 언어
프로그래밍 언어의 필요성
- 사람과 컴퓨터가 의사소통을 하기 위해 만든 언어
- 컴퓨터는 0과 1밖에 모르는 기계어만 사용하니까. 그래서 문자를 사용하는 사람과 의사소통을 하기 위해서는 중간에 통역을 할 수 있는 그런 공통언어(프로그래밍언어)가 필요한 것.
- 사람이 컴퓨터에게 지시할 명령어를 기술하기 위해 만들어진 언어
프로그래밍 언어의 종류
- 저급언어(low-level language) : 기계어, 어셈블리어
- 컴퓨터가 사용하는 기계어..바이너리로 되어있는 것 기계어라고 한다.
- 이 기계어와 매칭하여 기계어 위에서 기호, 신호처럼 기호화해서 만들어진 언어를 어셈블리어라고 한다. 이는 사람이 처리하기 어려운 것이 있는 저급언어에 속한다.
- 고급언어(hight-level language) : C, C++, Java, Python
- 사람의 용어, 즉 영어와 같이 보기 편한 형태로 되어있는 프로그래밍언어를 말한다.
- 컴파일러 : C, C++처럼 고급언어로 작성된 것을 기계어로 번역하는 프로그램을 말함. 비쥬얼C++와 같은 번역을 해주는 프로그램을 컴파일러이라 함.
- 어셈블러 : 어셈블리어로 작성된 프로그램을 기계어로 번역해주는 것. 어셈블리어도 기계어와 가깝지만 마찬가지로 번역과정을 거쳐야 기계어로 바뀌게 된다.
출처 : 포스텍 mooc
2) C C++ Python
운영체제와 프로그래밍 언어의 개요
유닉스라는 운영체제의 특징은 멀티유저(여러 사람)를 지원한다는 것. 이 유닉스가 C언어 전에 만들어졌었는데 좀더 발전된 유닉스를 만들기 위해 C를 개발했다고 알려져 있다.
그리고 MS에서 DOS라는 텍스트 기반의 운영체제가 만들어졌다.
그리고 83년도에 C를 기반으로 하여 객체지향개념을 넣은 C++이 개발됐다.
그리고 매킨도시 애플이 84년도에 개발된다. 맥은 DOS에서는 텍스트 기반에서 까만 화면에 명령어를 입력하는 환경이었는데 애플은 그래픽 유저 인터페이스를 지원하는 환경이었다고 한다.
그 이후 그래피컬 유저인터페이스를 지원하는 윈도우가 생기며 91년도에 리눅스라는 운영체제가 만들어졌다.
유닉스는 서버역할을 하면서 멀티유저를 지원하는 특징을 가지며 비싸고 다루기 어렵다.
반면 리눅스는 개인용 피시에서도 서버역할을 하면서 멀티유저를 지원할 수 있는 운영체제가 있으면 좋겠다는 생각에서 개발을 했다.
그리고 그쯤에 파이썬이 만들어졌다.
95년에 네트워크와 인터넷이 계속 개발되면서 발전되는 시기이다.
자바는 분산환경에서 프로그래밍이 용이하도록 객체지향어로 개발되게 된다.
그 이후 모바일환경에서 안드로이드, ios라 하는 것들이 발전하면서 지금 우리가 살고 있는 컴퓨팅세상에 많은 기여를 하고 있다.
그리고 스크래치, 앱 인벤터, 엔드리라는 것들이 나왔다.
C(1972) : 데니스 리치(Dennis Ritchie)
유닉스(UNIX) 운영체제 작성을 위해 시스템 프로그래밍 언어로 설계된 언어
이 C언어는 운영체제를 만들기 위해 만들어진 언어라서 하드웨어와 모든 문법적인 내용들을 가지고 있다.
컴파일러나 수많은 소프트웨어 도구(Tool)들도 C언어로 개발
풍부한 연산자와 데이터 형(data type)을 갖고 있기 때문에 범용 프로그래밍 언어로서 널리 보급되었으며, 응용 소프트웨어의 개발에 널리 이용
C++(1983)
C++은 객체지향프로그래밍(OOP Object-Oriented-Programming)을 지원하기 위해 C언어가 가지는 장점을 그대로 계승하면서 객체의 상속성(Inheritance) 등의 개념을 추가한 효과적인 언어
Java(1992)
자바(JAVA)의 시초는 1992년 미국의 SUN사에서 가전 제품들을 제어하기 위한 언어에서부터 비롯됨
이는 C++과 달리 객체 C를 기반으로 하는 것이 아니라 객체지향개념을 강화하여 객체지향프로그래밍 언어라며 강조하여 만들어진 언어이다.
분산 네트워크상에서의 프로그래밍이 용이.
python(1991)
Guido van Rossum에 의해 발표
인공지능의 발전과 함께 많이 확산되었다.
플랫폼 독립적
인터프리터 언어. 컴파일러는 프로그램의 소스코드를 처음부터 끝까지 다 한번에 기계어로 바꾸는 방식을 말하는 반면, 인터프리터는 한줄 한줄씩 읽어서 기계어로 번역하는 특징을 가진다.
동적 타이핑 언어. 앞의 C, C++는 타입을 정해서 변수를 선언하는 과정이 필요했던 반면, 파이썬은 변수에 집어넣는 값에 따라서 타입을 동적으로 정해서 저장해준다.
AI 프로그래밍을 위한 많은 라이브러리 제공.
하지만 이 파이썬은 C언어로 개발되었다. C는 모든 언어의 기초에 있다고 함.
프로그래밍 언어가 필요한 이유
사람과 컴퓨터가 상호작용 하기 위해 중간에 프로그래밍 랭귀지가 필요하다.
"Hello world!"
파이썬은 간결하다. 이는 C, C++에 있는 프린트문을 출력하기 위한 소스코드들이 이미 파이썬 안에 내장되어있기 때문이다.
그런 원리이기 때문에 우리가 무엇을 사용하든 원리를 알고 편한 것을 사용하는 것은 좋지만 그냥 편한 것을 보다가 원리를 뒤집어서 내가 스스로 뭔가를 만들고자 할때는 그 부분을 잘 알기 힘들 수 있다.
스크래치
프로그래밍 교육용 언어
블럭을 갖다 붙이는 형태로 코딩이 가능하다.
엔트리
국내에서 개발한 SW 교육용 프로그래밍 언어
스크래치와는 다르다. 국내의 소프트웨어 교육 프로그램을 위해 좀더 자세하고 재미있는 콘텐츠를 재공하고 있다.
요약
프로그래밍 언어의 특징과 종류
C, C++, Java, Python의 특징을 연도별로 살펴봄
스크래치, 엔트리처럼 쉽게 접근 가능한 웹상의 프로그래밍 플랫폼 소개
4. 프로그래밍 개발 환경
목차
1) 프로그래밍 개요(프로그래밍이란?)
2) 프로그램 개발 도구
3) 프로그램 개발 과정
1) 프로그래밍 개요
컴퓨터 프로그램
- 프로그램이란?
- 컴퓨터에게 어떤 일의 수행을 지시하는 프로그래밍 언어로 된 명령어들의 집합(실행 파일, hello.exe)
- 여기서 실행파일은 파일 이름 뒤에 exe 확장자가 붙어서 이를 클릭하면 바로 실행가능한 것을 의미함
- 프로그램 개발에 필요한 도구
- 에디터(editor) : 소스코드, 명령어들을 직접 적어내려가는 곳
- 컴파일러(compiler)
- 링커(linker)
- 디버거(debugger)
에디터
소스코드를 작성할 수 있는 문서 편집기
소스 코드 : 프로그래밍 언어로 작성된 명령어들
소스 파일 : 프로그래밍 언어의 명령어들로 작성된 파일.
따라서 .c로 저장된 파일을 소스파일이라 얘기하고, 그 안의 코드들을 소스코드라고 얘기한다.
실행파일 생성 및 실행 과정
소스파일은 컴파일러에 의해 목적파일로 먼저 작성된다.
1) 인간은 hello.c라 저장하지만
2) 컴파일러에 의해 hello.obj란 파일이 자동으로 생성되는데 이는 기계어로 번역을 해주는 역할을 한다.
3) 그렇게 목적파일 .obj로 만들어준 후 링커라는 도구에 의해서 .obj이란 여러개의 파일들이 (복잡한 프로그램은 여러개의 파일로 만들어진다) 하나로 묶여 하나의 .exe파일로 만들어진다.
.c로 작성된 파일이 .obj를 거쳐 실행가능한 .exe파일로 만들어진다.
4) 그 다음, 메모리를 거쳐 로더의 역할에 의해 로딩이 되어 hello world! 라고 실행이 된다.
프로그램 개발에 필요한 도구
1. 컴파일러 : 에디터로 작성된 소스코드를 기계어로 번역해주는 프로그램(Turbo C, GNU C(gcc)) 다양한 운영체제에서 C 컴파일러 사용 가능 범용 프로그램
2. 링커 : 번역된 여러 목적코드를 하나로 묶어주는 역할 (목적(Object)코드 : 번역된 명령어(기계어))
3. 디버거 : 프로그램 오류를 수정하는 도구. 우리가 프로그램을 만들고 나면 오류가 발생할 수 있다. 긴 프로그램의 경우 줄단위로 실행해서 결과를 확인하는 것이 필요하다. 명령을 줄 단위로 실행하고 결과 확인 가능하다.
통합 개발환경
DevC++ (무료)
통합개발환경 : 개발환경이 너무 복잡해지는 것을 방지하고자 통합개발환경이 필요하다. 프로그램에 필요한 도구를 모두 하나의 프로그램에서 제공하는 것.
웹 기반 컴파일러(online compiler)
복잡한 프로그램의 작성에는 어려움이 있지만 간단한 테스트정도는 가능하다.
요약
- 프로그래밍 언어를 실행하기 위해서는 컴파일러라는 개발도구가 필요하다.
- 우리는 프로그래밍 언어인 c언어의 문법을 배워 소스코드를 작성한 후 컴파일을 하면 컴파일러에 의해 목적파일인 .obj파일이 만들어지고 그 다음 실행파일인 exe가 만들어져서 메모리를 통해 실행 결과를 볼 수 있다.