컴퓨터공학

 




1. 명칭
1.1. 공학?
2. 분류
2.1. 이론
2.2. 실용 코딩, 프로그래밍 실무
2.3. 전자공학, 시스템 아키텍처
2.6. 전산 언어학, 프로그래밍 언어
2.7. 시스템 프로그래밍, 운영체제
2.8. 소프트웨어공학, 개발방법론, 시스템공학
2.9. 멀티미디어 (컴퓨터그래픽, 영상, 게임, 사운드 등)
2.10. 통신공학, 네트워크
2.11. 보안공학
2.12. 전산/계산 암호학
3. 다른 학문과의 관계


1. 명칭


/ Computer Science(컴퓨터 과학)
대한민국에선 초중고 교육과정으로는 '''정보과학'''으로 그외에는 경우에 따라서 '''전산학'''으로 번역하여 '''전산학/전산과학'''으로 부르기도 한다. 참고로 다른 한자문화권 국가에서는 '컴퓨터과학'을 '정보학'으로 번역한다.

1.1. 공학?


'''범주'''
컴퓨팅
'''분야'''
컴퓨터과학[1]
컴퓨터공학
'''설명'''
수학과 가까움
소프트웨어 위주
전자공학과 가까움
하드웨어 위주
컴퓨터과학전자공학을 이어주는 분야
'''영문'''
Computer Science
Computer Engineering
'''번역명'''
전산학/전산과학
전산공학
'''한자'''
電算科學
電算工學
'''배우는 학과'''
('''한국'''기준)
컴퓨터과학과, 전산학과
일부학과를 제외한 대부분의 컴퓨터공학과
보통 전자공학과의 세부전공이다.
정보통신공학과컴퓨터공학을 메인으로 한다.
'''배우는 학과'''
('''미국'''기준)
컴퓨터과학과(Computer Science)
컴퓨터공학과(Computer Engineering)또는
전자공학과(Electronic Engineering)
한국에선 컴퓨터과학과 컴퓨터공학을 크게 구분하여 말하지 않는다. 하지만 북미•유럽권에서는 컴퓨터를 다루는 것을 의미하는 컴퓨팅(Computing)이라는 영역 안에 크게 컴퓨터과학(Computer Science)과 컴퓨터공학(Computer Engineering)이라는 갈래로 나뉘어 구분한다.
컴퓨터과학은 응용수학과 전산학이론을 중점적으로 다루는 분야에 가깝다. 반면 컴퓨터공학은 전자공학과 컴퓨터 하드웨어를 중점적으로 다루는 분야다. 통상 북미권에서는 전자공학과 컴퓨터공학을 합쳐 EECE로, 컴퓨터과학을 CS로 하여 많이 분류한다.
하지만 대한민국의 컴퓨터공학과에서 컴퓨터공학(Computer Engineering)보다는 실질적으로는 컴퓨터과학(Computer Science) 위주로 배우는 경우가 대부분이다.[2] 이는 기존의 컴퓨터과학과가 컴퓨터'''공(工)학'''과라고 이름을 바꿈으로써 공학계열 등록금을 받을 수 있기에(...) 2000년대 들어서 많이 변경했기 때문이다.[3] 이에 따라 소속 단과대학도 정보대학, 공과대학. 자연과학대학 등 학교별로 다르게 속해있다. 또한 이학사를 받는지 공학사를 받는지도 다르지만, 보통은 공학사를 받는다.

2. 분류


컴퓨터과학은 천문학이 망원경에 관한 학문이 아니듯, 기계에 관한 것이 아니다. 수학과 컴퓨터과학 사이에는 본질적인 통일성이 있다.

에츠허르 다익스트라

흔히 컴퓨터과학과를 프로그래밍을 배우는 학과라고 생각하지만, 그것은 마치 경영학과주판을 배우는 학과라거나, 의류의상학과바느질을 배우는 학과, 기계공학용접하는 곳이라고 생각하는 것과 같다. 컴퓨터과학과는 '''컴퓨터과학이라는 독립적인 학문을 배우는 학과'''라는 것을 명심하자. 컴퓨터를 물리적 기기로 보고 연구하는 학문이 아니라, Compute + r, 즉 계산기계라는 "개념"과, 그 구조에 대한 학문이다. 우리가 흔히 쓰는 데스크탑, 스마트폰 등은 그러한 개념들을 구체화한 일부일 뿐이다.
이를 일컫어 Hal Abelson은 컴퓨터과학(Computer Science)이라는 이름이 이 분야를 소개하기에 나쁜 이름이라고 한 바 있다. 이 학과를 컴퓨터과학(Computer science)이라고 부르는 것은 마치 물리학입자가속기학과, 생물학현미경학과로 부르는 셈. 그래서 전산(電算) 과학이라고 하는 것이 그래도 포괄적인 이 분야에 대한 설명으로 적합한 느낌이다.

2.1. 이론


이론전산학, 수리전산학, 응용수학 등의 명칭을 사용한다. 컴퓨터의 수학적 기반에 대해 다룬다. 컴퓨터과학은 다른 공학 분야보다 수학을 압도적으로 많이 사용한다. 컴퓨터를 다루는 언어와 기법이 모두 수학이기 때문이다.
  • 이산수학: 공대 학과 중 전산계열에서만 배우는 수학.
    • 알고리즘: 알고리즘의 시간 복잡도및 공간 복잡도를 주로 다룬다. 시간 복잡도의 경우 처리해야 하는 데이터가 많아질수록 필연적으로 알고리즘의 실행이 끝나는 속도가 느려지는데, 늘어나는 처리 데이터에 비례해서 얼마나 알고리즘의 실행 속도가 느려지느냐가 관건이다. 예를 들어, n 만큼의 데이터를 처리해야 할때 $$O(n^{2})$$ 복잡도를 가진다면, 처리해야 하는 데이터의 양에 제곱을 한 만큼 비례해서 알고리즘이 느려진다. 공간복잡도의 경우 처리해야하는 데이터에 비례해서 알고리즘이 얼마나 많은 양의 메모리를 필요로 하는가가 관건이다.
    • 오토마타 이론: 기초적인 automaton과 결정가능성, 그리고 튜링머신에 대해 배운다.
    • 정수론: 암호 분야에 사용 된다.
    • 집합론
    • 그래프 이론
    • 조합론
    • 이산 확률론
  • 기하학
    • 이산/계산 기하학 : 컴퓨터를 이용해서 물체를 어떻게 표현 할 할지 연구하는 분야이다. 컴퓨터 그래픽에서 대표적으로 많이 사용하고 최근에는 컴퓨터 비전, 기계학습, 인공지능 분야에서도 사용된다.
    • 이산 미분 기하학
  • 미분방정식 : 컴퓨터 그래픽스에서 물체의 움직임에서 사용하기도 하고, 계산 과학 분야에서도 사용한다.
  • 확률과 통계
위와 같이 수학 전반을 다루기 때문에 수학 전공자들의 복수전공에서 다른 공학 분야보다 용이하다. 실제로 이쪽은 교수부터 수학 전공자인 경우가 많다. 다만, 한국에서는 거의 죽은 분야에 가깝다. 한국의 경우, 교육열이 입시에 쏠려있어, 고교수학에 매우 강하며 실제 대학에서도 이런 경향이 이어져 고교 때 배우는 미적분을 많이 다루는 해석학과 같은 분야쪽에 쏠리는 경향이 강하다. 비표준 논리학은 수학에서 해석학과 거리가 가장 먼 분야로 볼 수 있으며, 덕분에 한국에서 이쪽 전공 교수 자체가 별로 없다. 다만 철학과까지 범위를 넓혀보면 그나마 숫자가 좀 늘어나긴 한다. 즉 철학과에도 수리 논리학은 물론이고, 비표준 논리학도 건드려본 논리학 전공 교수들이 있다. 참고로 논리학은 원래 철학의 한 분야지만, 국내 수학과 내에 논리학 전공 교수가 많지 않듯이, 국내 철학과에서도 논리학 전공 교수가 많진 않다. 당연히 컴퓨터 과학에서도 마찬가지. 국내는 이쪽 관련 인프라가 열악하므로 이쪽을 전공하고 싶다면 해외로 나가는 수밖에 없다. 하지만 최근 대학에서 이론 전산학을 연구하는 교수들이 조금씩 늘어가고 있다.[4]

2.2. 실용 코딩, 프로그래밍 실무


실무에서 쓰이는 테크닉들. Python, C, C++, Java가 가장 많이 사용되는데, 무엇을 먼저 가르칠지는 교수의 성향과 전공에 따라 달라진다. 전문대나 취업학원, 폴리텍의 경우 이런 과목이 특히 많다. 앞의 4대 주류 언어들은 대부분의 학교에서 1~2학년 과목으로 취급하고,[5] 2학년 이후 교육 과정에서 스크립트 언어[6][7], 함수형 언어[8], 논리형 언어[9] 등을 가르치는 것이 보통이다. 아예 일반적이지 않은 프로그래밍 언어 몇 개를 모아서 "고급 프로그래밍" 정도의 과목명으로 가르치는 강의를 개설하는 경우도 있다[10].

2.3. 전자공학, 시스템 아키텍처


논리회로CPU 구조, 마이크로프로세서, 컴퓨터 구조, 임베디드 등 컴퓨터가 어떻게 생겼고, 어떤 원리로 동작하는지 배운다.

2.4. 전산 통계학, 데이터 과학


자료구조, 파일구조, 데이터베이스, 데이터 마이닝 등 데이터의 효과적인 저장과 탐색, 처리법을 배운다. 학교에 따라서는 고급 통계학을 추가적으로 가르치는 곳도 있는데 대학원에 진학할 생각이 있다면 반드시 배워두자. 절대 손해 안 본다. 특히 인공지능[11]과 이것을 응용하는 분야(영상처리, 음성처리, 정보검색 등), 자연어처리, 네트워크 프로토콜 같은 분야를 염두에 두고 있다면 확률통계는 무조건 필수이므로 학부 때 미리 빠삭하게 해 놓으면 상당히 좋다. 이 분야는 해석학, 선형대수 등 기본적으로 수학 실력이 어느 정도 필요하고, 수학 실력이 부족하면 대학원을 안 가느니만 못한 사태가 발생할 수도 있다.

2.5. 계산 인지과학(인지컴퓨팅), 계산 신경과학


인공지능, 인공신경망, 기계학습을 다루는 분야.
학부 수준에서는 맛만 보는 수준 이상의 내용을 다루는 데는 한계가 있다. 그래도 Prolog나 자연어처리(NLP), 검색엔진(정보검색) 같은 것을 아주 약간이나마 접해볼 수 있다.

2.6. 전산 언어학, 프로그래밍 언어


언어학, 수학, 전산학의 학제적 연구 분야 이다. 기본적으로 놈 촘스키의 생성문법적 관점에서 의미론통사론을 배우는 것이며, 여기서 파생되는 다양한 프로그래밍/컴퓨터 언어, 대수학(정확히는 환론과 군론, 카테고리 이론), 컴파일러의 구현법 등을 추가로 배우게 된다. 컴파일러 작성을 통한 언어 구현을 중시하며 그에 관련된 이론은 맛보기로 배우는 경우도 있는가 하면, 아예 관련 이론만 빠삭하게 들이파는 경우도 있다. 만약 PL 교수가 학생들에게 '프로그래밍 언어 분야' 를 소개하고자 한다면, 보통 수업 시간에 증명을 상당히 많이 다루게 된다. 반면, 교수가 학생들에게 그냥 다양한 언어들의 특성을 가르치게 된다면, 그런 느낌은 별로 들지 않는다. 만약 후자면 프로그래밍 경험이 많으면 잘 따라갈 수 있지만, 그렇지 않고 증명 느낌으로 과목을 가르치게 되면, 수학적인 논리가 부족한 학생들은 죽을 맛이 된다...

2.7. 시스템 프로그래밍, 운영체제


운영체제의 개념과 *NIX, Windows API/MFC 프로그래밍 등 시스템에 종속적인 프로그래밍을 배운다. 얼핏 보면 난해한 수학이 없다고 방심하면 안 되는 게, 운영체계라는게 오만가지 부속과 모듈들이 오만가지 방법으로 얽혀있어서 디버깅이 매우 힘들며, 따라서 관련 코딩 작업에 생각보다 아주 많은 시간을 소비하게 된다. 운영체제의 경우 이론만 배우는 경우가 많으나 대한민국 공대 중에서 PintOS[12]를 직접 코딩해보는 학교로 서울대, 카이스트, 포스텍, 서강대 등이 존재한다. 한양대, 부산대, 홍익대에서도 원한다면 xv6와 GeekOS를 코딩 해 볼 수 있다. 숭실대에서도 PintOS를 코딩할 수 있는 과목이 있다. 오픈 소스 운영체제인 리눅스 커널 소스 코드를 직접 수정/컴파일/설치하여 돌려보는 학교도 있다.

2.8. 소프트웨어공학, 개발방법론, 시스템공학


요구공학, 분석, 설계, 구현, 테스트, 유지보수, 형상관리, 개발 방법론, 품질 관리, 재사용성 등 소프트웨어 개발에 있어서 체계적인 접근 방법에 대해 공부하게 된다.

2.9. 멀티미디어 (컴퓨터그래픽, 영상, 게임, 사운드 등)


MPEG, 영상 신호처리, 코덱, 미디어의 압축[13]과 전송, 음향 등 멀티미디어와 관련된 내용을 배운다. 게임 프로그래밍을 배우는 경우도 있다. 절대로 포토샵, MAYA 같은 툴 사용법을 배우는게 아니다! 의외로 빠삭한 양의 수학이 들어가기 때문에 얕잡아보면 후회하게 될 것이다.
DirectX, CUDA, OpenGL 등을 주로 사용한다. 숙제의 일환으로 간단한 게임을 만들게 될 수도 있다- 그 유명한 "머릿글자 B - 관악최속전설"도 그래픽 과목 숙제로부터 기원한다. 어느 정도의 미적분 실력과 선형대수학 실력만 있어도 수업에서 배우는 내용을 따라하고 숙제를 풀어내는 데에는 별 문제가 없겠지만, 보다 근본적으로 이해하려면 '''기하광학'''과 '''미분기하학'''에 대한 지식이 필요하다.

2.10. 통신공학, 네트워크


네트워크와 통신, 클라우드 컴퓨팅 등이 있다. OSI 계층에 따른 분류를 기준으로 각각의 구조를 배우기도 하며 네트워크 통신 프로그래밍을 지칭하는 경우도 있으며 그 두개의 짬뽕을 의미하기도 하는 역시 잘 하는 사람은 잘 하고 못 하는 사람은 희망이 없는 과목으로 보는 경우가 많은 분야.[14]

2.11. 보안공학


정보보안, 인터넷 보안, 네트워크 보안, 사이버안보 등의 이름으로 개설된다. 지금까지 배웠던 것들을 모두 싸그리 뭉쳐서 응용하는 성격이 강하며, 여기에 더해 사회공학적 기법도 대략적으로 가르치는 경우도 있다.

2.12. 전산/계산 암호학


정수론을 선행해야 한다. 수학과 언어학을 바탕으로 컴퓨터로 새로운 문법과 의미구조를 만들어야 한다. 이런 학문은 보통 다국적 IT기업, 군사기관, 경찰기관, 정보기관의 투자를 받아서 연구되는데, 대부분 일부 선진국에서만 제대로 연구되고, 국내에서 제대로 다루는 학교는 매우 적다.

3. 다른 학문과의 관계


공학과 과학에 모두 발을 걸친데다 생긴지 얼마 안된 학문이니만큼, 역사가 길지는 않다. 당장 전자, 기계, 화공을 가르치는 교수들은 각각 전공이 그쪽 분야인 데 비해, 컴퓨터공학을 가르치는 교수들 중에서 고령자들은 전자공학이나 수학과 출신인 경우도 많다. 애초에 컴퓨터공학이 세계적으로도 '''전자공학과 수학과의 접점'''에서 시작했기 때문이다.

3.1. 전기공학 / 전자공학


컴퓨터는 두가지로 구성되있다. 물리적하드웨어와 하드웨어설계등의 바탕이된 계산이론등을 다루는 컴퓨터과학으로 구성되있다. 하드웨어의 경우 물리학자들과 전기전자공학자들이 발전시켰고, 컴퓨터과학이론(오토마타,컴파일러...)등의 경우 수학자들과 컴퓨터과학자들이 발전시켰다. 현대에도 전자공학, 통신공학 등의 전자기학 기반 학문들과 연관성이 교류가 이루어지고 있다.

3.2. 수학 / 통계학 / 논리학 / 암호학


한편 컴퓨터과학은 수학자, 통계학자, 논리학자, 암호학자들에 의해 발전되었다. 먼저 수학자 앨런 튜링과 그 동료들에 의해 데이터 처리의 토대가 완성되었으며, 수리언어학 등을 기반으로 컴퓨터를 통제하기 위한 기초 문법들이 만들어졌다. 또 현대 통계학과 컴퓨터과학은 데이터과학이란 이름으로 학제간 연구가 이루어지고 있다.

[1] 일반적으로 한국에서 부르는 컴퓨터공학과이다.[2] 물론 시립대 전전컴 처럼 정말 Computer Engineering에 초점이 맞춰진 학과도 있다. 실제로 컴퓨터과학은 아예 별도의 학과로 편성되어 있다.[3] 보통 대학교에서는 등록금이 문과 < 이과 < 공과 < 예체능 < 의과 순이다.[4] 연세대학교 컴퓨터과학과의 한요섭, 안형찬 교수, 카이스트의 마틴 지글러, 정지원 교수 등이 있다.[5] 서강대학교 처럼 오직 C만 집중적으로 깊게 가르치고 나머진 수박 겉핥기식으로 배우는 학교도 있다[6] JavaScript, PHP[7] 몇몇 학교는 반대로 이해하기 편한 스크립트 언어를 1학년 때 배우기도 한다.[8] LISP, Haskell[9] Prolog[10] 보통 학교에 프로그래밍 언어를 연구하는 교수가 있으면 이런 과목들이 개설된다.[11] 현재 인공지능은 통계적 기법이 대세다. 룰이나 논리 기반 추론은 이미 연구될 만큼 연구되었고 더 이상 주목할 만한 학문적 성과가 나오고 있지 않기 때문이다.[12] 90년대에는 UC 버클리에서 만든 Nachos를 많이 사용했다. PintOS는 2004년에 스탠퍼드에서 Nachos를 개량하여 대체한 실험용 운영체제이다.[13] JPEG라든지 [14] 그래도 이쪽 분야로의 진로를 계획하는 사람이 있다면 독학으로라도 공부해 두도록. 현업에 나가면 이쪽의 지식을 써먹을 분야가 많다. 소켓 프로그래밍을 할 필요가 없는 웹 개발자라 하더라도 이쪽 지식을 알고있는 사람과 모르는 사람간의 격차가 크다. 특히 규모가 작은 회사에서는 개발자가 서버 및 네트워크 환경까지 구축하는 경우가 흔한데 이 경우 네트워크에 대한 배경지식이 없으면 상당히 고생할 수 있다. 시간이 정말 없거나 하기가 싫어도 최소한 TCP와 HTTP프로토콜 정도는 공부는 해 두는게 좋다.