나의 프로그래밍 공부법 - 1.3. 프로그래머는 수학을 잘해야 한다?

2012. 10. 28. 15:17기타/나의 프로그래밍 공부법

본문 내용에도 적어놓았지만, 필자는 인문계 이과를 선택하였지만 수학 과목은 잼병이었다. 개인적으로 수학이라는 학문하고 궁합이 맞지 않는 부분에 대해서는 진심으로 아쉽게 생각한다. 왜냐하면 프로그래밍을 할 때에, 무식한 노가다성 알고리즘 보다는 효율적이고 안정적인 알고리즘을 만들 수 있는 확률이 더 높았을 것 같기 때문이다. 어떠한 방식으로든 프로그램을 구동시켜서 결과를 만들어내는 것은 가능하지만, 그 프로그램이 얼마나 더 효율적으로 운용되느냐는 그 프로그래머의 진정한 실력을 가늠할 수 있는 잣대가 되기 때문이다. 


만일 여러분이 수학을 잘한다면 프로그래밍 공부에 더욱 날개를 달아주는 조건을 갖추었다는 사실에 기뻐해야 한다. 전문적인 수학을 다루는 프로그램을 개발하지 않더라도, 수학을 공부하면서 다져진 기본적인 "수학적인 사고"는 여러분이 프로그래밍 공부를 할 때 큰 도움이 될 수 있기 때문이다. 


아직 수학을 배우고 있는 학생이라면, 좋은 프로그래머가 되기 위해서 지금부터라도 더 열심히 수학 공부에 매진하라. 물론, 프로그래밍 공부도 그만큼 더 열심히 해야한다.


------------------

프로그래머는 수학을 잘해야 한다?


가장 많이 듣는 질문 중에서 프로그래밍을 잘하려면 “수학”을 잘 해야 하느냐라는 질문이다. 개인적으로는 여기서 말하는 “수학”이란 우리가 일반적으로 말하는 “수학”이라기 보다는 “수학적인 사고”를 뜻하는 것이라고 생각한다. 단순히 수학 문제를 잘 푸는 것도 중요하지만 주어진 문제를 해결하기 위해서 수학적인 사고력을 이용하여 더 나은 해결 방법을 찾는 것이 중요할 것이다.


“수학”은 대수학, 미적분학, 수리논리학, 집합론, 범주론, 정수론, 해석학, 기하학, 위상수학, 응용수학, 확률론, 통계학, 수리물리학, 그리고 “이산수학” 등으로 구분할 수 있다. 이 중에서 전자계산학과에서 배우게 되는 대표적인 수학 과목은 “이산수학(離散數學:Discrete mathematics)”이다. 이산수학은 컴퓨터에서 다루는 자료형이 이산적이라는 관점에서 전산학의 기초라고 볼 수 있으며, 이산수학에서 나온 개념이나 기호 등은 컴퓨터 알고리즘과 프로그래밍 언어의 문제를 해결하는 방법을 찾는데 큰 도움이 된다.


이 자리에서 고백을 하자면, 필자는 인문계 고등학교에서 이과를 선택하여 수학을 배웠고 대학교에서도 공학 계열인 전자계산학을 전공을 하였지만 수학 성적이 좋은 편은 아니었다. 그래서 지금까지 오랫동안 프로그래밍을 해왔지만, 종종 수학 공부가 부족한 것에 아쉬웠던 경우가 있었다. 예를 들어 그래픽 명령어를 이용하여 곡선을 그릴 때 왜 그런 공식을 사용해야 하는지 쉽게 이해가 가지 않거나, 수학 개념을 사용하여 문제를 풀 수 있는 알고리즘을 만들어야 할 때, 그리고 무엇보다도 3D 프로그래밍을 망설이는 이유도 다른 프로그래밍에 비해 수학에 대한 높은 이해도를 요구하기 때문이었다.


이러한 필자의 경험에 비추어 본다면 수학을 잘 한다고 해서 반드시 프로그래밍을 잘하는 것은 아니겠지만 더 좋은 프로그래밍을 위해서 수학을 잘하는 것이 도움이 될 수 있다는 점은 분명하다고 할 수 있다.


간단하게 예를 들어보겠다. 컴퓨터 그래픽을 이용하여 원을 그린다고 할 때 우리는 수학 시간에 배운 공식을 이용하면 생각보다 쉽게 원을 그릴 수 있다.


radian(호도) = 각도 * π(PI) / 180


X = 반지름 * sin( radian )


Y = 반지름 * cos( radian )


이와 같은 공식을 이용한다면 각도 값으로 0부터 360까지 넣어 각각의 x, y 좌표를 구한 다음, 해당 좌표에 점을 찍어서 연결해주면 하나의 원이 완성할 수 있다. 이것을 간단하게 C언어로 작성을 한다면 다음과 같이 만들어 볼 수 있다. 아직 프로그래밍 언어를 배운 적이 없는 독자도 있겠지만, 그래도 한자한자 읽어보았으면 한다.


#include <graphics.h>

#include <math.h>


main()

{

int rasious = 100;

for (int degree = 0; degree < 360; degree++)

{

double radian = degree * M_PI / 180;

int x = radious * sin(radian);

      int y = radious * cos(radian);

putpixel(x, y, 1);

}

getch();

}


물론 이것 말고도 원을 그리는 알고리즘은 여러 가지가 있지만, 수학적이 베이스가 전혀 없는 개발자들이 원을 그려내기 위해서 억지로 머리를 짜내어 작성한 소스 코드를 보면 왜 수학적인 베이스가 중요한지를 새삼 느끼게 된다. 간단한 원 하나를 그리는 것도 이러한 차이가 있는데, 실시간으로 복잡한 수학 연산을 해야 하는 경우라면 얼마나 큰 차이가 있을지 여러분도 쉽게 짐작이 될 것이다.