Post

14. 패키지

14. 패키지

✅ 1. 패키지

  • Go 언어에서 코드를 묶는 가장 큰 단위
  • 프로그램은 하나의 main 패캐지(필수 요소)와 여러 외부 패키지(선택 요소)로 구성된다

1.1 메인 패키지

  • 특별한 패키지로, 프로그램 시작점을 포함하는 패키지다
  • 프로그램이 실행되면 운영체제는 프로그램을 메모리에 로드하고 프로그램 시작점부터 한 줄씩 코드를 실행하는데, 이 프로그램 시작점이 main()함수이며 main() 함수를 포함하는 패키지가 main 패키지다

1.2 유용한 패키지 찾기

✅ 2. 패키지 사용하기

1
2
3
4
5
6
7
8
import (
	"fmt"
	"math/rand"
)

func main() {
	fmt.Println(rand.Int())
}
  • import 뒤에 패키지명을 큰따옴표로 표시한다
  • 소괄호로 묶어 여러 패키지를 임포트할 수 있다
  • 패키지명 + .으로 패키지에서 제공하는 함수, 구조체 등에 접근할 수 있다
  • 경로가 있는 패키지는 마지막 폴더명으로 접근한다
1
2
3
4
5
6
import (
	htemplate "html/template"
	"text/template"
	
	_ "github.com/mattn/go-sqlite3"
)
  • 패키지명이 겹치면 별칭(aliasing)을 줘서 구분한다
  • 직접 사용하지 않는 패키지는 밑줄 _를 써서 오류를 방지한다

2.1 패키지 설치하기

  • import로 패키지를 포함시키면 go build를 통해서 빌드할 때 해당하는 패키지를 찾아서 포함한 다음 실행 파일을 생성한다
  • Go는 아래와 같은 방법으로 import된 패키지를 찾는다
    1. Go 언어에서 기본으로 제공하는 패키지는 Go 설치 경로(GOROOT)에서 찾는다. Go를 설치할 때 Go 언어에서 제공하는 기본 패키지까지 같이 설치된다
    2. 깃허브와 같은 외부 저장소에 저장된 패키지는 외부 저장소에서 다운받아 GOPATH/pkg 폴더에 설치한다. GO 모듈에 정의된 패키지 버전에 맞게 다운로드된다
    3. 현재 모듈 아래에 위치한 패키지라면 현재 폴더 아래에 있는 패키지를 찾는다

✅ 3. GO 모듈

  • Go 모듈은 Go 패키지를 모아놓은 Go 프로젝트 단위로, Go 1.16 버전부터 Go 모듈 사용이 기본이 되었다
  • 따라서 모든 Go 코드는 Go 모듈 아래에 있어야 한다
  • Go 모듈은 go mod init 명령을 통해 만들 수 있다
1
2
go mod init [모듈명]
go mod tidy
  • go mod tidy 명령은 Go 모듈에 필요한 패키지를 찾아서 다운로드하고 필요한 패키지 정보를 go.mod 파일과 go.sum 파일에 적어준다
1
2
3
4
➜  gotudy go mod tidy
go: finding module for package github.com/mattn/go-sqlite3
go: downloading github.com/mattn/go-sqlite3 v1.14.31
go: found github.com/mattn/go-sqlite3 in github.com/mattn/go-sqlite3 v1.14.31
  • 다운받은 외부 패키지는 GOPATH/pkg/mod 폴더에 버전별로 저장되며 한 번 다운받은 패키지는 다른 모듈에서 사용하더라도 같은 버전이라면 다시 다운받지 않고 사용한다

✅ 4. 패키지 외부 공개

  • 대문자로 시작하는 패키지 전역 상수, 구조체, 메소드 등은 패키지 외부에 공개된다
  • 공개되는 구조체더라도 소문자로 시작하는 내부 필드, 메소드 등은 공개되지 않는다

✅ 5. 패키지 초기화

init() 함수는 반드시 입력 매개변수가 없고 반환값이 없어야 한다

  • 패키지를 임포트하면 컴파일러는 패키지 내 전역 변수를 초기화한다
  • init() 함수가 있다면 호출되어 패키지를 초기화한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var (
	a int
	b int
)

func main() {
	fmt.Printf("a = %d\n", a)
	fmt.Printf("b = %v\n", b)
}

func init() {
	a++
	fmt.Println("Init Function !!!")
}

// Init Function !!!
// a = 1
// b = 0

// 1. a, b 전역변수가 0으로 초기화 된다
// 2. `init()` 함수가 실행되어 a값이 증가하고 메시지를 출력한다

💡 init()은 .go 파일 하나에도 여러 개 있을 수 있으며, 같은 패키지에도 여러 init()이 가능하다

  • 실행 순서
    1. 패키지 단위로 import된 순서에 따라 init() 호출
    2. 패키지 내에서는 컴파일러가 정한 순서(보통 파일 알파벳 순)에 따라 호출
    3. 각 파일 내에서는 코드를 작성한 순서에 따라 호출
This post is licensed under CC BY 4.0 by the author.