Golang은 빠른 성능, 안정성, 편의성, 쉬운 프로그래밍을 목표로 개발되었고 시스템 프로그래밍부터 웹 어플리케이션 개발까지 여러 분야에서 여러 용도로 사용된다.
- 간결하고 유연한 문법
- 병행 프로그래밍
- 정적 타입 언어
- 동적 프로그래밍
- 쉬운 협업
- 가비지 컬렉션(Garbage Collection) 제공
- 빠른 컴파일과 실행 속도
- 언어의 기능이 많고 복잡하면 문제를 해결하는 것보다 기능을 이해하고 익히는 것에 더 많은 시간을 할애해야 한다.
- 따라서 Golang은 간결하고 명확한 문법에 중점을 두고 설계됐다. 그래서 코드가 단순해졌고 가독성이 높아졌다.
- Golang을 사용하면 기억하기 쉬운 키워드 몇몇만으로도 규모가 큰 어플리케이션을 구현할 수 있다.
- 지난 30여 년간 CPU의 성능이 무어의 법칙대로 18개월마다 2배씩 빨라졌다.
- 하지만 한계에 부딪힌 후, 컴퓨터 하나에 CPU 여러 개를 장착해서 CPU 여러 개가 동시에 계산을 수행하게 된다.
- 따라서 소프트웨어도 이러한 멀티 코어 전략에 영향을 받아 병행 또는 병렬 처리를 지원하는 것이 필수 조건이 되었다.
- 따라서 Golang을 설계할 때 특별히 중점을 둔 부분이 바로 병행 처리이다.
- Golang의 병행 처리 방식은 통신 순차 프로세스(Communicating Sequential Processes, CSP) 방식에 근간을 둠.
- 즉, 메모리를 공유하는 것이 아니라 메세지를 전달하는 방식으로 동기화한다.
- 동시에 처리해야 하는 작업은 고루틴으로 실행하고, 고루틴끼리 메세지를 주고 받는 작업은 채널이라는 통로를 사용한다.
- 고루틴은 Golang 프로그램 안에서 동시에 독립적으로 실행되는 흐름의 단위로, 스레드와 비슷한 개념이다.
- 하지만 스레드와 달리 매우 적은 리소스에서 동작하므로 한 프로세스에 수천, 수만 개의 고루틴을 동작시킬 수 있다.
- 위의 사진과 같이 언어는 동적 타입과 정적 타입으로 나눠져있다.
- rudy, python과 같은 동적 타입 언어는 개발 속도가 빠르지만 컴파일 과정이 불안전하다는 특징을 가지고 있다.
- 반면에, c/c++과 같은 정적 타입 언어는 컴파일은 매우 안정적이지만 개발 속도는 느려진다는 특징을 가지고 있다.
- 따라서 Golang 언어는 동적 언어의 개발 속도와 정적 언어의 안정성, 두 장점을 모두 수용하고 있다.
동적 언어의 개발 속도와 정적 언어의 안정성을 갖춘 Golang
- Golang은 컴파일 기반의 정적 타입 언어이다.
- 하지만 동적 언어의 특성도 수용함으로써 동적 언어의 유연함과 자유를 만끽할 수 있다.
- 이를 가능하게 해주는 것이 바로 덕 타이핑(duck typing)방식으로 동작하는 Golang의 인터페이스다.
- C나 C++ 같은 언어는 가비지 컬렉션을 제공하지 않아서 개발자가 직접 메모리를 관리해야 한다.
- 하지만 이러한 메모리 할당하고 해제하는 작업은 까다롭고 디버깅도 어려워서 많은 시간을 할애해야 한다.
- 하지만 Golang 언어는 가비지 컬렉션을 제공하므로 메모리 관리보다 문제 해결에 더 집중할 수 있다.
- 2003년 켄트벡이 TDD(Test Driven Development) 를 주장한 이후 TDD의 중요성은 계속 강조되고 있다.
- TDD는 '테스트 코드 작성(red) > 코드 완성으로 테스트 성공(green) > 리펙토링(refactor)' 사이클로 개발된다.
- 이러한 TDD는 코드가 수정될 때 마다 수정된 코드를 컴파일 하고 실행하는 것을 전제로 한다.
- 따라서 프로그램 규모가 커질 수록 컴파일 과정이 전체 사이클을 느리게 한다.
- 하지만 Golang은 빠른 성능을 목표로 개발됐고 개발 초기부터 빠른 실행 속도에 초점을 두었다.
- 따라서 Golang은 패키지화된 소스 코드에서 실제도 사용되는 부분만 컴파일하므로 컴파일 속도가 빠르다.
- 이렇게 최적화된 컴파일 방식이라 아무리 큰 규모의 프로젝트라도 대부분 수 초 이내 컴파일이 완료된다.