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')) }