CafeM0ca

[Go] package public/private access 본문

Programming/Go

[Go] package public/private access

M0ca 2022. 7. 21. 05:42
반응형

Go에서 로컬 package를 생성하고 접근할 때가 있다.

project_dir/
|
----src/
     |
    main.go
    util/
        |
        util.go

먼저 util.go부터 보자.

// util.go
package util
type Sample struct {
    first int
    Second int
}

func function1() {
    // empty function
}

func Function2() {
    // empty function
}

Sample 구조체는 first와 Second 멤버변수를 가지고 있고 function1()과 Function2() 함수를 가지고 있다.
first 멤버변수와 function1() 함수는 소문자로 이름이 시작된다.
Second 멤버변수와 Function2() 함수는 대문자로 이름이 시작된다.

다음으로 main.go를 보자.

// main.go
package main

import (
    "project/src/util" // util package 추가
    "fmt"
)

func main() {
    utilSampleStruct := util.Sample{1,2} // [1]

    fmt.Println(utilSampleStruct) // [2] ok

    fmt.Println(utilSampleStruct.first) // [3] error
    fmt.Println(utilSampleStruct.Second) // [4] ok

    util.function1() // [5] error
    util.Function2() // [6] ok
}

[1]에서 utilSampleStruct를 초기화해준다.
[2]에서 utilSampleStruct를 출력한다. 가능하다.
[3]에서는 에러가 발생한다. 특정 패키지(util)에서 소문자로 되어있으면 private로 설정되어 다른 패키지(main)에서 접근할 수 없게 된다. 따라서 컴파일 에러가 발생한다.
[4]는 util패키지의 Sample 구조체의 Second 멤버변수가 대문자로 시작하므로 접근 가능하다.
[5]도 마찬가지로 private로 설정되어 있으므로 main 패키지에서 사용할 수 없는 함수다.
[6]은 public이므로 main 패키지에서 사용할 수 있다.

정리하면 패키지 내부에서 이름의 시작이 대문자면 public으로 다른 패키지에서 접근할 수 있고 소문자면 private로 해당 패키지 내부에서만 사용할 수 있다.

반응형
Comments