패키지
패키지란 Go언어에서 코드를 묶는 가장 큰 단위이다.
- 함수로 코드블록을..
- 구조체로 데이터를..
- 패키지로 함수와 구조체와 그외 코드를 묶는다.
프로그램은 main 패키지 하나와 여러 외부 패키지로 구성된다.
1️⃣ main 패키지
main 패키지는 프로그램 시작점을 포함한 패키지이다. (특별한 패키지)
프로그램이 실행되면 OS는 프로그램을 메모리로 로드시키고 그 후에 프로그램 시작점부터 한 줄씩 코드를 실행한다.
프로그램 시작점이 main() 함수이고 main() 함수를 포함한 패키지가 main 패키지이다.
2️⃣ 그외 패키지
한 프로그램은 main 패키지 외에 다수의 다른 패키지를 포함할 수 있다.
- 표준 입출력은 fmt
- 암호화 기능은 crypto 패키지
- 네트워크 기능은 net 패키지..
그냥 원하는 패키지를 import 하여 사용하면 된다.
💡 이미 세상에는 수많은 패키지가 제공되므로 프로그래밍 할 때는 원하는 기능을 제공하는 패키지를 먼저 찾아보는 습관을 들이는게 좋다.
3️⃣ 유용한 패키지 찾기
- 먼저, 표준 패키지에서 같은 기능을 제공하는지 찾아본다.
- 링크 : https://golang.org/pkg
- 위 링크에서는 표준 패키지 목록을 확인할 수 있다.
- 링크 : https://golang.org/pkg
- 표준 패키지에 없다면 공개된 외부 패키지에서 제공하는지 찾아본다.
패키지 사용하기
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️⃣ 겹치는 패키지 문제 별칭으로 풀기
만약, 패키지 명이 겹치면? 별칭을 줘서 구별해주자.
예제 2. 겹치는 패키지 명
아래의 예시의 경우 마지막 패키지명이 같아 패키지 명이 동일하다. 어떻게 해야할까?
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 폴더에 설치한다.
- 현재 모듈 아래 위치한 패키지인지 검사한다.
Go 모듈
Go 모듈은 Go 패키지들을 모아놓은 Go 프로젝트의 단위이다.
- 1.16 버전부터 Go 모듈 사용이 기본이 되었다.
Go 모듈은 다음의 명령어로 생성할 수 있다.
go mod init [패키지명]
이전에는 Go 모듈을 만들지 않는 모든 Go 코드는 $GOPATH/src 폴더의 아래에 있어야 했으나 기본이 되면서 모든 Go 코드는 Go 모듈 아래에 있어야 한다.
- 즉, go build를 하기위해서는 반드시 Go 모듈의 루트폴더에 go.mod 파일이 존재해야 하고 go.mod 파일에는 모듈의 이름과 Go 버전, 외부 패키지 등이 명시되어 있다.
go.mod 파일과 go.sum 파일을 통해 외부 패키지와 모듈내의 패키지를 합쳐서 바이너리를 만들게 된다.
💡 항상 같은 버전의 패키지가 사용되기 때문에 버전 업데이트에 따른 문제가 발생하지 않는다.
Go 파일 | 포함되는 정보 |
go.mod | 모듈 이름 Go 버전 외부 패키지 등 |
go.sum | 외부 저장소 패키지 버전 정보 |
패키지명과 패키지 외부 공개
패키지의 모든 문자는 소문자로 하는걸 권장한다.
- 패키지 전역으로 선언된 변수, 상수, 타입, 함수, 메서드의 첫 글자가 대문자일 경우 패키지 외부로 공개된다.
- 구조체 이름의 첫 글자가 대문자이고 필드명 역시 첫 글자가 대문자일 경우 구조체의 필드는 패키지 외부로 공개된다.
예제 1. 외부 공개와 내부 공개
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")
}
이제 상위 폴더에 아래의 코드를 작성한다.
package main
import (
"fmt"
"ch16/ex16.2/publicpkg"
)
func main() {
fmt.Println("PI:", publicpkg.PI)
publicpkg.PublicFunc()
var myint publicpkg.MyInt = 10
fmt.Println("myint:", myint)
var mystruct = publicpkg.MyStruct{Age: 18}
fmt.Println("mystruct:", mystruct)
}
'Programming > Go' 카테고리의 다른 글
[Golang] Local Path에 있는 Package를 Import 하기 (0) | 2023.06.08 |
---|---|
[Golang] 문자열 (1) | 2022.12.24 |
[Golang] 포인터 (Pointer) (0) | 2022.11.13 |
[Golang] 구조체 (Structure) (1) | 2022.11.13 |
[Golang] 배열 (Array) (0) | 2022.11.12 |