Golang 특징

특징

1. 정적 컴파일 언어

JVM을 이용하는 Java와 같이 Runtime에 환경에 맞는 기계어로 번역을 하는 동적 컴파일 언어가 아닌 c나 c++와 같이 한번 compile을 통해 특정환경에 맞는 실행파일을 만들어내는 정적 컴파일 언어이다.

정적 컴파일 언어는 환경(Os, CPU종류)들이 다양해지면서 NxM개의 수만큼 많은 번역기가 존재했어야 하는 단점이 존재해 동적 컴파일 언어가 많은 인기였지만, 정적 컴파일 언어보다는 비교적 속도가 떨어지고 환경이 과거에 비해 비교적 고착화 되어감에 따라 다시 빠른 성능을 보여주는 정적 컴파일언어 형태로 GO가 만들어졌다.

또한, 환경에 맞게 다른 코드를 짜는 것처럼 번거로웠던 단점을 고쳐 Go는 OS에 맞는 환경변수를 바꿔주기만 하면 쉽게 다른 환경의 프로그램으로 build가 가능하다.

  • go build : 현재 운영체제(GOOS환경변수)에 맞는 실행 파일 build
  • go env : Go의 환경변수목록을 보여주는 명령어
    • GOOS : build할 운영체제


◾ window -> linux

$Env:GOOS = "linux" go build

powerShell의 $Env 명령어로 GOOS를 linux로 바꿔주면 linux실행파일로 build가 된다.

◾ linux -> window

GOOS="windows" go build


2. 강타입 언어

타입이 다른 연산을 해도 자동으로 형변환을 해서 연산을 수행하는 약타입 언어가 아닌 GO는 무조건 타입이 같아야 하는 최강타입 언어 이다.

강타입 언어이기 때문에 제네릭도 존재하지 않는데 이것이 현재 뜨거운 논란 주제라고 한다.


3. GarbageCollector 존재

정적 타입언어임에도 c,c++과 같이 GC가 없는 것이 아닌 Java와 같이 GC가 존재한다.

메모리를 지우는데 1ms미만의 시간이 걸리는 빠른 GC를 가지고 있다.


4. 클래스 x, 상속 x, 메서드 o, 인터페이스 o

기본적으로 class가 없고 class가 없기 때문에 상속도 없다. 상속과 클래스가 없다고 GO는 OOP가 안된다라는 말이 있는데 이는 나는 개인적으로 틀린 생각이다.

클래스가 없는 대신 c와 비슷한 struct를 이용해 클래스와 같이 사용할 수 있고 상속은 오히려 결합도를 높이기도 하고 많은 문제를 갖을 수 있어 상속이 없다고 OOP가 아닌 것은 아니다.


C처럼 struct은 필드밖에 가지지 못하지만 함수앞에 특별한 인자로 구조체에 함수를 할당하는 식으로 메서드를 갖을 수 있어 이것이 클래스 기능을 수행하고 상속은 없지만 인터페이스는 존재한다.


5. 익명 함수

Js의 익명함수와 같이 go도 익명함수를 제공한다.


6. 동시성 지원

GoRutine이라고 부르는 go 함수와 같이 go키워드를 통해 쉽게 동시성(스레드)를 지원하고 Native(OS) 스레드에 매칭되는 Java의 스레드와 달리 Go런타임이 스레드를 관리하며 Multiplexing을 이용해 훨씬 적은 os쓰레드를 사용하고 스택의 사이즈도 매우 작으며 필요시에 동적으로 증가한다.

또한, go채널(chan)을 이용해 go루틴간의 통신을 제공하고, runtime.GOMAXPROCS()를 이용하면 병렬 처리도 할 수 있게 제공한다. GO는 기본적으로 CPU 1개를 사용하나 이 명령어를 이용하면 다수의 CPU를 이용할 수 있다.


In programming, concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations. Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.
- golang.org -

이때 동시성을 위한 go루틴과 병렬성을 위한 runtime.GOMAXPROCS()는 엄연히 개념이 다르고 golang공식 문서에서는 위와 같이 말하고 있다.

동시성은 독립적으로 실행되는 프로세스 구성이고 병렬성은 한가지나 특정 목적을 위한 계산을 동시에 여러군데에서 실행하는 것. 한마디로, 동시성은 많은 작업들을 동시에 처리하는 것이고 병렬성은 많은 것들을 여러개가 동시에 하는 것


7. 패키지 관리

npm이나 maven, gradle…와 같은 패키지 관리를 go에서도 지원하고 있는데 go get이나 go install로 패키지를 설치 할 수 있고 import명령어로 패키지를 사용할 수 있다.

또한 네임스페이스는 존재하지 않고 모든 코드는 패키지 단위로 분리한다.





Reference

Tucker의 Go 강좌