프로그래밍 언어/Go

Go: Hello, Go

이 블로그에 쓰는 첫 번째 Go 포스팅이다. 여기서는 Go 의 Hello, world 프로그램을 작성해보고 분석해보며, Go 의 몇 가지 특징도 함께 언급해보기로 하겠다. 보통 프로그래밍 진입할 때 바로 Go 로 하는 경우는 별로 없기에 프로그래밍 입문자를 위한 포스팅은 아니라고 볼 수 있다. 프로그래밍에 대해서 아무것도 모르는 상태에서 보기엔 어려울 수도 있으니 읽을 때 모르는 부분이 있다면 과감하게 넘기거나 검색을 해보자.

Hello, Go

Go 의 Hello, Go 코드는 다음과 같다. 이 코드만 보더라도 설명 해볼만한 것이 상당히 있다. 소스 파일의 hello.go 라고 가정했을 때, go run hello.go 를 통해 실행해보면 Hello, Go! 라는 문구가 콘솔에 출력될 것이다.

package main

import "fmt"

func main() {
	fmt.Println("Hello, Go!")
}

이제 위에 있는 코드를 하나하나 뜯어보도록 하자. 그저 프로그램의 실행 결과만 봐서는 아무런 의미가 없다. 코드가 의미하는 바를 명확히 이해하고 넘어가야만 언어를 이해할 수 있다.

;

Go 에서 세미콜론은 필요없다. Go 는 포맷팅 도구를 지원해주는데, 만약 세미콜론을 사용하게 되었을 때 go fmt 를 사용하게 되면 세미콜론을 날린다. 즉, 세미콜론을 안 쓰는게 권장이라는 이야기다. 그렇다고 세미콜론을 전혀 못 쓰는 것은 아니고, 선택적으로 사용할 수 있긴하다.

package main

Go 언어는 패키지라는 개념이 있다. 자바의 패키지와 비슷하다고 보면 될텐데, 패키지 내부에는 변수, 상수, 함수, 구조체, 메서드 등이 선언되어 있다. 모든 Go 파일은 패키지에 속해야 한다. main 패키지는 해당 코드가 실행할 수 있는 소스라는 것을 의미한다. main 패키지가 아닌 다른 패키지는 go run 명령어를 통해 실행시켜볼 수 없다. 만약 main 패키지가 아닌 코드를 실행시키려 하면 다음과 같은 에러를 던진다.

go run: cannot run non-main package

import "fmt"

import 키워드는 외부에 있는 다른 패키지를 포함하기 위해 사용한다. 포맷에 대한 함수가 정의되어 있는 fmt 패키지를 불러온다. 해당 패키지는 Go 언어에 있는 Built-In 패키지이며 이후 사용자 정의 패키지를 만들어볼 수도 있다. Go 의 패키지는 Go 의 설치경로에서 src 폴더에 모여있으며 pkg 폴더에는 그러한 패키지가 컴파일된 소스코드가 모여있다. 위와 같이 사용할 필요 없이 다른 형태로도 사용할 수 있다. 이는 다수의 외부 패키지를 포함할 때 사용하면 된다.

import (
	"fmt"
	"strings"
)

func main() { ... }

Go 프로그램이 시작되면 가장 먼저 호출되는 것main() 함수이다. C 나 자바에서도 이러한 특징은 찾아볼 수 있다. Go 에서 함수의 선언func 키워드를 사용하는 것을 볼 수 있는데, 이는 이후 함수에서도 살펴볼 예정이다. 지금은 그냥 가장 먼저 실행되는 함수라고 생각하면 좋을 것 같다.

fmt.Println("Hello, Go!")

이것은 현재 fmt 패키지에 속해있는 Println 이라는 함수를 호출하는 의미다. 해당 함수는 매개변수로 주어진 값을 콘솔에 출력한다. 함수에 대해 자세히 모른다면 생략하자. Go 가 다른 언어와 다른 점은, 외부 패키지에 있는 함수나 상수, 구조체에 접근할 때 그것들의 이름이 모두 대문자라는 것이다. Go 언어는 대소문자를 기반으로 캡슐화를 하는 등 다양하게 이용할 수 있다.

"Hello, Go!"

Go 는 C 처럼 문자에 대해 작은 따옴표와 큰 따옴표에 따라 사용이 다르다. 작은 따옴표는 문자 하나를 넣을 수 있으며 큰 따옴표는 문자열을 넣을 수 있다. 문자열은 다수의 바이트로 구성된 바이트 배열이며 작은 따옴표로 나타내는 문자 하나의 경우 Go 에서는 룬(Rune)이라고 표현하며 표준 유니코드 체계를 사용하므로 지구상에 존재하는 대부분의 문자를 표현할 수 있다. 문자열은 바이트 배열이므로 바이트 자료형의 배열과 서로 변환하기가 좋다.

package main

import "fmt"

func main() {
	message := []byte{'H', 'e', 'l', 'l', 'o', ',', ' ', 'G', 'o', '!'}
	fmt.Println(string(message)) // -> Hello, Go!
}

'프로그래밍 언어 > Go' 카테고리의 다른 글

Go: 반복문 (for, range)  (0) 2020.11.25
Go: 조건문 (if, switch)  (0) 2020.11.25
Go: 패키지(package, import)  (0) 2020.11.23
Go: 함수 (func)  (0) 2020.11.21
Go: 변수와 상수 (var, const)  (0) 2020.11.19
Go: Hello, Go  (0) 2020.11.17