(Go : basic) 3. 패키지

Posted by : at

Category : Go


패키지

패키지에 들어가기 전, 우리가 사용했던 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))
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links