16. 패키지

Winston Lee·2023년 11월 22일

Golang

목록 보기
10/12

1. 패키지

Golang의 코드를 묶는 단위이며, 모든 코드는 패키지에 속해야 합니다.

  • 함수로 코드블록을..
  • 구조체로 데이터를..
  • 패키지로 함수와 구조체와 그외 코드를 묶는다.

프로그램은 main 패키지 하나와 여러 외부 패키지로 구성된다.

1. main 패키지

main 패키지는 프로그램 시작점을 포함한 패키지이다. (특별한 패키지)
프로그램이 실행되면 OS는 프로그램을 메모리로 로드시키고 그 후에 프로그램 시작점부터 한 줄씩 코드를 실행한다.
프로그램 시작점이 main() 함수이고 main() 함수를 포함한 패키지가 main 패키지이다.

2. 그외 패키지

한 프로그램은 main 패키지 외에 다수의 다른 패키지를 포함할 수 있다.

  • 표준 입출력은 fmt
  • 암호화 기능은 crypto 패키지
  • 네트워크 기능은 net 패키지..

그냥 원하는 패키지를 import 하여 사용하면 된다.

이미 세상에는 수많은 패키지가 제공되므로 프로그래밍 할 때는 원하는 기능을 제공하는 패키지를 먼저 찾아보는 습관을 들이는게 좋다.

3. 유용한 패키지 찾기

  • 다른 사람이 만든 유용한 표준 패키지 찾기 → https://golang.org/pkg
  • Go언어에서 많이 사용되는 패키지 → https://github.com/avelino/awesome-go

2. 패키지 사용하기

1. 임포트

import "fmt"

아래처럼 소괄호로 패키지들을 묶어서 여러 패키지들을 임포트할 수 있다.

import (
	"fmt"
	"os"
)

2. 패키지 멤버에 접근하기

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

fmt.Println("Hello World")

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

package main

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

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

경로가 있는 패키지에 접근할 때는 마지막 폴더명인 rand만 사용한다.

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

만약, 패키지 명이 겹치면? 별칭을 줘서 구별해주자.
아래의 예시의 경우 마지막 패키지명이 같아 패키지 명이 동일하다. 어떻게 해야할까?

import (
	"text/template"
	"html/template"
)

그러면 별칭을 설정하자.
겹치는 패키지 명 별칭설정

import (
	"text/template"
	htemplate "html/template"
)

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

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

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

import (
	"database/sql"
	_ "github.com/mattn/go-sqlite3"
)
  • “database/sql” 패키지에 sqlite3을 사용하겠다는 부가효과를 얻고자 가져왔기 때문에 밑줄 _ 을 사용하여 오류를 방지하였다.

6. Go는 import된 패키지를 어떻게 찾을까?

다음의 세 가지 방법으로 찾는다.

  • 기본으로 제공하는 패키지는 Go 설치 경로에서 찾는다.
  • 외부 저장소(Github, etc..)에서 가져오는 경우는 원격지에서 다운로드 받은 후 $GOPATH\pkg 폴더에 설치한다.
  • 현재 모듈 아래 위치한 패키지인지 검사한다.

3. Go 모듈

  • Go 패키지들을 모아 놓은 Go 프로젝트 단위 → 1.16 버전부터 기본
    • Go 모듈이 기본이 되며 모든 Go 코드는 Go 모듈아래에 있어야 한다
    • go bulid 로 컴파일을 하려면 Go 모듈 루트 포더에 go.mod 파일이 필요
    • go.mod 처음 만들기 → go mod init 모듈_이름
    • go.mod를 통한 패키지 다운로드 → go mod tidy
      • 모듈 이름과 Go 버전, 다운로드가 필요한 외부 패키지들의 경로와 버전을 go.mod에 갱신하고, 패키지들을 다운로드

Go 모듈은 다음의 명령어로 생성할 수 있다.

go mod init [패키지명]

4. 패키지명과 패키지 외부 공개

  • 패키지 이름은 쉽고 간단하게, 그리고 모든 문자를 소문자로 할 것을 권장
  • 패키지 외부로 공개되는 것 → 이름이 대문자로 시작할 것
    • 패키지 전역에 선언된 변수, 상수, 타입, 함수, 메서드
    • 구조체, 구조체 안의 필드
  • 대문자로 시작(구조체 필드, 메서드)하더라도 구조체가 비공개면 비공개가 된다
package publicpkg

import "fmt"

const (
	PI = 3.1415   // 외부로 공개되는 상수
	pi = 3.141516 // 외부로 공개되지 않는 상수
)

var ScreenSize int = 1080 // 외부로 공개되는 변수
var screenHeight int      // 외부로 공개되지 않는 변수

func PublicFunc() { // 외부로 공개되는 함수
	const MyConst = 100 // 함수 내부에서 선언되어서 외부로 공개되지 않습니다.
	fmt.Println("This is a public function", MyConst)
}

func privateFunc() { // 외부로 공개되지 않는 함수
	fmt.Println("This is a private function")
}

type MyInt int       // 외부로 공개되는 별칭 타입
type myString string // 외부로 공개되지 않는 별칭 타입

type MyStruct struct { // 외부로 공개되는 구조체
	Age  int    // 외부로 공개되는 구조체 필드
	name string // 외부로 공개되지 않는 구조체 필드
}

func (m MyStruct) PublicMethod() { // 외부로 공개되는 메서드
	fmt.Println("This is a public method")
}

func (m MyStruct) privateMethod() { // 외부로 공개되지 않는 메서드
	fmt.Println("This is a private method")
}

type myPrivateStruct struct { // 외부로 공개되지 않는 구조체
	Age  int    // 외부로 공개되지 않는 구조체 필드
	name string // 외부로 공개되지 않는 구조체 필드
}

func (m myPrivateStruct) PrivateMethod() { // 외부로 공개되지 않는 메서드
	fmt.Println("This is a private method")
}

5. 패키지 초기화

  • 패키지를 임포트 할때 일어나는 일
    • 임포트 되는 패키지의 전역변수가 초기화
    • 패키지 안의 init()함수가 있다면 호출하여 패키지 초기화
      • 반드시 입력 매개변수와 반환값이 없는 함수
      • _ 로 임포트 하면 init()함수만 실행된다.
profile
인프라 엔지니어

0개의 댓글