언어 및 도구들 공부/Go

Go) 변수 대문자로 시작하는 경우

Dr.Mlem 2025. 4. 8. 14:09
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에서 경고나 스타일 위반으로 표시될 수도 있어!

원하면 패키지명 네이밍 규칙도 요약 정리해줄게 😎
예: 단수/복수? 목적 기반 이름? 이런 것도 정리해둘 수 있어.