개인적으로 공부할 언어를 선택할 때 몇 가지 기준이 있다.
JAVASCRIPT를 사용하면서 이 부분에 있어 스트레스를 많이 받았다. 타입이 강제되지 않고 동적으로 정해진다는 것은 자유로움과 더불어 언제나 내 코드가 런타임 시에 에러를 터뜨릴 수도 있다는 불안감에 휩쓸리게 한다. 내가 자바의 장황한 문법과 거추장스러운 제약을 싫어하면서도 애정을 느끼는 것은, 적어도 자바는 이런 부분에 있어서 걱정을 훨씬 덜 하게 된다는 점이다. 또한 타입이 정적으로 지정됨으로 인해서, 여러가지 에디터나 컴파일러의 도움도 많이 받을 수 있게 된다. Go는 정적 타입 언어이므로 이 부분에 대해서 걱정을 덜 해도 될 것 같다. 또한 코틀린처럼 타입 추론이 가능하기 때문에, 귀찮은 부분도 생각보다 덜할 것으로 예상된다.
인터프리터 언어 대비 컴파일 언어를 쓰면서, 가장 좋다고 느꼈던 것은 성능 오버헤드를 떠나서, 컴파일러와 연동되는 IDE의 강력한 자동완성기능 및 디버깅 환경과 코드의 순서를 비교적 덜 신경써도 된다는 점이었다. (자바는 완전한 컴파일 언어는 아니지만 어쨌든 별도의 컴파일 단계가 있으므로 컴파일 언어라고 불러도 된다고 생각한다. 태클 ㄴㄴ) Go도 이러한 조건에 충족된다.
C, C++ 을 배우면서 가장 골치가 아팠던 점이 바로 무심코 지나쳐버린 메모리의 해제였다. GC를 지원해주는 언어를 쓴 적이 오래된 이제 나는 더 이상 언매니지드 언어로 돌아갈 수 없는 지경에 이르렀다. Go도 다행히 GC를 지원하다 ㅎ. 실행파일 내에서 이미 탑재되어있다.
아무리 좋은 언어이고 힙한 언어라 하더라도, 생태계가 작으면 아무 의미없다. 관련 래퍼런스, 라이브러리, 프레임워크 모듈 등 구글링하기 쉽고, 갖다쓰기 쉬운 환경이어야 한다. 솔직히 한국에서 Go가 그만한 입지는 없는 것 같지만, 세계적인 추이를 봤을 때, 결코 작은 규모는 아닌 것 같다. 배울만한 가치는 충분히 있는 것 같다.
사실 안 배워서 잘 모르겠는데.. 사람들이 배우기 쉽다고 하니까.
Go는 바이너리 컴파일러로 서로 다른 머신 플랫폼들을 타겟으로 배포해야 할 경우 환경변수를 그에 맞게 설정한 후 컴파일해서 배포판을 만들어야 한다. 플랫폼에 독립적..이라고 말하기는 힘들겠지만, 이 설정하는 부분이 굉장히 쉽다고 한다. 특히 자바처럼 따로 가상머신을 설치해주고, 그 위에 돌아가지 않아도 된다는 점이 상당히 매력적이다.
고루틴이라는 걸 사용하면 병렬실행을 할 때, 동시성 관련된 이슈를 신경 안쓰고 병렬처리를 굉장히 쉽고 빠르게 해결할 수 있다고 한다. 뭐 어떤 식으로 돌아가는지는 모르겠지만, 듣기만 해도 기분이 좋다 ㅎ
매니지드 언어를 사용할 때, 정말 아주 가끔 언매니지드 언어가 그리워질 때가 있다. 고는 저수준에 가까운 제어를 허용해준다. 하지만 메모리 주소를 직접 대입하거나 포인터 연산을 허용하지 않고, GC가 존재하기 때문에 보다 안전한 코딩이 가능하다.
자바 / 코틀린을 주로 쓰는 개발자로서 아무래도 내가 만든 서버 규모가 커지면 커질수록 뭔가 빌드시간도 길어지고, 실행파일 용량도 커지고 이것저것 무거워진다는 느낌이 있는데, Go가 이 부분을 해소해줄지도 모른다는 기대감이 든다.
객체지향 언어에 익숙하다 보니 클래스 단위로 모듈을 설계하는 게 익숙하는데, 이 부분에 있어서, 문법적으로 지원해주는 게 적다고 한다. 물론 찾아보니 인터페이스도 있고 위임도 있고, 다형성을 사용하거나 이런 부분은 문제가 없을 것 같은데, JPA와 같은 ORM을 사용할 때, 객체 단위로 잘 매핑해서 쓸 수 있나하는 걱정이 든다. 물론 실제 공부를 안 해 봤기 때문에 해봐야 안다.
다 if문으로 처리해야 한다고 들었다. 솔직히 이거는 추가하는 게 맞지 않나?
예를 들어 named arguments라던가 default parameters라든가. Nuallable Type의 구분이라든가, 기타 여러가지 문법설탕이 존재하지 않고, 대충 봤을 때 상당히 원시적? 이라는 느낌이 있다. 성능상 오버헤드 때문에 안 넣은 건지는 모르겠지만
일단 모르겠고 해보면 장단점을 알 수 있겠지!