컴퓨터공학

  컴퓨터공학과에 대한 내용은 컴퓨터공학과 문서를 참조하십시오.

{{{#!wiki style="background-color:#fff"

{{{#!wiki style="margin:5px; display:inline-block"

}}}{{{#!wiki style="margin:5px; display:inline-block"

}}}}}}

형식과학의 일반적 분류

수학

통계학

논리학

암호학

1. 개요
1.1. 컴퓨터과학(Computer Science)과 컴퓨터공학(Computer Engineering)의 차이
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(컴퓨터과학/전산학)

Computer Engineering(컴퓨터공학)

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

1.1. 컴퓨터과학(Computer Science)과 컴퓨터공학(Computer Engineering)의 차이

분야

컴퓨터과학

컴퓨터공학

설명

수학과 가까움
소프트웨어 위주

전자공학과 가까움
하드웨어 위주
컴퓨터과학전자공학을 이어주는 분야

영문

Computer Science

Computer Engineering

번역명

전산학

전산공학

배우는 학과
(한국기준)

컴퓨터과학과, 전산학과
일부학과를 제외한 대부분의 컴퓨터공학과

보통 전자공학과의 세부전공이다
정보통신공학과컴퓨터공학을 메인으로한다

배우는 학과
(미국기준)

컴퓨터과학과(Computer Science)

컴퓨터공학과(Computer Engineering)또는
전자공학과(Electrical Engineering)

한국의 일상 대화에선 컴퓨터과학과 컴퓨터 공학을 크게 구분하여 말하지 않는다. 하지만 북미권에서는 컴퓨터과학(Computer Science)과 컴퓨터공학(Computer Engineering)이 분리가 되어있다.

컴퓨터과학은 좀 더 이론적이고 수학이나 소프트웨어 쪽에 치중이 돼있다면 컴퓨터공학은 전기전자공학에서 연구하는 기기들 중에서 전자계산기인 컴퓨터를 연구하고 가르친다. 즉, 컴퓨터과학은 수학과에 더 가깝고, 컴퓨터공학는 전자공학에 더가깝다. 통상 북미권에서는 전자공학과 컴퓨터공학을 합쳐 EECE로, 컴퓨터과학을 CS로 하여 많이 분류한다.

1.2. 컴퓨터과학과컴퓨터공학과

컴퓨터공학과와 학과 생활 및 준비과정, 진로에 대한 자세한 정보는 해당 문서 참조.

인서울 대학의 컴퓨터 관련학과(통칭 컴공, 컴과로 불리는 학과한정)의 66%는 학과 명칭에 공학(工學)이 들어가지 않는다. 34%만 학과 명칭에 공(工)학이 들어간다. 소속단과대학도 정보대학, 공과대학. 자연과학대학 학교별로 다르게 속해있다.

하지만 학과 명칭에 공(工)학이 들어가는 34%에 해당하는 컴퓨터공학과에서도 컴퓨터공학(Computer Engineering)보다는 실질적으로는 컴퓨터과학(Computer Science) 위주로 배우는 경우가 대부분이다.[1] 이는 기존의 컴퓨터과학과가 컴퓨터공(工)학과라고 이름을 바꿈으로써 공학계열 등록금을 받을 수 있기에(...) 2000년대 들어서 많이 변경했기 때문이다.[2]

2. 분류

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

― 에츠허르 다익스트라

흔히 컴퓨터공학과를 프로그래밍을 배우는 학과라고 생각하지만, 그것은 마치 경영학과주판을 배우는 학과라거나, 의류의상학과바느질을 배우는 학과, 기계공학용접하는 곳이라고 생각하는 것과 같다. 컴퓨터공학과는 컴퓨터과학이라는 독립적인 학문을 배우는 학과라는 것을 명심하자. 컴퓨터를 물리적 기기로 보고 연구하는 학문이 아니라, Compute + r, 즉 계산기계라는 "개념"과, 그 구조에 대한 학문이다. 우리가 흔히 쓰는 데스크탑, 스마트 폰 등은 그러한 개념들을 구체화한 일부일 뿐이다.

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

2.1. 이론 컴퓨터과학

컴퓨터의 수학적 기반에 대해 다룬다. 기계공학/전자공학/화학공학 등의 대표적인 공학에 비해 수학을 굉장히 많이 사용한다. 어떻게 보면 수학과에 가깝다. 실제로 이론 전산학에서 연구하는 것들은 수학과에서도 연구하고 있다. 즉, 학제간 연구 분야이다.

  • 이산수학: 공대 학과 중 전산계열에서만 배우는 수학.
    • 알고리즘: 알고리즘의 시간 복잡도및 공간 복잡도를 주로 다룬다. 시간 복잡도의 경우 처리해야 하는 데이터가 많아질수록 필연적으로 알고리즘의 실행이 끝나는 속도가 느려지는데, 늘어나는 처리 데이터에 비례해서 얼마나 알고리즘의 실행 속도가 느려지느냐가 관건이다. 예를 들어, n 만큼의 데이터를 처리해야 할때 O(n^{2}) 복잡도를 가진다면, 처리해야 하는 데이터의 양에 제곱을 한 만큼 비례해서 알고리즘이 느려진다. 공간복잡도의 경우 처리해야하는 데이터에 비례해서 알고리즘이 얼마나 많은 양의 메모리를 필요로 하는가가 관건이다. 이를테면, 동적계획법을 활용한 배낭 문제에 대한 해의 경우, 시간 복잡도는 다항식적인데 공간복잡도는 기하급수적이다!
    • 오토마타 이론: 기초적인 automaton과 결정가능성, 그리고 튜링머신에 대해 배운다.
    • 정수론: 암호 분야에 사용 된다.
    • 집합론
    • 그래프 이론
    • 조합론
    • 이산 확률론
  • 기하학
    • 이산/계산 기하학 : 컴퓨터를 이용해서 물체를 어떻게 표현 할 할지 연구하는 분야이다. 컴퓨터 그래픽에서 대표적으로 많이 사용하고 최근에는 컴퓨터 비전, 기계학습, 인공지능 분야에서도 사용된다.
    • 이산 미분 기하학
  • 미분방정식 : 컴퓨터 그래픽스에서 물체의 움직임에서 사용하기도 하고, 계산 과학 분야에서도 사용한다.
  • 확률과 통계

위와 같이 수학 전반을 다루기 때문에 일반적인 컴공생보다 수학 전공자들이 유리한 분야다. 실제로 이쪽은 교수부터 수학전공자 출신인 경우가 많다. 다만, 한국에서는 거의 죽은 분야에 가깝다. 한국의 경우, 교육열이 입시에 쏠려있어, 고교수학에 매우 강하며 실제 대학에서도 이런 경향이 이어져 고교 때 배우는 미적분을 많이 다루는 해석학과 같은 분야쪽에 쏠리는 경향이 강하다. 비표준 논리학은 수학에서 해석학과 거리가 가장 먼 분야로 볼 수 있으며, 덕분에 한국에서 이쪽 전공 교수 자체가 별로 없다. 다만 철학과까지 범위를 넓혀보면 그나마 숫자가 좀 늘어나긴 한다. 즉 철학과에도 수리 논리학은 물론이고, 비표준 논리학도 건드려본 논리학 전공 교수들이 있다. 참고로 논리학은 원래 철학의 한 분야지만, 국내 수학과 내에 논리학 전공 교수가 많지 않듯이, 국내 철학과에서도 논리학 전공 교수가 많진 않다. 당연히 컴퓨터 과학에서도 마찬가지. 국내는 이쪽 관련 인프라가 열악하므로 이쪽을 전공하고 싶다면 해외로 나가는 수밖에 없다. 하지만 최근 대학에서 이론 전산학을 연구하는 교수들이 조금씩 늘어가고 있다.[3]

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

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

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

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

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

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

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

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

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

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

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

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

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

요구공학, 분석, 설계, 구현, 테스트, 유지보수, 형상관리, 개발 방법론, 품질 관리, 재사용성 등 소프트웨어 개발에 있어서 체계적인 접근 방법에 대해 공부하게 된다. 실습은 CASE 도구나 UML 툴 같은 걸 사용하기도 하며, 전체 내용 중 코딩은 5% 미만이다. 소프트웨어 공학 지식 체계인 SWEBOK(Software Engineering Body of Knowledge)이 ISO/IEC 24773 표준으로 자리잡았기 때문에 배우는 내용이 범주에서 크게 벗어나지 않는다. 이 과목을 배우게 되면 개발은 절대 코딩이 다가 아니다라는 개념을 탑재하게 되며, 은근히 소프트웨어 공학에서 배운걸 써먹는 곳이 많고, 비전공자는 코딩만 할 줄 알지 이런 공학적인 방법을 따로 찾아보지 않는 이상 잘 모르기 때문에 전공자와 비전공자를 가르는 기준으로 판단하기도 한다. [13] 프로그램의 설계 방법과 프로젝트 중 일정관리, 인력관리, 자원관리법 등 배우는 내용을 보면 오히려 경영학에 가깝다. 문과적 소양이 없는 순수 컴덕이 만나게 되는 난관 중 하나. 실제 기업에서 대규모 개발에 사용되는 계획 및 경영방법[14]을 개념적으로 배우며 실습 역시 병행한다. 교수의 기대치와 학생의 능력의 괴리감이 아마도 가장 큰 과목일 것이다. 실제 이쪽 담당의 교수 밑에서 학생들을 가르친 조교의 증언에 의하면, 일단 학생들의 전반적인 코딩 능력이 바닥을 기는데다 오로지 정답만을 찾도록 12년동안 훈련된 학생들을 상대로 정답이 없는 분야의 내용을 가르치려니 글자 그대로 애로사항이 꽃핀다고. 다만 개발 방법론에서 코딩이 차지하는 비중이 크지는 않기 때문에 Hello, world!만 띄울 수 있는 수준이 아니라면 코딩 실력이 심각한 문제가 되지는 않는다. 정답을 찾는 학문에서 정답이 없는 학문으로의 패러다임 전환은 비단 이 분야 뿐만 아니라 거의 모든 고등 교육의 커리큘럼에도 해당되는 얘기이고.

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

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

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

2.10. 통신공학, 네트워크

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

2.11. 보안공학

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

2.12. 전산/계산 암호학

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

3. 다른 학문과의 관계

3.1. 전기공학 / 전자공학

컴퓨터의 역사를 크게 두가지로 구분하면 하드웨어와 소프트웨어로 구분된다. 하드웨어의 경우 물리학자들과 전기전자공학자들이 발전시켰고 소프트웨어의 경우 수학자들과 컴퓨터과학자들이 발전시켰다. 현대에도 전자공학, 통신공학 등의 전자기학 기반 학문들과 연관성이 교류가 이루어지고 있다.

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

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

3.2. 수학 / 통계학 / 언어학 / 암호학

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


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

최종 확인 버전:

cc by-nc-sa 2.0 kr

Contents from Namu Wiki

Contact - 미러 (Namu)는 나무 위키의 표가 깨지는게 안타까워 만들어진 사이트입니다. (45.80ms)