Go 언어(golang) 시작하기
최근, 회사에서 Go언어를 쓰게 되어서 간단하게 Go언어에 대해서 간단하게 포스팅 해보려합니다.
저도 많은 내용을 아는 것은 아니니 부족한 부분이 많을 것입니다.
이 글은 정리차원에서 적어두는 것이나, Go언어를 잘 모르시는 분, Go언어에 관심이 가는 분, 또는 Go언어를 배워보고 싶은 분들께 유익한 글이 되었으면 합니다.
Let’s Go
새로운 언어를 배울 때 가장 먼저 확인하는 hello world 입니다.
Go 놀이터에 가셔서 확인하실 수 있고, 웹상에서 테스트도 가능합니다.
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
}
위의 코드를 보면 Java처럼 현재 파일의 패키지를 설정하고 있고
import 로 사용할 패키지를 지정, main 함수가 기본 프로그램 엔트리 포인트입니다.
특이한 것이 main함수에 인자가 없습니다.
인자(ARGV)를 받기위해서는os package
를 import 해야합니다.
Go 언어 넌 누구니?
1. 컴파일 기반의 정적 타입 언어 (compiled language)
Go언어는 컴파일 기반의 정적 타입언어입니다.
이는 컴파일로 인해파이썬(Python)
이나루비(Ruby)
같은인터프리터(interpreter)
언어로 개발할 때보다 버그 요소가 많이 줄어듬을 의미합니다.
물론 컴파일언어의 특징인 빠른 속도 또한 당연합니다.
특히 Go언어의 컴파일러는 C언어에서의 warning (예를 들면, 사용하지 않는 변수나 패키지를 import했을시에 Go 컴파일러는 오류를 발생시킵니다.) 에 해당하는 문제들도 모두 error로 만듭니다.
- Go언어는 컴파일 언어지만,
C/C+
의 해더파일이 없어서 헤더파일이 조금만
수정되어도 모두 다시 컴파일하는 그런 문제가 없고, 소스코드를 패키지화하여 변경된 부분만 컴파일하기 때문에 컴파일 시간이 엄청나게 빠릅니다. -> How does Go compile so quickly?
2. 하지만 동적 언어 특성도 가진다 (예: interface -> Duck typing)
Go언어는
interface
가 있지만 따로 선언은 하지 않습니다. -> Duck Typing
선언이 없이 인터페이스의 함수를 구현하면 그 인터페이스를 사용한다고 간주합니다.
예를 들어notifier interface
가 정의되어 있습니다.
이notifier interface
는notify()
메소드를 가지고 있습니다.
- 특정
struct
에서notify()
메소드를 구현했다면,
이struct
는notifier interface
를 구현했다고 간주하는 것입니다.
3. 상속이 없다 (composition만 존재)
Go언어는 상속이 없습니다.
Go언어에서 일반적인 객체 지향 언어에서의class
의 역할을struct
가 맡고 있습니다.
Go의struct
는 상속이 되지 않습니다. 대신composition
이라는 것이 존재합니다.
composition
이란?
한 타입과 다른 타입을 결합해서 사용할 수 있게 해주는 것을 의미합니다.
이는 각 타입간의 결합도를 낮춰주는 효과가 있습니다.
일반적으로 상속을 사용해서 코딩을 하게 되면class
간의 관계가tree
형태로 만들어집니다.
따라서 상속을 계속 할수록 계층 구조가 점점 복잡해지고, 그 상황에서 여러가지 문제점이 발생할 수 있습니다.
`compositio“의 중요성 -> Prefer composition over inheritance?
4. 실행시 가비지 콜렉터 탑재 (Garbage Collection)
Go언어는 바이너리 빌드시 가비지 콜렉터를 내장합니다.
그래서C/C++
처럼 개발자가 메모리 할당 및 해제를 신경쓰지 않아도 됩니다.
또한,Java
처럼 가상머신이 필요하지도 않기 때문에,C/C++
처럼 빠른 성능을 기대할 수 있습니다.
5. 멀티코어 환경 지원 (goroutine, channel)
최근은 대부분의 컴퓨터가 멀티코어인 시대입니다.
이에 맞게 Go언어는 멀티코어 환경 지원을 위해 만들어진 언어입니다.
Go는Goroutine
이라는 논리적 쓰레드(Thread)를 기본적으로 제공합니다.
사용자는 멀티코어 및 쓰레드 사용에 대해 고민하지 않고,Goroutine
을 사용하면 Go 런타임이 알아서 현재 cpu의 코어에 맞춰서 동시에 코드를 실행해줍니다.
Thread를 만들고 실행하고 종료하고 하는 별도의 불편한 과정이 필요없습니다. 사용자는 손쉽게 멀티코어를 이용할 수 있습니다.
이후 포스팅은 다음 포스팅에 하겠습니다.