E,AHRSS

컴퓨터공학

last modified: 2016-09-16 11:46:53 Contributors

Computer Science(컴퓨터 과학/전산학[1])/Computer Engineering(컴퓨터 공학)
이 둘을 묶어 Computer Science and Engineering, CSE로 불리기도 한다. 혹은 후자만 떼어서 Computer System Engineering 이라고 하기도 한다.

당신이 사용하는 안드로이드, iOS를 포함한 수 많은 앱과 프로그램들이 컴퓨터공학의 산물이다!

Contents

1. 개요
2. 연구하는 것
3. 다른 공학과의 관계
3.1. 전기/전자공학

1. 개요

저수준에서는 컴퓨터의 구조와 운영체제의 원리부터 높게 올라가면 계산 모델과 프로그래밍 언어, 어떤 것을 계산하는 방법인 알고리즘까지, 컴퓨터 시스템의 근간을 이루는 계산(computation)과 추상화(abstraction)의 원리와 응용에 대해 배우는 학문.

또 이걸 컴퓨터공학과 컴퓨터과학으로 쪼개기도 하는데 엄밀히 따지면 컴퓨터공학은 컴퓨터의 하드웨어 구조를 다루며 전기/전자공학과 가깝고, 컴퓨터과학은 컴퓨터 기초 이론을 주로 다루며 수학과 가깝다. 실제로 역사를 보면 컴퓨터과학은 수학의 직계 후손이며, 수학 분야에서 우수한 학교가 암호학 또는 컴퓨터 과학 분야에서도 두각을 나타내는 것이 보통이다. 가장 대표적인 예를 들자면 바로 그 유명한 하버드 대학교. 공학 순위의 최상위권에서는 찾아보기도 힘든 학교지만 순수과학인 수학 분야에서 우수하다는 점에 버프를 받아 컴퓨터 과학 분야 순위만큼은 최상위권으로 평가된다. 독일이나 프랑스 등지에서는 Information+Mathematics 를 합쳐 각각 Informatique, Informatik 이라는 이름을 사용한다. 외국에서는 컴퓨터과학과 컴퓨터 공학을 서로 구분하기도 한다.#

사람들 시선에선 컴퓨터공학을 전공하면 프로그래머라고 인식하지만, 컴퓨터공학 전공자들 입장에서 프로그래머/코더는 그냥 프로그래밍을 좀 배운 사람이라 인식하고, 컴퓨터 공학을 좀 깊이 전공해서 일하는 사람은 "Computer/Software Engineer" 라고 칭한다. 물론 주위 시선에선 전자공학을 용접하는 사람으로 보듯이 걍 코딩덕후든, 아마추어든, 전문대학에서 프로그램을 배운 프로그래머든, 컴퓨터 공학자든 뭉뚱그려 프로그래머로 보일 뿐... 안습

사실, 분야가 매우 넓기때문에 실제 수학과 차이를 찾아보기 힘든 순수학문에 가까운 분야도 큰 비중을 차지하고 있고(대표적으로 계산이론), 그것들을 실전에서 응용하는쪽에 집중하는 공학에 가까운 분야도 비중이 높기때문에(운영체제, 데이터베이스, 소프트웨어 공학 등) 컴퓨터 과학 내의 분야별로 과학/공학을 나누는게 오히려 적절하다.

2. 연구하는 것

흔히 프로그래밍을 배우는 학문이라고 생각하지만, 그것은 마치 경제학이 펀드매니저들 하는 학문이라거나, 법학과사법시험 합격 요령을 배우는 곳이라고 생각하는 것과 같다. 컴퓨터공학과는 컴퓨터 공학이라는 독립적인 학문을 배우는 학과라는 것을 명심하자. 컴퓨터 과학은 단순히 컴퓨터라는 기기에 대한 학문으로 한정되지 않는다. 컴퓨터 과학에서 컴퓨터란 천문학에서 망원경 이상의 것이 아니다.

이를 일컫어 Hal Abelson은 컴퓨터 과학(Computer science)이라는 이름이 이 분야를 소개하기에 나쁜 이름이라고 한 바 있다. 컴퓨터 과학은 사실 과학이 아니며 [2] 컴퓨터랑 그렇게 많이 관련 있는 것도 아니라나(..). 마치 물리학자가속기에 대한 학문도 아니고 생물학현미경과 페트리 접시(..)에 대한 학문이 아닌 것과 마찬가지인 셈.

실제 프로그래밍을 배우는 과목은 몇 개 안 되고, 대부분은 도대체 이걸 배워서 어디에 써먹을까 싶은 수학적, 이론적인 과목 혹은 진짜 수학 과목들이다. 코딩을 위한 테크닉 같은 건 알아서 배워야 한다. 그러므로 혹시 이쪽으로 뜻이 있는 학생이 있다면 입학 후 과내 스터디 동아리 활동을 적극 추천한다.

배우는 과목을 크게 나눠보면(구체적인 과목명은 학교마다 다르고 학교의 학풍과 교수들의 전공분야에 따라 중시하는 과목이 다르다.)
  • 코딩 계열 : C, C++[3], Java프로그래밍 언어의 문법과 프로그램 제작법을 배운다. 실용적, 취업지향적인 학풍이 강할수록 이쪽 과목의 비중이 크다. 대부분의 학교에서 C, C++, Java 정도는 1학년 과목으로 취급하며, 2학년 이후 과정에서 LISP, Haskell등 함수형 언어를 가르치는 과목을 개설하거나, 아예 이러한 일반적이지 않은 프로그래밍 언어 몇 개를 모아서 "고급 프로그래밍" 정도의 과목명으로 가르치는 강의를 개설하는 경우도 있다[4].

  • 아키텍처 계열 : 리회로CPU 구조, 이크로프로세서, 컴퓨터 구조, 베디드 등 컴퓨터가 어떻게 생겼고, 어떤 원리로 동작하는지 배운다. 이 경우에도 H/W는 일절 만지지 않는 경우가 많다. 번외편으로는 디지털 로직[5] 정도가 있다. 학교에 따라서 8051이나 AVR, PIC 또는 DE2 보드 정도를 가지고 "논리회로 실습" 정도의 제목으로 실제 하드웨어를 구현하는 입문 과정이 개설된 경우도 있다.

  • 전산수학 계열 : 여기서도 공학과 과학이 갈린다. 공학쪽에 가까운 분야들은 프로그램에서 '사용가능한' 알고리듬을 목적으로, 공대생이라면 반드시 들어야 하는 미분과 적분, 선형대수 등을 시작으로 이산수학, 알고리즘, 수치해석 등을 주로 배우며 응용을 하게되면 OpenGL등을 사용하는 그래픽 과목으로 진화하는 경우가 많고, 암호학[6]으로 가는 경우도 많다. 과학쪽에 가까운 분야들에서는 알고리즘 시스템 자체를 수학적 대상으로 삼아 연구하는 경우가 많다. 이런경우에는 논리학, 토마타, 산이론, 명이론 등을 배우는데, 이것들은 일반적으로 상상하는 수학과는 크게 다르기때문에 어느정도 현대수학의 경험이 뒷받침되어야 따라갈 수 있는 경우가 많고, 덕분에 일반적인 컴공생보다 수학전공자들이 많이 보인다. 실제로 이쪽은 교수부터 수학전공자 출신인 경우가 많다.[7] 학교에 따라서는 확률통계를 가르치는 곳도 있는데 대학원에 진학할 생각이 있다면 반드시 배워두자. 절대 손해 안본다. 특히 인공지능[8]과 이것을 응용하는 분야(영상처리, 음성처리, 정보검색 등), 자연어처리, 네트워크 프로토콜 같은 분야를 염두에 두고 있다면 확률통계는 무조건 필수이므로 학부 때 미리 빠삭하게 해 놓으면 대박 좋다[9].

  • 데이터 처리 : 자료구조, 파일구조, 데이터베이스, 데이터마이닝 등 데이터의 효과적인 저장과 탐색, 처리법을 배운다.

  • 인공지능: 인공지능이나 기계학습을 다루기는 하는데, 학부 수준에서는 맛만 보는 수준 이상의 내용을 다루는 데는 한계가 있다. 그래도 Prolog나 자연어처리 같은 것을 맛만 보는 단계지만 접해볼 수 있다.

  • 프로그래밍 언어 계열 : 프로그래밍 언어들의 특징과 역사, 언어구조론[10], 형식언어, 컴파일러의 구조 등을 배운다.

  • 시스템 프로그래밍 : 운영체제의 개념과 UNIX, MFC(API) 프로그래밍 등 시스템에 종속적인 프로그래밍을 배운다. 운영체제의 경우 이론만 배우는 경우가 많으나 대한민국 공대중에서 PintOS를 직접 코딩하라는 학교로는 서울대, 카이스트, 포스텍, GIST, 한양대, 서강대, 성균관대, 숭실대, 금오공대 정도가 있다. 홍익대에서도 원한다면 GeekOS따위를 코딩 해 볼 수 있다.그리고 스스로를 원망하겠지

  • 개발 방법론 : 소프트웨어 공학 등 시스템 설계와 개발방법에 대해서 배운다. 프로그램의 설계 방법과 프로젝트 중 시간관리, 인력관리, 자원관리법 등 오히려 경영학에 가깝다. 문과적 소양이 없는 순수 컴덕이 만나게 되는 난관 중 하나. 실제 개발에 사용되는 방법[11]을 개념적으로 배우며 실습 역시 병행한다. 교수의 기대치와 학생의 능력의 괴리감이 아마도 가장 큰 과목이다[12].

  • 멀티미디어 : MPEG, 영상 신호처리, , 컴퓨터 그래픽 처리, 미디어의 압축과 전송 등 멀티미디어와 관련된 내용을 배운다. 절대로 포토샵, MAYA 같은 툴 사용법을 배우는게 아니다! 다만, 학교에 따라선 DirectX, Cuda, OpenGL등을 사용하는 코딩을 위주로 하는 경우[13]도 있으니 듣기전에 확인이 절대적으로 필요하다. 쉽게 생각하다가 피보기 좋은 분야.

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

  • 그 밖에 여러 가지를 몽땅 다룰 수 밖에 없는 정보보안 같은 과목이 개설된 학교도 있다.

3. 다른 공학과의 관계

막상 보면 다른 공학과 비교해서 차이점이 큰데, 공학인데도 Computer Engineering이기도 하면서 Computer Science라고도 불리는 이유이다. 과학을 응용하는 다른 공학보다도 수학을 응용하는 데 중점을 두고, 다른 공학과는 달리 프로그램 등의 S/W 공학을 배우게 된다. 흔히 사람들이 인식하는 프로그래머PC용 프로그램을 만드는 일이라면 컴퓨터 공학은 넓은 의미의 컴퓨터에 대해서의 소프트웨어를 설계하고 만드는 학문이다. 더 간단히 말하자면 로봇을 예로 들자면, 전자공학이 로봇을 만든다면 컴퓨터공학은 로봇을 움직이게 하는 역할이다.

물리를 직접적으로 응용하는 기계공학, 기공학과 화학을 직접 응용 화학공학 같은 과학을 응용하는 다른 공학과 달리, 물리/화학과 같은선상에서 수학을 직접적으로 이용한다는 점이 다른 공학과의 차이점이라 공학이기도 하고 과학이기도 한 조금은 애매할 수 있는 학문이다. 그러나 컴퓨터 공학을 깊게 전공하면서 물리적 지식이 쓸모없는 것도 전혀 아니며, 어쨌든 수학을 응용해서 시스템/소프트웨어를 설계하는 공학이므로, 가끔 컴퓨터 과학이라고 불리긴 해도 공학으로 취급된다. 게다가 예전부터 전해져내려오던 수공업 기술이 과학적으로 체계화된 분야와는 다르게, 이건 수학에서 시작해 수학을 위해 개발된 수학의 직계 응용과목이다!

3.1. 전기/전자공학

단, 컴퓨터 구조나 제조 한정으로 전자공학과는 아주 밀접하고도 가까운 관계. 배우는 것에 차이는 있지만 서로가 뗄 수 없는 관계로 성장해왔고, 컴퓨터는 전자공학의 최첨단 이론이었던 반도체를 활용해서 만들어진 기계다. 당장 현재 세상을 주도하고 있다고 할 수 있는 전자기기가 노트북, 스마트폰 등 컴퓨터 계열이다.

그래서 전자/컴퓨터를 둘다 전공하거나 부전공을 하는 사람이 많다. 아예 과가 묶여있는 학교도 많고 건물을 같이 쓰는 경우도 많다. 심지어는 전자전기컴퓨터공학(Electrical Engineering and Computer Science, EECS) 형태로 과가 개설되는 경우도 흔하다.그리고 커리큘럼은 답이 없을 정도로 복잡해진다.

그래서 실제로 복전이나 부전공을 하는 사람은 드물다. 전자공학에서 컴퓨터공학으로 오는것은 쉬울지라도 컴퓨터공학에서 전자공학으로 넘어가는 것이 어려운 것이 주된 이유이다. 그노무 수학 그리고 서로 사용하는 수학도 다르기도 하고. 공학이란거 자체가 1개만 공부하기에도 상당히 벅차다. 그래도 2가지 다 공부해보고 싶다면 해봐라. 경험상 지옥이 안 펼쳐질수는 없는데, 성공만 한다면 당신은 수퍼 울트라 공돌이가 될 수 있다. 하지만 몇몇 low-level 분야의 경우 컴퓨터공학과 전자공학 두 학문을 모두 알고있다면 (세부전공에 한해서라도) 상당한 메리트가 될 수 있다. 생각이 있으면 도전해보는게 경험상 나쁘지는 않다. 참고로 서울 시내 소재 C모 대학에서는 부전공이 졸업요건이 아닌지라 컴공 → 전전 부전공을 하면 아름다운 대학 생활을 보낼 수 있다.
----
  • [1] KAIST는 여전히 전산학과로 부른다.
  • [2] 자연 현상을 관측하고 원리를 밝히는 것이 아니기 때문.
  • [3] 상당히 많이 사용되는 언어이기는 하지만 '프로그래밍 언어 공부'라는 목적에 있어서 C나 C++은 그리 좋지 못한 선택이는 비판도 있다. 하지만 학생 시절 가장 먼저, 그리고 가장 빨리 접하게 되는 언어.
  • [4] 보통 학교에 프로그래밍 언어를 연구하는 교수가 있으면 이런 과목들이 개설된다.
  • [5] DE2보드 정도는 직접 다루는 경우가 많다
  • [6] 정말로 학부시절 수준에서는 이 이상의 전산수학은 없다라는 소리가 나올지도 모른다
  • [7] 다만, 한국에서는 거의 죽은 분야에 가깝다. 한국의 경우, 교육열이 입시에 쏠려있어, 고교수학에 매우 강하며 실제 대학에서도 이런 경향이 이어져 고교때 배우는 미적분을 많이 다루는 해석학과 같은 분야쪽에 쏠리는 경향이 강하다. 컴퓨터 과학에서 사용되는 수리논리학 분야들은 수학에서 저 해석학과 거리가 가장 먼 분야로 볼 수 있으며, 덕분에 한국에서 이쪽 전공 교수 자체가 별로 없다. 당연히 컴퓨터 과학에서도 마찬가지. 국내는 이쪽 관련 인프라가 열악하므로 이쪽을 전공하고싶다면 해외로 나가는수밖에 없다.
  • [8] 현재 인공지능은 통계적 기법이 대세다. 룰이나 논리 기반 추론은 이미 연구될 만큼 연구되었고 더 이상 주목할만한 학문적 성과가 나오고 있지 않기 때문이다.
  • [9] 이런 쪽을 생각하고 있다면 확률통계는 물론이고 해석학, 선형대수 등 기본적으로 수학실력이 어느 정도 받쳐줘야 한다. 안그러면 대학원을 안가느니 못한 사태가 발생할 수도 있다.
  • [10] 특정 언어를 사용하는 법이 아니라 언어와 문법이 어떤 식으로 구조화되어 있는지를 배우며 이를 이용하여 컴퓨터 언어를 만드는 법에 대한 기초 이론이다. 상당히 수학적인 과목이면서도 언어학적인 과목. 컴파일러 과목의 기초이며 이 과목을 배우면 노엄 촘스키의 위대함을 깨달을 수 있다.
  • [11] 즉, Agile Process운용 기법, ITBM, IS구축 기법, IT Integration 등을 배운다
  • [12] 실제 이쪽 담당의 교수 밑에서 학생들을 가르친 조교의 증언에 의하면, 일단 학생들의 전반적인 코딩 능력이 바닥을 기는데다 오로지 정답만을 찾도록 12년동안 훈련된 학생들을 상대로 정답이 없는 분야의 내용을 가르치려니 글자그대로 애로사항이 꽃핀다고.
  • [13] 이경우엔 3D 렌더링에 대한 기본지식도 있어야 한다!!
  • [14] 그래도 이쪽 분야로의 진로를 계획하는 사람이 있다면 독학으로라도 공부해 두도록. 현업에 나가면 이쪽의 지식을 써먹을 분야가 많다. 소켓 프로그래밍을 할 필요가 없는 웹 개발자라 하더라도 이쪽 지식을 알고있는 사람과 모르는 사람간의 격차가 크다.