[GO 언어 기초] 패키지를 알아보자! ❶ 패키지 사용하기

이 글은 [Must Have Tucker의 Go 언어 프로그래밍(세종도서 선정작)]에서 발췌했습니다.
골든래빗 출판사

 

패키지는 코드를 묶는 가장 큰 단위입니다. Go로 만든 모든 프로그램은 패키지들을 묶어서 만들게 됩니다. 패키지는 함수, 구조체, 상수를 외부로 노출시킬 수 있습니다.

패키지를 이용해서 연관된 코드를 묶어서 배포할 수 있습니다. 예를 들어 수학과 관련된 기능들은 math 패키지로 배포되고, 인터넷 웹 프로토콜과 연관된 기능들은 http 패키지로 배포됩니다.

본 글에서는 패키지에 대해서 알아봅시다. 총 2편으로 구성했습니다. 1편에서는 패키지의 정의와 사용하기입니다.

 

패키지

패키지(package)란 Go 언어에서 코드를 묶는 가장 큰 단위*입니다.

 

 

*다른 언어에서는 네임스페이스(namespace)라는 키워드를 사용해서 코드 영역을 분리하기도 하지만, Go 언어에서는 다른 언어와 같은 네 임스페이스를 지원하지 않고 패키지를 사용합니다.

 

함수로 코드 블록을, 구조체로 데이터를, 패키지로 함수와 구조체와 그외 코드를 묶습니다. main 패키지는 특별한 패키지로 프로그램 시작점을 포함한 패키지입니다. 프로그램은 main 패키지(필수 요소) 하나와 여러 외부 패키지( 선택 요소)로 구성됩니다.

 

main 패키지

main 패키지는 특별한 패키지로 프로그램 시작점을 포함한 패키지입니다. 프로그램 시작점이란 main() 함수를 의미합니다. 프로그램이 실행되면 (대부분) 운영체제는 프로그램을 메모리로 올립니다. 이것을 로드(Load)라고 합니다. 그런 다음 프로그램 시작점부터 한 줄씩 코드를 실행합니다. 바로 이 프로그램 시작점이 main( ) 함수이고, main( ) 함수를 포함한 패키지가 main 패키지입니다.

 

그외 패키지

한 프로그램은 main 패키지 외에 다수의 다른 패키지를 포함할 수 있습니다. 예를 들어 게임에 그래픽, 사운드, 네트워크, AI 기능들을 제공한다고 해봅시다. 이런 기능을 처음부터 끝까지 모두 만들어야 한다면 시간과 비용이 엄청나게 들 겁니다. 그런데 각 기능을 제공하는 패지키가 있다면 그저 가져다 쓰면 됩니다(유료라면 돈을 지불하고).

표준 입출력은 fmt 패키지를, 암호화 기능은 crypto 패키지를, 네트워크 기능은 net 패키지를 임포트해(import) 사용하면 됩니다. 이미 세상에는 수많은 패키지가 제공되므로 프로그램을 만들 때는 원하는 기능을 제공하는 패키지를 먼저 찾아보는 습관이 들이는 것이 좋습니다.

 

유용한 패키지 찾기

모든 걸 처음부터 혼자 코딩할 필요는 없습니다. 여러분이 생각하는 대부분의 기능들은 이미 패키지로 배포되고 있습니다. 시간이 곧 돈이고 기회입니다. 레고를 조립하듯 필요한 기능을 담은 패키지를 조합해서 빠르게 원하는 서비스를 구현하는 것이 최선의 길입니다.

새로 만들기 전에 먼저 표준 패키지에서 같은 기능을 제공하는지 찾아봐야 합니다.

https://golang.org/pkg/

위 링크를 통해서 표준 패키지 목록을 확인할 수 있습니다. 만약 표준 패키지에서 제공하지 않는 기능이라면 공개된 외부 패키지에서 원하는 기능을 제공하는지 찾아보시는 게 좋습니다. Go 언어에서 많이 사용되는 패키지를 ‘Awesome Go’에서 찾아보세요.

https://github.com/avelino/awesome-go

카테고리별로 프로그래머들이 많이 사용되는 패키지들을 찾아보실 수 있습니다.

 

패키지 사용하기

패키지를 사용하려면 import 예약어로 임포트를 하고 원하는 패키지 경로를 따옴표로 묶어서 써줍니다. 다른 패키지를 가져오면 해당 패키지에서 외부로 노출하는 함수, 구조체, 변수, 상수 등을 사용할 수 있습니다. 외부 노출 여부는 변수명, 함수명, 구조체명의 첫 글자가 대문자인지 소문자인지로 구분합니다. 대문자로 시작하면 노출되고, 소문자로 시작하면 노출되지 않습니다. 패키지명은 가져오는 패키지 경로의 가장 마지막 폴더명입니다.

 

임포트하기

import 뒤에 패키지명을 큰따옴표로 묶어서 적으면 됩니다.

 

import "fmt"

 

소괄호로 패키지들을 묶어 여러 패키지를 임포트시킬 수 있습니다.

 

import (
  "fmt"
"os"
)

 

패키지 멤버에 접근하기

패키지를 가져오면 해당 패키지명을 쓰고 점 . 연산자를 사용해 패키지에서 제공하는 함수, 구조체 등에 접근할 수 있습니다.

이제는 너무나 익숙한 fmt 패키지에서 제공하는 Println( ) 함수 사용법을 살펴볼까요?

 

fmt.Println("Hello World")

 

위와 같이 fmt 패키지명을 쓰고 점 .을 찍어서 패키지 내부의 함수를 호출하면 됩니다.

 

경로가 있는 패키지 사용하기

경로가 있는 패키지를 사용하는 방법도 알아봅시다.

 

//ch16/ex16.1/ex16.1.go
package main

import ( // ❶ 둘 이상의 패키지는 소괄호로 묶어줍니다.
	"fmt"
	"math/rand" // ❷ 패키지명은 rand입니다.
)

func main() {
	fmt.Println(rand.Int()) // ❸ 랜덤한 숫자값을 출력합니다.
}

5577006791947779410

 

❶ 소괄호로 묶어 fmt와 math/rand 패키지를 가져왔습니다. ❷ 경로가 있는 패키지에 접근할 때는 마지막 폴더명인 rand만 사용합니다. ❸ rand 패키지에서 제공하는 Int( ) 함수를 사용하고 있습니다. rand 패키지의 Int( ) 함수를 호출하면 랜덤한 int 타입 정수를 반환합니다.

 

겹치는 패키지 문제 별칭으로 풀기

만약 패키지명이 겹치면 어떻게 할까요? 그럴 땐 별칭(aliasing)을 줘서 구별해줍니다.

 

import (
    "text/template" // template 패키지
    "html/template" // 역시 같은 이름의 template 패키지
)

 

마지막 폴더명이 같아 결국 패키지명이 같습니다. 별칭을 붙여줘 해결해봅시다. 별칭은 패키지 명 앞에 쓰면 됩니다.

 

import (
   "text/template" // template 패키지
   htemplate "html/template" // 별칭 htemplate
)

 

이제 “html/template” 패키지는 htemplate 이름으로 사용할 수 있습니다.

 

template.New("foo").Parse(`{{define "T"}}Hello`) // ❶
htemplate.New("foo").Parse(`{{define "T"}}Hello`) // ❷

 

❶ 은 “text/template” 패키지의 함수를 호출하고 ❷ 는 “html/template” 패키지의 함수를 호출합니다.

 

사용하지 않는 패키지 포함하기

패키지를 가져오면 반드시 사용해야 합니다. 패키지를 임포트하고 나서 사용하지 않으면 에러가 발생합니다. 패키지를 직접 사용하지 않지만 부가효과를 얻고자 임포트하는 경우에는 밑줄 _을 패키지명 앞에 붙여주면 됩니다.

 

import (
    "database/sql"
    _ "github.com/mattn/go-sqlite3"   // 밑줄 _을 이용해서 오류 방지
)

 

github.com/mattn/go-sqlite3” 패키지를 가져왔지만 이 패키지를 직접 사용하지 않고 “database/sql” 패키지에 sqlite3를 사용하겠다는 부가효과3를 얻고자 가져왔기 때문에 앞에 밑줄 _을 써서 사용하지 않는 패키지라는 오류를 방지했습니다.

 

패키지 설치하기

import로 패키지를 포함시키면 go build를 통해서 빌드할 때 해당하는 패키지를 찾아서 포함한 다음 실행 파일을 생성합니다. 그럼 Go는 import된 패키지를 어떻게 찾을까요? 세 가지 방법으로 패키지를 찾습니다.

  1. Go 언어에서 기본 제공하는 패키지는 Go 설치 경로에서 찾습니다. Go를 설치할 때 Go언어에서 제공하는 기본 패키지들까지 같이 설치됩니다. 그래서 기본 패키지들은 Go 설치 경로에 포함되어 있습니다.
  2. 깃허브와 같은 외부 저장소에 저장된 패키지의 경우 외부 저장소에서 다운받아서 GOPATH\pkg 폴더에 설치합니다. 이때 Go 모듈에 정의된 패키지 버전에 맞게 다운로드 하게 됩니다.
  3. 현재 모듈 아래 위치한 패키지인지 검사합니다. 현재 모듈 아래 위치한 패키지는 현재 폴더 아래 있는 패키지를 찾습니다.

 

2편에서는 ‘GO 모듈’과 ‘패키지명/패키지 외부 공개’에 대해 알아봅시다.

WRITER

공봉식

13년 차 게임 서버 프로그래머로 다양한 장르의 온라인 게임을 개발했습니다. 넥슨과 네오위즈를 거쳐서 현재는 EA 캐나다에서 근무 중입니다. 「Tucker Programming」 유튜브 채널을 운영합니다.

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내