이공계 대학생/대학원생을 위한 컴퓨팅 강좌 5: 컴퓨터 언어 선택
이공계 대학생/대학원생을 위한 컴퓨팅 강좌 5: 컴퓨터 언어 선택
안녕하세요. @jwsohn입니다. 오늘 포스팅에서는 어떤 컴퓨터 언어를 배우는 것이 좋은지에 대해서 제 개인적인 추천 의견을 정리해 보도록 하겠습니다.
어떤 컴퓨터 언어를 배우는 것이 좋은가?
컴퓨터 언어는 크게 보면 도구(tool)이라고 볼 수 있을 겁니다. 컴퓨터로 어떤 작업을 수행하는 데 그 방법을 지시해 놓은 명세서(specification)가 컴퓨터 언어이니까요. 그런 까닭에, 어떤 컴퓨터 언어를 배울 것인가 고르는 것은 도구를 고르고 쓰는 방법을 배우는 과정과 비슷하다고 볼 수 있겠습니다.
기본은 탄탄히
프로그래밍 혹은 코딩 작업은 컴퓨터를 사용하는 작업입니다. 따라서, 코딩을 하려면 디지털 컴퓨터라는 기계에 대한 기본적인 이해가 있어야 할 것이고, 일반적인 컴퓨터 언어의 설계와 자주 쓰이는 기법에 대해서도 이해가 있어야 할 것입니다.
그런데, 자신의 필요만 따라 코딩을 하는 분들은 컴퓨터 언어에 대한 이해도가 낮은 경우가 많습니다. 이런 경우는 한번 쓰고 재사용이 쉽지 않은 코드가 나오기 쉽습니다.
그래서, 어떤 컴퓨터 언어를 배우는 것이 좋은가 하는 질문은 접근을 조금 다르게 할 필요가 있다고 생각합니다. 사용자의 필요에 따라 어떤 언어를 배우든 간에, 컴퓨터 프로그래밍에 대한 기본적인 지식은 반드시 습득해야 할 필요가 있습니다.
그런 까닭으로, 대학 교과 과정으로 생각하자면 컴퓨터 공학 비전공자라도 자료 구조론(data structures)은 확실히 배우는 것이 좋다고 생각합니다. 자료 구조론이 컴퓨터 프로그래밍 기법의 가장 기본을 다루고 있기 때문입니다.
자료구조론 학습을 위한 컴퓨터 언어
그러면 프로그래밍의 기초를 다지기 위한 컴퓨터 언어는 어떻게 선택하는 게 좋을까요? 자료구조론을 배우기 좋은 언어는 특별한 것은 없습니다. 다만, 2018년 현재로서는 Java나 Python을 추천하고 싶은데 이 중에서 특히 자료구조만을 놓고 보면 Java를 좀 더 추천하고 싶습니다.
왜냐하면 Java는 Python에 비해서 언어가 저수준(low-level)입니다. Java는 Python과는 달리 리스트(List), 해쉬(Hash) 같은 고차원적인 자료 구조가 언어 자체에 내장되어 있지 않습니다. 물론, Java의 경우 기본적으로 따라오는 JDK(Java Development Kit)의 Collection API가 이 부분을 잘 해결해주고 있습니다만 이것은 언어를 배우고 난 뒤 JDK API를 좀 더 공부해야 알 수 있는 것이죠.
따라서, 아주 기본적인 기법만을 이용해서 프로그래밍 기법, 특히 자료 구조 코딩 연습에서 가장 중요한 동적 메모리 할당 (dynamic memory allocation)의 개념을 습득하기 위해서는 Python보다 배우기에 신경 쓸 일이 많은 Java를 쓰는 것이 더 좋다고 봅니다.
그러면 이왕 저수준으로 가는 김에 C나 C++도 생각해 볼 수 있겠습니다만 요즈음은 그 정도까지 갈 필요는 없다고 생각합니다. C의 경우는 언어 구조가 간단하면서도 강력하지만 나중에 객체지향 프로그래밍 (object oriented programming) 개념을 습득하기가 불편할 수 있습니다. C++는 모든 기능을 다 갖추고 있는 좋은 언어이지만 반대로 배우기가 어렵고 Java의 JDK와는 달리 언어에 기본적으로 따라오는 좋은 라이브러리가 없습니다. 이런 면에서는 Java가 C나 C++에 비해 언어 습득의 용이성이나 실용성의 측면에서 낫다고 생각합니다.
사용자의 필요를 생각해보자
이제 기본을 다졌으니 그 다음으로 사용자의 필요(needs)를 생각해 보겠습니다. 여기서부터는 여러분들의 선택이 갈릴 수 있겠습니다. 필요에 따라 적절한 도구를 쓰는 것이 좋을테니까요.
컴퓨터로 데이터 처리하기: Big Data
최근의 컴퓨팅의 가장 큰 동향은 인공지능(artificial intelligence)가 유행하면서 기계 학습(Machine Learning) 분야의 중요성이 강조되고 있다는 점입니다. 기계 학습을 배우기 위해서는 무엇이 중요할까요? 통계학(statistics)이 중요합니다. 기계 학습 이론의 상당부분이 확률/통계 이론에 바탕을 두고 있기 때문입니다. 그래서 소위 빅 데이터 처리에 관심이 있으신 분들은 이제는 통계학을 열심히 해야 하시겠습니다. 또, 통계학을 잘 하기 위해서는 행렬(matrix) 연산이 많이 필요하니 선형대수학(linear algebra) 공부도 생각해 보셔야 하겠습니다.
컴퓨터 언어로 데이터를 처리하려면 또 어떤 기능이 필요할까요? 데이터라는 것은 사람 눈으로 읽어내는 데 한계가 있습니다. 그런 까닭에 평균이나 표준편차같은 대표값도 구해보고, 히스토그램 같은 그래프도 그려보게 되는 것이죠. 좀 더 나아가서는 회귀 분석(linear regression)이나 데이터 마이닝(data mining) 같은 기법을 쓸 수도 있는 것이구요.
이렇게 데이터 처리, 분석과 data visualization 등에 뛰어난 언어로는 Python (matplotlib), Matlab, R 등을 추천합니다. 여기서 범용성으로는 Python이 가장 우수하고 Matlab이나 R은 data visualization 쪽으로 좀 더 유리합니다. 다만, 범용 어플리케이션을 개발하는 목적으로 Matlab이나 R은 적합하지 않을 수도 있습니다.
기계학습 라이브러리를 가져다 쓰는데는 언어의 제약에 큰 신경을 쓰지 않으셔도 괜찮습니다. Language binding API가 잘 제공되고 있지요. 일례로 구글에서 배포하는 TensorFlow의 경우 Python과 C++로 개발되어 있지만 Java API가 제공됩니다.
웹 어플리케이션 개발:
웹 어플리케이션을 개발하기 위해서는 Javascript를 잘 배우셔야 하겠습니다. 다만, Javascript는 언어로서의 Javascript를 배우는 것에 추가해서 Javascript 기반 웹 어플리케이션 개발 프레임워크를 잘 배우셔야 하겠습니다. 비유하자면 배보다 배꼽이 더 크다고 볼 수 있겠습니다. 아, 물론 웹 페이지의 기반이 되는 HTML과 CSS도 기본으로 알아야 하겠지요.
모바일 앱 개발:
이쪽은 이미 정보가 많은 까닭에 굳이 여기서 설명을 안해도 될 것 같습니다. 안드로이드 앱을 개발하려면 Java를, iOS 앱을 개발하려면 Objective C나 Swift를 추가로 배우시면 되겠지요.
컴퓨터로 계산하기: 수치해석 (Numerical analysis)
컴퓨터로 계산을 해야 하는 경우입니다. 이 경우는 계산 속도가 빠르고 행렬(matrix) 연산이 쉬운 언어를 쓰는 것이 좋겠습니다. Matlab이나 Python(Numpy, Matplotlib)을 추천합니다.
참고로 수치해석 문제 중에서 빠른 CPU 속도와 대량의 Memory를 필요로 하는 경우가 있습니다. 이런 경우는 어쩔 수 없이 속도가 빠른 언어를 써야 하는데요. C나 C++, 심지어는 Fortran까지 쓰는 경우도 있습니다. 그런데 의외로 Fortran이 언어가 간단하며 계산이 빠르고 정확하다는 장점이 있으니 혹시 대학원 과정에서 Fortran을 다루어야 하는 상황이 전개된다면 부담갖지 마시고 써 보시길 추천합니다.
수치해석쪽 코딩을 한다면 객체지향기법(object oriented programming)과 같은 개념은 그다지 중요하지 않습니다. 자료구조론까지만 열심히 하시면 된다고 생각합니다.
잘 모르겠다?
굳이 코딩을 해서 어떤어떤 프로그램을 만들어야겠다 목표가 없어도 좋지 않겠습니까. :) 별다른 생각이 없으시면 이렇게 해 보시는 것도 좋을 것 같습니다.
우선 자료구조론을 Java로 배우시길 추천합니다. 그 이후에는 Java를 계속 들고 파도 좋고 Python 같은 언어로 옮겨가셔도 좋구요. 어느 쪽으로 가시든 객체지향 프로그래밍(object-oriented programming)을 잘 익히시길 추천합니다. Python을 쓰면 함수형 언어 (functional language)의 특성도 잘 배워두시면 좋구요.
이 정도까지 시간이 흐르고 나면 아마도 어떤 프로그램을 만들고 싶은지 생각이 드실 겁니다. 그래도 생각이 안나면 구글이나 마이크로소프트 같은 곳에서 면접을 볼 때 잘 나오는 technical interview 준비용 문제들을 찾아서 하나하나 해 보세요. 조금 부담스럽긴 해도 상당히 재미있고 유용한 문제들이 많습니다.
마치면서
지금까지 간단하게 어떤 언어를 선택해 배우는 것이 좋은가라는 질문에 나름 여러가지 답을 만들어 보았습니다. 글이 지나치게 추상적으로 가 버린 느낌이 있습니다만 도움이 되셨기를 바랍니다.
전체적으로 코딩의 기본으로서 자료구조론의 중요성을 한번 더 강조해 보고 싶구요. 자료구조론 코딩을 하면서 동적 메모리 할당(dynamic memory allocation) 기법을 확실히 배우게 되는데요. 이 기법을 확실히 이해하고 있는 사람과 그렇지 않은 사람의 코딩 수준은 차이가 큽니다.
그리고 추가로 어느 언어를 배우시든 코딩 스타일(coding style)도 공백 하나하나까지 정확하게 신경을 쓰시길 부탁드립니다. 기본적으로 들여쓰기(indentation)부터 엉망인 코드를 짜는 분들이 의외로 많습니다. 코딩 스타일이 칼같이 적용된 코드가 아니면 사실상 코드의 재사용은 불가능이라고 보시면 되겠습니다.
일단 자료구조론 까지만 정확하게 습득하시고 나면 각자 필요에 따라 언어를 더 공부해 나가시면 되겠습니다. 전체적으로 Java나 Python을 꾸준히 하시고 웹 인터페이스쪽이 필요하면 Javascript와 웹 프레임워크를 열심히 하시면 좋지 않을까 싶습니다.
여기까지 읽어 주셔서 감사합니다. 다음 포스팅에서 뵙겠습니다.