이런 질문을 받으면 나는 항상 난감했다. 주력 언어가 없기 때문이다.
이게 무슨 소리냐고 할 수 있는데, 일단 나는 프로젝트용 언어와 코딩테스트용 언어가 다르다.
프로젝트용 언어는 주로 자바스크립트를 써왔고, 코딩테스트용 언어로는 C++을 사용한다.
내가 대학교에 입학하고 제일 처음 접한 언어가 C++이다.
물론 이것이 코딩테스트용 언어로 C++을 선택한 이유가 되지는 못한다.
일단 나는 처음에는 객체지향 개념을 이해하지 못하고, 따라서 자연스럽게 C++을 싫어하게 되어서 C++을 멀리한 시간도 꽤 길다.
그렇게 C++와 내외하던 중 개발 동아리에 프론트엔드 직군으로 들어가게 되었고, 자연스럽게 자바스크립트로 프로젝트를 하기 시작했다.
이 부분에 대해서는 당당하게 절대 그럴 수 없다고 말할 수 있을 것 같다.
일단 나는 적어도 주언어라고 당당하게 말할 수 있으려면, 해당 언어를 적어도 어느정도 이해하고, 프레임워크 없이 개발이 가능해야 한다고 생각한다.
하지만 나는 바닐라 자바스크립트를 잘 이해하지 못한 채로 리액트로 넘어갔고, 그 이후에도 자바스크립트를 이해하지 못했다...
리액트를 익힌 뒤로는 너무나도 당연히 리액트로 프로젝트를 진행했고, 그러다보니 순수 자바스크립트를 이해할 기회는 더더욱 없었다.
이해하고 싶었지만 이해하지 못한 건지, 이해하고 싶지 않았던 건지는 잘 모르겠다
이러한 상황에서 알고리즘 공부를 위한 언어를 하나 정해야 했다.
앞서 언급한 C++과 자바스크립트, 그리고 많은 사람들이 추천하는 파이썬...
많은 선택지가 있었는데, 그 중 내가 선택한 것은 파이썬이었다.
C++과 자바스크립트는 써보기만 했지 잘 모른다는 것이 그 이유였고, 많은 사람들이 파이썬을 추천하는 데에는 분명 이유가 있을 것이라고 생각했다.
그렇게 파이썬으로 코딩테스트 공부를 시작했다.
유명한 이코테 책을 사서 보기도 했고, 강의도 들었고... 당연히 백준 문제도 풀었다.
아니다.
파이썬으로 코테 공부를 시작한 것은 맞지만 이내 벽에 부딪혔다.
- 라이브러리를 import 하기 위해서는 이걸 암기해야 하는데, 뭐가 어떤 라이브러리에 있는지 외우는 것이 생각보다 만만치 않았다.
- 언어만 파이썬일 뿐 C++처럼 코드를 작성하고 있는 내 자신과 마주쳤다.
파이썬은 편의를 위한 라이브러리가 정말 많다.
물론 이것은 분명 장점이지만, 많이 제공된다는 것은 그만큼 어떤 기능이 어떤 라이브러리에 있는지 외워야 한다는 것을 의미한다.
그리고 파이썬은 이 많은 기능이 한 군데 모여있지 않았다.
단순 암기에 취약한 나는 이것이 큰 단점으로 와닿았다.
물론 암기 문제만 있었다면, 시간이 해결해줄 문제라고 생각할 수도 있었다.
문제를 풀다보면 자연스럽게 외우게 될 테니까?
하지만, 두 번째 문제에 마주쳤을 때는 파이썬이라는 언어를 사용하는 것이 맞는지 진지하게 고민하게 됐다.
분명 C++을 잘 모른다고 생각했는데, 그래도 학교 공부는 열심히 한 탓인지 나는 생각보다 C++ 문법에 익숙해져 있었다.
참고로 우리 학과는 4년 내내 C++만 사용한다.
그리고 C++처럼 코딩하는 것이 너무 익숙해져 있던 건지, 파이썬이라는 언어로 코딩하면서 반복문을 돌릴 때 인덱스로 접근하고... 이런 일이 비일비재했다.
오히려 나에게 불편한 언어인 파이썬으로 코딩하면서 로직은 C++처럼 작성하는 일은...시간만 배로 드는 일이었다.
나중에 알았는데, C언어 사용자가 파이썬으로 넘어올 때 흔히 겪는 문제라고 한다.
그렇게 파이썬이라는 언어가 나에게는 불편한 언어일 수도 있겠다는 것과, 생각보다 내가 C++에 익숙해져 있다는 것을 깨닫고 C++으로의 언어 변경을 고민하던 중...
갑자기요?
라고 물어본다면 정말 갑자기가 맞다...^_^
당시 알고리즘 공부를 하고 싶어서 특강 신청을 했었는데, 언어 선택지가 자바와 C++밖에 없어서 당연히 C++로 신청했다가, 진짜 뽑혔다...
어쨌든 2주 동안 나는 꼼짝없이 C++로 알고리즘 문제를 풀어야 했고, 그 과정에서 생각지도 못한 C++의 장점을 알게 된다.
- 적어도 나에게는 문법 및 디버깅이 상당히 익숙하다.
- 당시 어렵게 느껴졌던 객체지향 개념은 알고리즘을 풀 때에는 필요가 없다.
- 어려운 문법인 포인터와 동적할당...이런 것도 필요가 없다.
- 생각보다 유용한 STL이 많다. 특히 'vector'와 'algorithm'만 있다면 우리는 무적 (이게 3의 이유가 되기도 한다.)
- 4와 이어지는 내용인데, 유용한 STL이 많은 반면, 파이썬처럼 외우기는 힘들지 않다. 대부분의 기능이 'algorithm'에 있기 때문...!
- 시간 측면에서 상당히 빠르다.
그렇게 나는 2주의 특강을 통해 코테 언어를 정하게 되고, 이후 코딩테스트 모두 C++으로 응시하게 된다.
요즘 새로 공부하고 있는 언어이다.
프로젝트를 할 때 백엔드 개발자와 협업하는 과정에서 백엔드에 관심이 생겼고, 자바는 C++과 비슷하다는 말을 익히 들어서 전부터 공부하고 싶다는 생각은 계속 했었는데, 눈 앞에 닥친 일들이 너무 급해서 계속 미뤄두고만 있었다...
그런데 좋은 기회를 통해 백엔드 수업을 듣게 되었고, 수업을 들으면서 동시에 김영한님의 자바와 스프링 강의를 들으면서 자바와 친해지고 있는 중이다.
내 생각보다 자바는 더 C++과 비슷한 언어이고, C++보다 더 객체지향에 미친 놈이라는...생각이 들었다.
그리고 객체지향...
예전 같았으면, 여기에서 포기를 했겠지만, 4년만에 다시 만난 객체지향은 생각보다 괜찮았다.
두번째여서 그런가 그럭저럭 잘 이해되고, 흥미까지 생기는... 신기한 경험을 했다.
그리고 자바 공부를 하면서 느끼는 것은, 내가 정처기를 공부하면서 봤던 대부분의 것들이 백엔드에서 직접 쓰이는 개념이라는 것이었다.
SOLID 원칙과 MVC 패턴 등등...프론트엔드 프로젝트 경험만 갖고 있을 때는 이게 도대체 무슨 뜬구름 잡는 소리인가 싶었는데, '이게 이거였구나'를 직접 가슴으로 느끼는 중이다.
여기서 그럼, 자바와 C++의 차이점을 한 번 짚고 넘어갈 필요가 있을 것 같다.
자바스크립트와의 비교는 의미가 없을 것 같다. 아마 이름만 비슷하고 모든 게 다르지 않을까...
- 범용성이 좋다.
- C++의 단점을 상당히 개선해냈다.
- C++보다 객체지향에 더 진심이다.
먼저 첫 번째,
많은 사람들이 알고 있듯이 자바는 백엔드 개발에 쓰이는 대표적인 언어이다. 그만큼 개발을 더 편리하게 할 수 있도록 도와주는 스프링이라는 프레임워크도 존재한다.
하지만 C++은...? 그런 거 없다ㅎㅎㅎ
아마 C++이 특화된 분야인 임베디드에 있어서는 자바보다 더 강점을 가질지도 모르지만, 적어도 내가 공부하는 웹 개발 분야에서는 C++과 비교한다는 것이 자바에게 미안할 정도이다.
C++으로 프로젝트를 한다는 말조차 들어본 적이 전무하다.
그리고 두 번째,
자바는 C++의 단점을 다음과 같이 개선해냈다.
먼저 메모리 누수...
매번 할당 해제를 안한다거나 소멸자를 호출하지 않는다는가...이런 문제로 메모리 누수를 일으켰던 나 같은 사람을 위해서 Garbage Collector (GC)가 등장했다.
그리고 운영체제에 종속적으로 작동하는 C++과 달리, 자바는 JVM이라는 가상 머신을 통해서 독립적으로 작동할 수 있다는 장점을 갖고 있다.
또한, 자바는 C++에 비해 문법이 상당히 쉬워졌다. 일단 포인터 같은 개념이 등장하지 않는다.
물론 이런 개념은 분명 알아야 하는 개념인 만큼, CS 공부를 하기에는 C/C++만한 언어가 없다고 생각한다.
하지만 그래도 어려운 개념인 것 만큼은 분명해서, 안쓰고 개발할 수 있다면 좋지 않을까...?
그런 면에서 자바는 정말 훌륭한 언어이다.
마지막 세 번째,
어쩌다보니 자바의 장점만 나열했는데, 순수하게 차이점을 언급하자면,
앞서 언급했듯이 자바는 C++보다 객체지향에 더 미친 놈...이다.
C++에서 사용하는 STL은 말 그대로 '라이브러리'라는 뜻으로, '템플릿을 활용한 자료구조와 알고리즘의 모음'을 뜻한다.
그런데 자바에서 사용하는 Collection API는 '객체 지향 특성에 맞춘 자료구조 인터페이스와 클래스의 모음'이라는 뜻이다.
여기에서 두 언어의 철학적인 면을 엿볼 수 있는데, C++은 템플릿을 통한 일반화 및 성능 최적화를 강조하고, 자바는 객체 지향 원칙을 강조함을 알 수 있다.
그리고 자바에는 C++에는 없는 인터페이스가 있다.
인터페이스란, 다른 클래스를 작성할 경우에 기본이 되는 틀을 제공하면서 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상클래스이다.
즉, 클래스를 작성하기 위한 '규약'이라고 볼 수 있다.
그런데 C++에는 이 인터페이스 개념이 없다.
그저 추상 클래스만 있을 뿐...
여기에서 자바가 C++보다 클래스, 객체지향 이런 개념에 더 진심이라고 볼 수 있다.
내 기준 정말 좋은 언어이다.
자바 덕분에 객체지향 개념과도 많이 친해졌다.
그래서 더 친해지고 싶고, 계속 공부해서 다음 프로젝트에서는 백엔드 개발자로서 참여해보려고 한다.
사실 빠르게 친해지고 싶어서 알고리즘 언어도 자바로 바꿀까 고민했으나, C++의 cin, cout 이라는 편리한 입출력과 import, 아니 include의 편리함을 포기할 수가 없어서 고민만...하는 중이다.
잊고 있을지도 모르지만, 이 글의 주제는 '나의 주력 언어'이다.
하지만 결론은 내릴 수가 없을 것 같다.
여전히 나는 주력 언어를 찾고 있는 중이고, 아래와 같은 물음표를 계속 나에게 던지고 있는 중이기 때문이다.
"나의 주력 언어란 뭘까?"