10.3. 프로그램언어 고(Go)의 패키지 구조 이해하기

프로그램언어 고(Go)에서의 패키지 구조 기본 개념

프로그램언어 고(Go)에서 패키지는 함수, 변수, 상수, 타입 등을 그룹화하고 구조화하는 데 사용합니다.

패키지는 다음과 같은 기본 개념과 구조를 가지고 있습니다.

import "패키지경로"

import 키워드를 사용하여 패키지를 가져옵니다. 패키지 경로를 지정합니다.

package main

import (
    "fmt"
    "math"
)

여러 패키지를 동시에 가져올 수 있습니다.

func 패키지.함수()

패키지에 속한 함수를 사용할 때는 패키지.함수() 형태로 사용합니다.

var 패키지.변수

패키지에 속한 변수도 위와 같은 형태로 사용합니다.

패키지 내보내기/가져오기

package 패키지명

import "패키지명/실제패키지경로"

func 함수() {}

var 변수 int

패키지 안에서 정의한 함수와 변수를 내보낼 수 있습니다.

import (
    "패키지경로/패키지명"
    패키지별칭 "패키지경로/패키지명"
)

다른 패키지에서 이를 가져와 사용할 수 있습니다. 별칭도 지정할 수 있습니다.

이 외에도 패키지 개념은 GO언어의 모듈(module)과 연관이 있으며, GO모듈을 사용하여 대규모 프로젝트를 효과적으로 관리할 수 있습니다.

프로그램언어 고(Go)에서의 패키지 내부 구조와 요소 이해하기

프로그램언어 고(Go)에서 패키지는 프로그램을 구성하는 기본 단위입니다. 패키지에는 일반적으로 다음과 같은 구성 요소들이 들어있습니다.

mypackage/
    doc.go       // 패키지 문서 주석
    mypkg.go     // 패키지 소스 코드
    subpkg1/     // 서브 패키지들
        doc.go
        sp1.go
    subpkg2/
        doc.go
        sp2.go

위의 예에서 mypackage는 루트 패키지이고, subpkg1과 subpkg2는 서브 패키지입니다.

각 패키지에는 보통 다음과 같은 요소들이 들어있습니다.

– doc.go : 패키지에 대한 문서와 설명을 작성하는 주석 파일
– *.go : 패키지의 구현 소스 코드 파일들
– 서브 디렉터리 : 서브 패키지들을 위한 디렉터리

패키지 내의 주요 구성 요소를 좀 더 자세히 살펴보겠습니다.

우선 패키지 문서 주석인 doc.go 파일에는 패키지의 기능, 사용법 등을 설명하는 주석을 담습니다. 이를 통해 다른 개발자가 패키지를 이해하고 사용하는데 도움을 줍니다.

// Package mypackage provides useful utility functions.
package mypackage

// AuthToken represents an authentication token
type AuthToken struct {
    Token string
}

// GenerateAuthToken creates a new authentication token
func GenerateAuthToken() (*AuthToken, error) {
    // implementation
} 

위의 예에서 보는 것처럼 패키지 doc.go에 기본적인 패키지 사용법과 주요 타입, 함수에 대한 간략한 설명을 제공합니다.

그 다음으로 패키지의 구현 소스 코드를 담은 *.go 파일들이 있습니다. 여기에는 실제로 패키지에서 제공하는 함수, 메서드, 타입들이 정의되어 있습니다.

마지막으로 하나의 큰 패키지를 서브 패키지로 나누기도 합니다. 예를 들어 mypackage 아래에 subpkg1, subpkg2와 같이 관련 기능별로 서브 패키지를 정의할 수 있습니다.

이처럼 고(Go)의 패키지는 일반적으로 문서, 소스코드, 서브 패키지로 구성되어 있으며 서로 밀접한 연관이 있는 기능들을 논리적으로 그룹화하고 구조화하는 데 사용합니다.

프로그램언어 고(Go)에서의 패키지 내 Namespace의 이해

Go언어의 패키지 내 네임스페이스에 대한 이해를 돕기 위해 아래 예제를 사용하여 설명드리겠습니다.

Go언어에서 패키지는 기능별로 소스 코드를 구성할 수 있도록 도와주는 기능입니다. 예를 들어 동일한 이름의 함수나 구조체가 서로 충돌하지 않고 구분할 수 있도록 하는 것입니다.

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(math.Pi)
}

위 예제에서 보다시피 math 패키지를 import하여 Pi 상수를 사용할 수 있습니다.

패키지 내에 선언된 이름(함수, 변수, 상수 등)은 해당 패키지의 네임스페이스에 속합니다. 즉 패키지가 하나의 네임스페이스를 제공한다고 볼 수 있습니다.

다른 패키지에서 동일한 이름을 사용하더라도 서로 구분됩니다. 예를 들어 다른 패키지에서 Pi라는 이름의 변수를 선언하더라도 math 패키지의 Pi 상수와 이름 충돌이 일어나지 않습니다.

이러한 네임스페이스 구분은 ‘.'(점)을 사용하여 패키지 이름을 함께 사용함으로써 가능합니다.

math.Pi 와 같이 패키지 이름과 함께 사용하기 때문에 서로 구분할 수 있는 것입니다.

이처럼 Go의 패키지는 기능 별로 코드를 구성하는 동시에 네임스페이스를 제공하여 이름 충돌을 방지하는 역할을 합니다.

패키지의 의미 있는 사용은 Go 프로그램을 구성하는 데 매우 중요합니다.

위 예제와 설명이 Go언어의 패키지와 네임스페이스에 대한 이해에 도움이 되었기를 바랍니다.

프로그램언어 고(Go)에서의 패키지의 Import Path 이해하기

프로그램언어 고(Go)에서 패키지 import path는 모듈 시스템의 기반이 되는 매우 중요한 개념입니다. import path는 패키지를 식별하고 찾아올 수 있게 해주는 고유한 문자열입니다.

예를 들어, 다음과 같은 import 문이 있다고 가정해 보겠습니다.

import "fmt"
import "math/rand" 

여기서 “fmt”와 “math/rand”가 바로 import path입니다. 이 경로를 통해 Go 컴파일러는 해당 패키지를 찾아올 수 있습니다.

import path의 규칙은 다음과 같습니다.

– 보통 도메인 주소를 거꾸로 쓴 것을 사용합니다. 예) github.com/user/project
– 표준 라이브러리의 import path는 대부분 한단어 또는 두단어로 구성됩니다. 예) fmt, os, math/rand
– import path는 유일해야 합니다. 겹치는 경우 컴파일 오류가 발생합니다.
– 파키지 이름과 디렉토리 구조가 일치해야 합니다. math/rand 패키지의 소스 코드는 rand 디렉토리 안에 있어야 합니다.

import path를 지정할 때 몇 가지 주의사항이 있습니다.

– 표준 라이브러리가 사용 중인 이름은 피하는 것이 좋습니다.
– 대문자는 가급적 피하는 것이 좋습니다. 일부 시스템에서 대소문자 구분 문제가 발생할 수 있기 때문입니다.
– 밑줄(_)보다는 하이픈(-)을 사용하는 것이 보편적입니다.

이처럼 import path에 대한 이해와 규칙을 지키면서 모듈을 작성한다면 다른 개발자가 우리 모듈을 쉽게 사용할 수 있고, 실수로 중복되는 문제를 피할 수 있습니다.

프로그램언어 고(Go)에서의 패키지의 Dependency 관리 방법 이해하기

프로그램언어 고(Go)에서 패키지 의존성(Dependency)을 관리하는 방법에 대해 친절하게 설명드리겠습니다.

고(Go)에서는 기본적으로 GOPATH 환경 변수를 사용하여 패키지와 의존성을 관리합니다. GOPATH는 고(Go) 코드와 패키지가 있는 기본 파일 시스템 경로를 지정하는 역할을 합니다.

예를 들어,


GOPATH=/home/user/golang

와 같이 설정할 경우 /home/user/golang 경로 아래에 고(Go) 관련 소스와 패키지가 저장되게 됩니다.

이 경로 아래에는 크게 3가지 영역이 존재합니다.


/home/user/golang
    /pkg : 빌드된 Go 패키지 파일들이 저장되는 곳
    /bin : 빌드 결과물 바이너리 파일이 저장되는 곳 
    /src : 작성한 Go 소스 파일 및 Git으로 받은 외부 패키지가 저장되는 곳

src 아래에는 일반적으로 작성한 고(Go) 소스 파일들과 git 으로 다운로드받은 외부 패키지 소스가 저장됩니다.


/home/user/golang/src
    /mypackage: 내가 작성한 패키지
    /github.com
        /user1
           /package1 : git 으로 받은 외부 패키지
           /package2 : git 으로 받은 외부 패키지

이렇게 GOPATH를 기본적으로 활용하여 패키지를 관리합니다.

그리고 실제로 외부 패키지를 의존성으로 가져오기 위해서는 go get 명령을 사용합니다.


go get github.com/user2/package1

위의 명령은 github.com/user2/package1 패키지를 GOPATH/src 아래에 다운로드하여 의존성을 가져오게 됩니다.

import 문장을 사용하여 해당 패키지를 불러와 사용할 수 있습니다.


import (
  "github.com/user2/package1"
)

최근에는 GO Modules 도입으로 GOPATH 없이 프로젝트 경로 기준으로 패키지를 관리하는 것이 일반적입니다.

GO Modules 사용 시 go.mod 파일에 의존성이 기록되고, go get으로 패키지를 받으면 go.mod 파일이 자동으로 수정되어 관리됩니다.

이렇듯 고(Go)에서는 GOPATH나 GO Modules를 이용하여 의존성 있는 외부 패키지들을 효과적으로 관리할 수 있습니다.

Leave a Comment