컴퓨터 공학, 컴퓨터 과학, 전산학 등등으로 불리는 과에선 무엇을 배울까?(이후 컴공으로 줄임)
저기 전문대 무슨 소프트웨어 뭐시기과 이런 데서 배우는 안드로이드앱, 웹디자인 이런 과목 말고
학문적으로 어떤 과목을 배우는지 알아보자.
일단 컴공에서도 기초 미적분학, 일반물리, 미분방정식, 선형대수 같은 기본적인 공학 과목들은 듣는다.
여기선 컴퓨터 과학/공학에 관해서만 다룸.
1. 기초 프로그래밍
주로 C언어, C++, 자바 등 프로그래밍 언어의 사용법, 즉 코딩에 대해 배워.
위에 코드는 아마 본 적 있는 사람도 많을 거야. C언어로 "Hello world!"라는 문자열을 출력하는 간단한 프로그램이야.
C언어를 개발한 벨 연구소의 튜토리얼 매뉴얼에서 처음 언급된 이후 관습적으로 많은 프로그래밍 언어 서적에서 처음 예제로 나오고 있어.
자료형(data type), 변수(variable), 입출력 방법, 함수(function), 조건문, 반복문(loop), 배열, 포인터, 클래스(class) 등에 대해 배워.
학원에서도 한두달이면 배울 수 있고 C언어 책 사서 혼자 공부할 수도 있으니 취미삼아 배워보면 재밌을거야.
이 과목을 수강하고 나면 간단한 별찍기 프로그램, 숫자 입력을 받고 간단한 계산을 해서 출력을 하는 콘솔 프로그램 등을 직접 만들 수 있을 거야.
여기까지는 허접하지만 직접 프로그래밍한 결과물도 나오고 재밌을 지도 모르겠지만... 사실 이건 요리학원에서 칼질 배우는 수준이라 할 수 있어.
2. 자료 구조(Data Structure)
배열(Array), 큐(Queue), 스택(Stack), 트리(Tree), 그래프(Graph) 등 여러가지 자료구조에 대해 배워.
아마 프로그래밍 언어로 직접 구현하는 과제도 나올 거야.
자료구조가 왜 중요하냐면 이쪽 분야에서 효율성(efficiency)이 굉장히 중요해서 프로그래밍을 할 때 적합한 자료구조를 선택해야 하거든.
예를 들어 정보들을 입력받는 순서대로 단순배열 시키면 나중에 검색할 때 배열의 처음부터 끝까지 일일히 확인해봐야되.
운이 좋아서 3, 4번 째에 찾고자 하는 정보가 있으면 모르겠지만, 최악의 경우 배열의 제일 끝까지 모든 자료를 일일히 확인해야 할 지도 몰라.
그러나 계층구조를 갖는 자료구조를 이용해 정보를 입력받을 때 계층별로 정렬한다면 검색할 때 해당 계층만 검색하면 되겠지?
3. 알고리즘(Algorithm)
알고리즘 하면 순서도를 떠올리는 사람도 있을 거야. 알고리즘이란, "어떠한 문제를 해결하기 위한 방법"이라고 할 수 있어 .
아까 말했듯이 이쪽 분야에선 효율성이 굉장히 중요해. 그래서 똑같은 일을 수행하는 프로세스라도 더 효율적이게 만들려고 끊임없이 연구하고 있어.
"복잡도"라는 것을 이용해서 알고리즘의 효율성을 따지는데, 복잡도가 뭔냐면...
원래는 수학적으로 정의되어 있고 별로 어려운 내용은 아니지만 초단간하게 직관적으로 예를 들어줄게.
n개의 요소를 갖는 배열이 있어. 여기서 무언가를 검색하려면 최대 n번까지 배열을 순서대로 확인해야겠지?
이런 경우 이 배열에 대한 검색 알고리즘의 복잡도는 O(n)이야.
그럼 nxn 행렬에서 검색할 때는? 일단 1행의 1번부터 n번까지 확인하고, 그 다음 2행의 1번부터 n번까지 확인하고...
이런 식으로 n행의 1번부터 n번까지 확인하면 최대 nxn번 확인해야겠지?
그럼 이 행렬에 대한 검색 알고리즘의 복잡도는 O(nxn), 즉 O(n^2)이야. O(n) 이런 식으로 쓰는 걸 Big-O notation이라고 함.
[2, 4, 1, 9, 6, 3] 이런 배열을 오름차순으로 정렬하는 알고리즘만 해도 단순한 알고리즘은 O(n^2)의 복잡도를 갖는 반면,좀 더 고급 알고리즘은 O(nlogn)의 복잡도를 가져. n^2이랑 nlogn이랑 별 차이 없다고 느낄 지도 모르는데, n의 값이 커질 수록 그 차이는 기하급수적으로 커져. 정렬 알고리즘에 대해 더 알고싶은 사람은 위키백과에 Sorting algorithm 검색 ㄱㄱ.
또 한 가지 흥미로운 주제가 있어. 행렬 곱셈의 시간복잡도는 얼마나 될까? n곱하기n 행렬이라고 가정했을 때. 아마 행렬곱셈을 할 줄 아는 사람이라면 직관적으로 O(n^3)이라는 걸 알거야. 오랫동안 사람들은 행렬곱셈의 시간복잡도에서 n의 지수를 3 밑으로 줄이는 것이 불가능하다고 생각했어. 근데 Strassen이라는 사람이 n의 지수를 3 보다 작게, 약 2.8정도로 줄일 수 있는 알고리즘을 개발했어! 마찬가지로 n^3이랑 n^2.8이랑 별 차이 없다고 생각할지도 모르겠지만, n의 값이 커질 수록 그 차이는 커져. n이 1000만 되도 4배의 속도차이가 나는데 이 말이 뭐냐면 기존 행렬곱셈방식을 사용하면 4일동안 컴퓨터가 계산해야 할 일을, Strassen algorithm을 통해 하루만에 완료할 수 있다는 거야.
이외에도 자료구조에서 배운 자료구조들의 복잡도를 분석한다던지, dynamic programming, greedy algorithm, amortized analysis 등 알고리즘을 디자인하거나 분석하는 방법에 대해서도 배워.
4. 컴퓨터 구조(Computer Architecture)
컴퓨터 구조 혹은 컴퓨터 조직론(Computer Organization) 등으로 불리는 과목이야. 주로 배우는 내용은 마이크로프로세서가 인식할 수 있는 명령어 집합(Instruction Set Architecture, ISA), ISA를 처리하는 프로세서 구현(microarchitecture 혹은 computer organization이라고 불림), memory hierarchy 등에 대해서 배워. 폰 노이만 구조라고 들어본 적 있을 거야. 산술논리장치(Arithmetic Logic Unit, ALU)와 control unit으로 구성된 중앙처리장치(CPU), memory, 인풋/아웃풋 디바이스 등으로 이루어진 구조고, 현대의 주류를 이루는 컴퓨터는 대부분 이 폰 노이만 구조를 기반으로 하고 있어.
여기서 배우는 ISA 역시 폰 노이만 구조를 기반으로 하고 있어. 예를 들어 메모리에 있는 데이터를 CPU의 레지스터로 load하는 명령어, CPU의 두 레지스터에 저장된 값을 더해 새로운 레지스터에 저장하는 add 명령어, 레지스터에 저장된 값을 메모리로 strore하는 명령어 등등.
그리고 ISA를 처리하는 processor가 어떻게 생겨먹었는지도 배워. Pipeline을 이용해 한번에 여러 명령어를 stage별로 동시에 처리하는 방법 등등... 복잡하니 자세한 설명은 줄일게. 이론만 배우냐? 많은 학교에서 실제 processor를 구현해보는 과제를 내주고 있어. 실리콘칩으로 진짜 만드는 건 아니고 Verilog같은 하드웨어 기술 언어를 이용해 pipeline과 ALU등을 코드로 구현해야.(ARM같은 반도체 회사도 하드웨어 기술 언어로 설계한 코드를 삼성같은 반도체 제조 회사에 판매한다! 갤럭시에 들어간 엑시노스도 ARM에서 설계 코드 라이센스를 구매한 후 삼성에서 실리콘칩으로 제조한 거임.)
5. 운영체제(Operating System)
컴공의 꽃이라고 할 수 있는 과목이야. 운영체제 사용법이 아닌 운영체제를 어떻게 구현하는지를 배워.
배우는 내용은 크게 1. 프로세스 관리, 2. 메모리 관리, 3. File-system으로 나눌 수 있어.
컴공 과목답게 이론에서 끝나지 않고 실제 구현하는 프로젝트도 있는데,
프린스턴 대학교에서 학부생 교육 목적으로 개발한 Pintos Project가 널리 쓰이고 있어.
해외 대학들 뿐만 아니라 우리나라도 서울대, 카이스트, 포스텍 등 컴퓨터 공학을 제대로 가르치는 대학에선 많이들 사용하고 있어.
디테일하게 설명하면 복잡해지니 간단하게 설명하자면, 이쪽 분야가 그렇듯
"어떻게 하면 컴퓨터 시스템을 최대한 효율적이고 안전하고 사용하기 쉽게 만들까"라는 것이 이 과목의 목표야.
프로세스를 예로 들어보자. 프로세스는 현재 실행되고 있는 컴퓨터 프로그램이야. 프로그램과 프로세스의 차이가 뭐냐면, 바탕화면에 크롬 "프로그램"이 있지? 이걸 더블클릭해서 실행하면 하드디스크에 있던 크롬 프로그램을 메모리로 복사해서 "프로세스"가 시작되는 거야. 크롬 프로그램을 또 실행하면? 프로세스가 하나 더 실행되는 거지. 프로그램=실행코드, 프로세스=실행중인 task. ㅇㅋ? 아무튼, 초기 컴퓨터는 한 번에 한 개의 프로세스밖에 실행하지 못했어. 계산기를 실행하고 끝날 때까지 기다렸다가 문서작성 프로그램을 실행하고, 문서작성을 다 끝내고 나서야 다른 일을 할 수 있고... 이런 식이었지.
그런데 스케줄링 기법을 적용해서 심지어 하나의 CPU 코어만을 가지고도 multi-processing을 할 수 있게 된 거야. 스케줄링 기법이란 예를 들어, 프로세스가 어느 정도 일을 했다고 판단하면(물론 OS가 판단함) 현재 프로세스는 ready queue에 집어넣고, 그 프로세스가 사용하던 CPU를 다른 프로세스가 차지하고... 이런 식으로 마치 여러 프로세스가 동시에 일을 하는 것 처럼 만드는 거야. OS 과목의 디테일에 대해 더 설명하면 매우 복잡해지니 설명은 여기서 줄이도록 함.