더북(TheBook)

2.5.2 접근 제어

앞의 예제에서 본 IsDigit 함수처럼 변수, 상수, 함수, 사용자 정의 타입, 메서드, 구조체의 필드 등의 식별자가 대문자로 시작하면 패키지 외부에서 접근할 수 있다(사용자 정의 타입, 메서드, 구조체는 4장 객체 지향 프로그래밍에서 설명한다). 식별자가 소문자로 시작하면 패키지 외부에서 접근할 수 없다. 단, 패키지 내에서는 모든 요소에 접근할 수 있다.

앞에서 작성한 lib.go 파일에 isSpace 함수를 만들어 보자. isSpace 함수는 소문자로 시작하므로 패키지 외부에서는 접근할 수 없다.

▼ $GOPATH/src/go-book-sample/ch2/lib/lib.go

package lib
  
func IsDigit(c int32) bool {
    return '0' <= c && c <= '9'
}
  
func isSpace(c int32) bool {
    switch c {
        case '\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0:
        return true
    }
    return false
}

main 패키지에서 lib 패키지의 isSpace 함수를 사용하려고 하면 빌드 오류가 발생한다.

▼ $GOPATH/src/go-book-sample/ch2/pkg/main.go

package main
  
import (
    "fmt"
    "go-book-sample/ch2/lib"
)
  
func main() {
    fmt.Println(lib.IsDigit('1'))
    fmt.Println(lib.IsDigit('a'))
    fmt.Println(lib.isSpace('\t'))
}

명령 프롬프트

$ go build

# command-line-arguments

./main.go:9: cannot refer to unexported name lib.isSpace

./main.go:9: undefined: lib.isSpace

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.