컴퓨터공학

최근 수정 시각:

파일:나무위키+상위문서.png   상위 문서: 형식과학, 공학 관련 정보

파일:나무위키+하위문서.png   하위 문서: 컴퓨터 관련 정보


1. 정의2. 연구하는 것3. 컴퓨터공학과4. 다른 공학과의 관계

1. 정의[편집]



Computer Science(컴퓨터과학/전산학[1])
Computer Engineering(컴퓨터공학)

이 둘을 묶어 Computer Science and Engineering, CSE로 불리기도 한다. 혹은 후자만 떼어서 Computer System Engineering 이라고 하기도 한다.

컴퓨터의 소프트웨어를 학문적으로 연구하고 응용하는 것을 목표로 하는 학문이다. 컴퓨터의 하드웨어는 일반적으로 전자공학에서 다룬다.

미국에서는 흔히 컴퓨터과학이라고 부른다.

2. 연구하는 것[편집]

흔히 프로그래밍을 배우는 학문이라고 생각하지만, 그것은 마치 경제학이 펀드매니저들 하는 학문이라거나, 법학과사법시험 합격 요령을 배우는 곳이라고 생각하는 것과 같다. 컴퓨터공학과는 컴퓨터 공학이라는 독립적인 학문을 배우는 학과라는 것을 명심하자. 컴퓨터를 물리적 기기로 보고 연구하는 학문이 아니라, Compute + r 라는 "개념"과, 그 구조에 대한 학문이다. 우리가 흔히 쓰는 데스크탑, 스마트 폰 등은 그러한 개념들을 구체화한 일부일 뿐이다.

이를 일컫어 Hal Abelson은 컴퓨터 과학(Computer science)이라는 이름이 이 분야를 소개하기에 나쁜 이름이라고 한 바 있다. 이 학과를 컴퓨터 과학(Computer science)이라고 부르는 것은 마치 물리학입자가속기학과, 생물학현미경학과나 페트리 접시학과로 부르는 셈.그럼 뭐라고 불러

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

배우는 과목을 크게 나눠보면(구체적인 과목명은 학교마다 다르고 학교의 학풍과 교수들의 전공분야에 따라 중시하는 과목이 다르다.)

  • 코딩 계열 : Python, C, C++[2], Java프로그래밍 언어의 문법과 프로그램 제작법을 배운다. 실용적, 취업지향적인 학풍이 강할수록 이쪽 과목의 비중이 크다. 앞의 4대 주류 언어들은 대부분의 학교에서 1~2학년 과목으로 취급하고,[3] 2학년 이후 교육 과정에서 스크립트 언어[4][5], 함수형 언어[6], 논리형 언어[7] 등을 가르치는 것이 보통이다. 아예 일반적이지 않은 프로그래밍 언어 몇 개를 모아서 "고급 프로그래밍" 정도의 과목명으로 가르치는 강의를 개설하는 경우도 있다[8].

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

  • 이론전산학 계열: 저학년때는 수리논리학을 배우는데, 수리논리학을 이용한 수학적 표기법은 분야를 가리지 않고 등장한다- 시스템 계열도 예외는 아니다. 고학년으로 올라가면 알고리즘의 시간 복잡도 [10] 및 공간 복잡도 [11] 에 대한 개념 및 이에 대한 증명을 다루며, 복잡도 이론도 P, NP, NP-완전에 대한 개념들에 대해 겉핥기식으로 배울 수 있다.

    더 깊이있게 공부하면 복잡도 이론, 계산기하학, 비표준 논리학, 오토마타, 계산이론, 증명이론, 정수계획법 등도 배울 수 있는데, 이것들은 일반적으로 상상하는 수학과는 크게 다르기 때문에 어느 정도 현대수학의 경험이 뒷받침되어야 따라갈 수 있는 경우가 많고, 덕분에 일반적인 컴공생보다 수학 전공자들이 많이 보인다. 실제로 이쪽은 교수부터 수학전공자 출신인 경우가 많다. 다만, 한국에서는 거의 죽은 분야에 가깝다. 한국의 경우, 교육열이 입시에 쏠려있어, 고교수학에 매우 강하며 실제 대학에서도 이런 경향이 이어져 고교 때 배우는 미적분을 많이 다루는 해석학과 같은 분야쪽에 쏠리는 경향이 강하다. 비표준 논리학은 수학에서 해석학과 거리가 가장 먼 분야로 볼 수 있으며, 덕분에 한국에서 이쪽 전공 교수 자체가 별로 없다. 다만 철학과까지 범위를 넓혀보면 그나마 숫자가 좀 늘어나긴 한다. 즉 철학과에도 수리논리학은 물론이고, 비표준 논리학도 건드려본 논리학 전공 교수들이 있다. 참고로 논리학은 원래 철학의 한 분야지만, 국내 수학과 내에 논리학 전공 교수가 많지 않듯이, 국내 철학과에서도 논리학 전공교수가 많진 않다. 당연히 컴퓨터 과학에서도 마찬가지. 국내는 이쪽 관련 인프라가 열악하므로 이쪽을 전공하고 싶다면 해외로 나가는 수밖에 없다.

  • 수학 계열: 웬만한 공대생들과 물리학과 학도들이 다 듣는 미적분학, 선형대수학, 수치해석 등은 필수로 들어가며, 기계학습, 컴퓨터 그래픽, 멀티미디어, 컴퓨터 비전, 로보틱스 등에 주로 쓰인다. 이산수학도 물론 배운다. 해석학을 강제로 들어야 하는 경우도 있다 [12]. 암호학을 배울 경우, 정수론을 듣게 되기도 한다. 보다 이론에 치중한 프로그래밍 언어 계열 연구의 경우 카테고리 이론이라는 물건이 등장하는데, 이건 환론과 군론을 위시한 대수학을 섭렵해야 한다.

    학교에 따라서는 확률통계를 가르치는 곳도 있는데 대학원에 진학할 생각이 있다면 반드시 배워두자. 절대 손해 안본다. 특히 인공지능[13] 과 이것을 응용하는 분야(영상처리, 음성처리, 정보검색 등), 자연어처리, 네트워크 프로토콜 같은 분야를 염두에 두고 있다면 확률통계는 무조건 필수이므로 학부 때 미리 빠삭하게 해 놓으면 상당히 좋다. 이런 쪽을 생각하고 있다면 확률통계는 물론이고 해석학, 선형대수 등 기본적으로 수학실력이 어느 정도 받쳐주지 않으면 대학원을 안 가느니만 못한 사태가 발생할 수도 있다.

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

  • 프로그래밍 언어 및 컴파일러 계열 : 프로그래밍 언어들의 특징과 역사, 언어구조론[14], 형식언어, 컴파일러의 구조 등을 배운다. 컴파일러 작성을 통한 언어 구현을 중시하며 그에 관련된 이론은 맛보기로 배우는 경우도 있는가 하면, 아예 관련 이론만 빠삭하게 들이파는 경우도 있다. 만약 PL 교수가 학생들에게 '프로그래밍 언어 분야' 를 소개하고자 한다면, 보통 수업 시간에 증명을 상당히 많이 다루게 된다. 반면, 교수가 학생들에게 그냥 다양한 언어들의 특성을 가르치게 된다면, 그런 느낌은 별로 들지 않는다. 만약 후자면 프로그래밍 경험이 많으면 잘 따라갈 수 있지만, 그렇지 않고 증명 느낌으로 과목을 가르치게 되면, 수학적인 논리가 부족한 학생들은 죽을 맛이 된다...

  • 개발 방법론 : 소프트웨어 공학 등 시스템 설계와 개발방법에 대해서 배운다. 프로그램의 설계 방법과 프로젝트 중 시간관리, 인력관리, 자원관리법 등 배우는 내용을 보면 오히려 경영학에 가깝다. 문과적 소양이 없는 순수 컴덕이 만나게 되는 난관 중 하나. 실제 기업에서 대규모 개발에 사용되는 계획 및 경영방법 [16] 을 개념적으로 배우며 실습 역시 병행한다. 교수의 기대치와 학생의 능력의 괴리감이 아마도 가장 큰 과목일 것이다. 실제 이쪽 담당의 교수 밑에서 학생들을 가르친 조교의 증언에 의하면, 일단 학생들의 전반적인 코딩 능력이 바닥을 기는데다 오로지 정답만을 찾도록 12년동안 훈련된 학생들을 상대로 정답이 없는 분야의 내용을 가르치려니 글자 그대로 애로사항이 꽃핀다고. 다만 개발 방법론에서 코딩이 차지하는 비중이 크지는 않기 때문에 Hello, world!만 띄울 수 있는 수준이 아니라면 코딩 실력이 심각한 문제가 되지는 않는다. 정답을 찾는 학문에서 정답이 없는 학문으로의 패러다임 전환은 비단 이 분야 뿐만 아니라 거의 모든 고등 교육의 커리큘럼에도 해당되는 얘기이고.

  • 소프트웨어 공학: 소프트웨어 개발에 대한 공학적인 방법에 대해 배운다. 요구공학, 분석, 설계, 구현, 테스트, 유지보수, 형상관리, 개발 방법론, 품질 관리, 재사용성 등 소프트웨어 개발에 있어서 체계적인 접근 방법에 대해 공부하게 된다. 실습은 CASE 도구나 UML 툴 같은 걸 사용하기도 하며, 전체 내용 중 코딩은 5%에도 미치지 못한다. 소프트웨어 공학 지식 체계인 SWEBOK(Software Engineering Body of Knowledge)이 ISO/IEC 24773 표준으로 자리잡았기 때문에 배우는 내용이 범주에서 크게 벗어나지 않는다. 이 과목을 배우게 되면 개발이라는게 철저하게 코딩이 다가 아니다라는 개념을 탑재하게 되며, 은근히 소프트웨어 공학에서 배운걸 써먹게 되는게 많고, 비전공자는 코딩만 할 줄 알지 이런 공학적인 방법을 따로 찾아보지 않는 이상 잘 모르기 때문에 전공자와 비전공자를 가르는 기준으로 판단하기도 한다. [17]

  • 멀티미디어 : MPEG, 영상 신호처리, 코덱, 미디어의 압축[18]과 전송, 음향 등 멀티미디어와 관련된 내용을 배운다. 게임 프로그래밍을 배우는 경우도 있다. 절대로 포토샵, MAYA 같은 툴 사용법을 배우는게 아니다! 의외로 빠삭한 양의 수학이 들어가며사실 수학만 배운다..., 얕잡아보면 후회하게 될 것이다.

  • 컴퓨터 그래픽: DirectX, CUDA, OpenGL 등을 사용하여 3D의 모델을 바탕으로 2D의 이미지를 그려내는 코딩 을 한다. 숙제의 일환으로 간단한 게임을 만들게 될 수도 있다- 그 유명한 "머릿글자 B - 관악최속전설"도 그래픽 과목 숙제로부터 기원한다. 어느 정도의 미적분 실력과 선형대수학 실력만 있어도 수업에서 배우는 내용을 따라하고 숙제를 풀어내는 데에는 별 문제가 없겠지만, 보다 근본적으로 이해하려면 기하광학미분기하학에 대한 지식이 필요하다.

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

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

3. 컴퓨터공학과[편집]

해당 문서 참조.

4. 다른 공학과의 관계[편집]

막상 보면 다른 공학과 비교해서 차이점이 크다. Computer Engineering(컴퓨터공학)이기도 하면서 Computer Science(컴퓨터과학)이라고도 불린다. 컴퓨터공학은 공학 분야의 하나로서 산업과 밀접한 관계를 가지며, 동시에 과학 분야의 하나로서 학문 연구가 진행된다.

4.1. 전자공학[편집]

대부분 대학에서의 컴퓨터공학과는 전자공학의 당시 최첨단 이론인 반도체를 바탕으로 시작했고, 결국 전자공학과로부터 독립하게 되었다. 따라서 두 과간에 행정적으로나 연구적으로나 교류가 많다. 컴퓨터공학의 뿌리는 전자공학이 맞다. 컴퓨터를 어떻게 더 잘 활용하기 위한 학문이 컴퓨터 공학이고 그 도구가 수학일 뿐이다. 전자공학에서도 컴퓨터 공학 관련된 연구는 컴퓨터 시각이나 음성인식 같은 아날로그와 디지털의 경계에 있는 분야외에도 병렬처리, 운영체제 등 겹친다.

학부 레벨에서도 컴퓨터공학과 전자공학의 소프트웨어 관련된 커리큘럼을 비교해보면 겹치는 과목이 많다. 대략 1/3정도의 과목이 겹친다고 한다. 예를 들어 프로그래밍 언어, 이산수학, 자료구조, 운영 체제, 논리 회로, 컴퓨터구조, 알고리즘, 컴퓨터 네트워크, 멀티미디어 등. 물론 학교마다 다르니 그냥 이렇다만 알고 있자.

만약 전자공학을 복수전공한다면 하드웨어쪽 지식을 같이 배울 수 있어 임베디드 분야에 진출하는데 상대적으로 유리하긴 한데, 공대는 하나만 전공하기에도 바쁘다는 것을 생각해야 한다. 만약 소프트웨어를 더 깊게 파고 싶으면 수학이나 언어학 (자연어처리) 같은 전공을 복수전공하는 것이 좋다.

[1] KAIST는 여전히 전산학과로 부른다.[2] 상당히 많이 사용되는 언어이기는 하지만 '프로그래밍 언어 공부'라는 목적에 있어서 C나 C++은 그리 좋지 못한 선택이라는 비판도 있다. 하지만 학생 시절 가장 먼저, 그리고 가장 빨리 접하게 되는 언어.[3] 서강대학교 처럼 오직 C만 집중적으로 깊게 가르치고 나머진 겉핥기식으로 배우는 학교도 있다[4] Javascript, PHP[5] 몇몇 학교는 반대로 이해하기 편한 스크립트 언어를 1학년 때 배우기도 한다.[6] LISP, Haskell[7] Prolog[8] 보통 학교에 프로그래밍 언어를 연구하는 교수가 있으면 이런 과목들이 개설된다.[9] DE2보드 정도는 직접 다루는 경우가 많다[10] 처리해야하는 데이터가 많아질수록 필연적으로 알고리즘의 실행이 끝나는 속도가 느려지는데, 늘어나는 처리 데이터에 비례해서 얼마나 알고리즘의 실행 속도가 느려지느냐가 관건이다. 예를들어, n 만큼의 데이터를 처리해야 할때 O(n2)O(n^{2}) 복잡도를 가진다면, 처리해야 하는 데이터의 양에 제곱을 한 만큼 비례해서 알고리즘이 느려진다. [11] 이쪽은 처리해야하는 데이터에 비례해서 알고리즘이 얼마나 많은 양의 메모리를 필요로 하는가가 관건이다. 이를테면, 동적계획법을 활용한 배낭 문제에 대한 해의 경우, 시간 복잡도는 다항식적인데 공간복잡도는 기하급수적이다![12] 미적분학을 증명하는 의미에서 약간만 배우게 되는 것은 그렇다 치더라도, 기계학습을 이론적으로 연구해보고 싶으면 측도론과 함수해석학을 알아야 하는데, 이것들은 웬만한 전공자들도 어려워하는 과목들이다! [13] 현재 인공지능은 통계적 기법이 대세다. 룰이나 논리 기반 추론은 이미 연구될 만큼 연구되었고 더 이상 주목할 만한 학문적 성과가 나오고 있지 않기 때문이다.[14] 특정 언어를 사용하는 법이 아니라 언어와 문법이 어떤 식으로 구조화되어 있는지를 배우며 이를 이용하여 컴퓨터 언어를 만드는 법에 대한 기초 이론이며, 컴파일러를 위시한 구현법도 포함된다. 상당히 수학적인 과목이면서도 언어학적인 과목. 컴파일러 과목의 기초이며 이 과목을 배우면 노엄 촘스키의 위대함을 깨달을 수 있다.[15] 90년대에는 UC 버클리에서 만든 Nachos를 많이 사용했다. PintOS는 2004년에 스탠퍼드에서 Nachos를 개량하여 대체한 실험용 운영체제이다.[16] 즉, Agile Process운용 기법, ITBM, IS구축 기법, IT Integration 등을 배운다 [17] 제안서 작성(요구공학), 문서화(유지보수), 단위 테스트(테스트), git(형상관리), 애자일(개발 방법론) 등[18] JPEG라든지 [19] 그래도 이쪽 분야로의 진로를 계획하는 사람이 있다면 독학으로라도 공부해 두도록. 현업에 나가면 이쪽의 지식을 써먹을 분야가 많다. 소켓 프로그래밍을 할 필요가 없는 웹 개발자라 하더라도 이쪽 지식을 알고있는 사람과 모르는 사람간의 격차가 크다.