패키지
패키지에 들어가기 전, 우리가 사용했던 fmt
패키지는 어디에 존재할까?
// fmt.go 내부를 보자면
package fmt // 자신이 fmt 패키지임을 알린다
func Sprint(args ...interface{}) string
// ...
이런식으로 패키지를 생성할수 있음을 기억.
패키지를 불러오는법을 다시 정리하자면..
//패키지(1)
package main // main 패키지는 패키지가 아니라 프로그램의 시작점이다.(혼동주의)
//선언 방법1
/*
import "fmt"
import "os"
*/
//선언 방법2
import (
"fmt" // fmt 패키지를 가져와 주세요
"os"
)
func main() {
//패키지 : 코드 구조화 및 재사용
//Go는 패키지로 구성되어 있음
//서로 다른 패키지간에 서로 import 후 사용
//패키지 이름 = 디렉터리 이름
//같은 패키지 내 -> 소스파일 같은 디렉터리 위치
//네이밍 규칙 : 소문자, 패키지명 = 소스파일명
var name string
fmt.Print("이름은? : ")
fmt.Scanf("%s", &name) // 문자를 입력받고 name에 저장해주세요
// 커멘드에 출력해주세요
fmt.Fprintf(os.Stdout, "Hi %s\n", name)
}
패키지 만들어보기
//패키지(2)
package main
import (
"fmt"
"section4/lib" // 내가만든 라이브러리(패키지) 위치
)
func main() {
//패키지 종류
//1.메인 프로그램(main)
//2.다른 패키지에서 호출 가능한 라이브러리
fmt.Print("10 보다 큰 수? : ", lib.CheckNum(15))
}
//라이브러리 및 접근제어(1)
package lib
func CheckNum(c int32) bool {
return c > 10
}
접근제어 및 Alias
package lib
// 시작 대문자 : public
// func CheckNum(c int32) bool {
// 시작 소문자 : private
func checkNum(c int32) bool {
return c > 10
}
package main
import (
"fmt"
"section4/lib"
)
func main() {
fmt.Print("10 보다 큰 수? : ", lib.CheckNum1(15))
fmt.Print("10 보다 큰 수? : ", lib.CheckNum2(30))
}
package lib
func CheckNum1(c int32) bool {
return c > 10
}
func CheckNum2(c int32) bool {
return c > 10
}
// 패키지외부에서 접근불가
func checkNum1(c int32) bool {
return c > 10
}
// 패키지외부에서 접근불가
func checkNum2(c int32) bool {
return c > 10
}
Alias?
package main
import (
"fmt"
"section4/lib" // 이런식으로 패키지를 사용할 경우 무슨용도로 사용되는지 이해하기 어려움.
)
// ...
Alias로 해결해보자
package main
import (
"fmt"
checkUp "section4/lib" // 패키지의 별명을 지정
)
func main() {
fmt.Print("10 보다 큰 수? : ", checkUp.CheckNum1(15)) // 이런식으로 사용한다
fmt.Print("10 보다 큰 수? : ", checkUp.CheckNum2(30))
}
init
package main
import (
"fmt"
)
func init() {
fmt.Println("Init is being executed")
}
func main() {
//init : 패키지 로드 시에 가장 먼저 호출
//가장 먼저 초기화 되는 작업 작성 시 유용하다.
fmt.Println("Main Source Code!")
}
참고로 패키지 안의 init
은 import될 시에 호출된다.
// 아래는 어떻게 실행될까?
package main
import (
"fmt"
)
func init() {
fmt.Println("Init1 is being executed")
}
func init() {
fmt.Println("Init2 is being executed")
}
func init() {
fmt.Println("Init3 is being executed")
}
func main() {
fmt.Println("Main Source Code!")
}
위에서 부터 순서대로 호출됨, 단 이렇게 쓰면 안된다.;;
Init1 is being executed
Init2 is being executed
Init3 is being executed
Main Source Code!
// Example
package main
import (
"fmt"
"section4/lib"
)
var num int32
//변수 초기화
func init() {
num = 30
}
func main() {
fmt.Print("10 보다 큰 수? : ", lib.CheckNum(num))
}