Q1.
Go에서, 변수인데도 어쩔 때에는 대문자로 시작하는 것 같기도 하더라구. 구조체 안의 변수값으라든가 뭐 이런 특수한 상황에서만 변수의 시작 문자를 대문자로 쓰는건지, 아니면 GO 만의 특별한 규칙이 있는지 잘 모르곘어. 설명해줄래?
A1.
좋은 질문이야! Go에서 변수 이름을 대문자로 시작하느냐, 소문자로 시작하느냐는 단순 스타일 차이가 아니라, "접근 범위(가시성)"을 결정짓는 중요한 문법 규칙이야. 👇
✅ Go의 변수/함수/필드 이름 규칙 핵심
이름 시작 문자 | 외부에서 접근 가능? | 설명 |
대문자 시작 (ID, Name) | ✅ 공개됨 (exported) | 다른 패키지에서 접근 가능 |
소문자 시작 (id, name) | ❌ 비공개 (unexported) | 해당 패키지 내에서만 사용 가능 |
🔍 예를 들어
📦 패키지 model에 구조체가 이렇게 있을 때:
package model
type User struct {
ID string // ✅ 외부에서 접근 가능
pw string // ❌ 외부에서 접근 불가
}
📦 main 패키지에서 사용할 때:
u := model.User{ID: "abc"}
// u.pw → ❌ 컴파일 에러! model 패키지 밖에서는 접근 불가
✅ 함수도 마찬가지!
// 내부 전용 함수
func validateInput(...) {...} // 패키지 내에서만 사용
// 외부 공개 함수
func ValidateInput(...) {...} // 다른 패키지에서도 사용 가능
✅ 이 규칙은 Go의 "접근 제어자" 역할을 해
Go에는 Java/C++처럼 public, private 키워드가 없어.
대신 이름의 첫 글자 대/소문자로 아래처럼 표현해:
Go 스타일 | Java등에서 대응되는 의미 |
ID | public ID |
pw | private pw |
✅ 왜 구조체 필드만 대문자로 쓰는 경우가 많을까?
- 대부분 외부에서 JSON 바인딩(언마샬) 하거나
- 다른 패키지에서 필드 값을 읽거나 쓸 수 있어야 하기 때문에
- 필드명을 대문자로 시작해야 함
🔹 예시:
// 내부 전용 함수
func validateInput(...) {...} // 패키지 내에서만 사용
// 외부 공개 함수
func ValidateInput(...) {...} // 다른 패키지에서도 사용 가능
→ 이거 아니고 아래처럼 쓰면 JSON 언마샬이 안 됨! 👇
type ReqJoin struct {
id string `json:"id"` // ❌ 외부에서 접근 불가 → JSON 파싱 실패
pw string `json:"pw"`
}
✅ 결론 요약
규칙 | 설명 |
대문자 시작 | 외부 접근 가능 (exported) |
소문자 시작 | 외부 접근 불가 (unexported) |
구조체 필드/함수/변수 전부 해당 | 변수든 함수든 타입이든 다 적용됨 |
public / private 같은 키워드는 없음 | 대신 이름 대소문자로 구분 |
즉, Go에서 대문자로 시작하는 이름은 **“외부에 노출되는 공식 API”**라고 보면 돼.
그래서 모델 구조체나 handler 함수 등은 대문자로, 내부 헬퍼 함수나 내부 변수는 소문자로 두는 거지 😎
원하면 코드 기준으로 무엇을 대문자로 두고, 무엇을 안 둬야 할지 정리된 패턴도 알려줄게!
Q2.
패키지 명은 소문자로 써야하나?>
A2.
응, 아주 중요한 포인트 집었어!
Go에서는 패키지명은 반드시 소문자로 쓰는 게 일반적인 규칙이고, 사실상 관례이자 스타일 가이드야.
✅ Go에서 패키지명은 "소문자 + 간결"이 원칙!
📘 공식 Go 스타일 가이드(Golang.org 기준)
"Package names are lower case, with no underscores or mixedCaps."
즉,
❌ 피해야 할 예 | ✅ 올바른 예 |
MyPackage | mypackage |
User_DB | userdb |
HttpUtils | httputils |
Log_Handler | loghandler |
✅ 왜 소문자만 쓰는 게 좋을까?
이유 | 설명 |
✅ Go 툴체인과 호환성 | go get, import 등에서 대소문자 혼용은 불필요한 오류 유발 가능성 있음 |
✅ 일관성 | Go의 표준 라이브러리도 전부 소문자 (fmt, http, json, time) |
✅ 명확한 구분 | 패키지는 소문자, 타입/함수는 대문자로 export → 역할 구분 명확 |
✅ 커뮤니티 컨벤션 | Go 프로젝트 대부분이 소문자 패키지를 사용함 (관례화됨) |
✅ 보통 이런 느낌으로 사용해
project/
│
├── main.go
├── api/ ← ✅ 소문자 패키지
│ └── user.go
├── model/ ← ✅ 구조체 정의
├── db/ ← ✅ DB 연결
├── utils/ ← ✅ 유틸 함수들
🧠 결론
Go에서는 패키지명은 반드시 소문자로 쓰는 것이 권장이고, 실무에서도 반드시 지키는 관례야.
대소문자 섞으면 Go linter나 formatter에서 경고나 스타일 위반으로 표시될 수도 있어!
원하면 패키지명 네이밍 규칙도 요약 정리해줄게 😎
예: 단수/복수? 목적 기반 이름? 이런 것도 정리해둘 수 있어.
'언어 및 도구들 공부 > Go' 카테고리의 다른 글
Go) GoRoutine, Mutex, Channel, waitGroup (0) | 2025.04.13 |
---|---|
Go) 변수의 재사용, := (0) | 2025.04.09 |
Go) 리플렉션 기반 동적 함수 생성 (0) | 2025.04.07 |
Go) 구조체와 태그 (0) | 2025.04.07 |
Go) interface와 type assertion (0) | 2025.04.07 |