포스트

기초 ① 문법·패키지·모듈 — C++과 다른 뼈대 규칙

C를 알면 Go 문법 절반은 익숙하다. 이 글은 암기가 아니라 C++과 다른 Go의 뼈대 규칙을 잡는다 — := 짧은 선언과 다중 반환값, for가 유일한 반복문, 명시적 변환만 허용, zero value와 nil, 그리고 헤더 없이 패키지 단위로 묶이고 대문자로 export를 결정하는 구조와 go mod까지. 안 쓴 변수·import가 컴파일 에러라는 Go의 태도도 함께.

기초 ① 문법·패키지·모듈 — C++과 다른 뼈대 규칙

Go 학습 로드맵① 기초 단계입니다.

C를 알면 Go 문법의 절반은 첫날에 읽힙니다. 그래서 이 단계의 목표는 문법 암기가 아니라 C++과 다른 Go의 뼈대 규칙 몇 개를 몸에 붙이는 것입니다. 그 규칙들이 이후 모든 단계의 바닥에 깔립니다.

변수 — :=와 zero value

1
2
3
var x int = 10      // 정식 선언
y := 20             // 짧은 선언 — 타입 추론. 함수 안에서만
var z int           // 초기값을 안 줘도 z == 0

:=는 선언과 초기화를 합친 축약입니다(함수 밖 패키지 레벨에선 못 씀). 그리고 모든 타입에 zero value가 있습니다 — 숫자는 0, 문자열은 "", 불리언은 false, 포인터·슬라이스·맵·인터페이스는 nil. C++의 “초기화 안 하면 쓰레기값”이 없습니다. 선언만 하면 항상 정의된 기본값에서 출발합니다.

함수 — 다중 반환값

Go 함수는 값을 여러 개 반환합니다. 이게 이후 에러 처리(④)의 토대라 지금 눈에 익혀 둡니다.

1
2
3
4
func divmod(a, b int) (int, int) {   // 몫과 나머지를 함께
    return a / b, a % b
}
q, r := divmod(17, 5)   // q=3, r=2

C++이라면 std::pair나 출력 인자(int&)로 풀던 걸 Go는 언어 차원에서 지원합니다. 관례적으로 마지막 반환값을 error 두는 패턴이 여기서 나옵니다(④에서 본격).

for가 유일한 반복문

Go에는 while이 없습니다. for 하나가 세 역할을 다 합니다.

1
2
3
4
for i := 0; i < 10; i++ { }   // C 스타일
for cond { }                  // while 대용
for { }                       // 무한 루프 (break로 탈출)
for i, v := range slice { }   // range 순회

문법을 줄여 외울 게 적게 만든 Go 특유의 결정입니다.

명시적 변환만 — 암묵 형변환 없음

1
2
var i int = 10
var f float64 = float64(i)   // 반드시 명시. float64 f = i; 는 에러

C++의 암묵적 정수↔실수 변환이 Go엔 없습니다. 타입이 다르면 항상 손으로 변환해야 합니다. 처음엔 번거롭지만, “어디서 정밀도가 깎였지” 같은 버그가 원천 차단됩니다.

패키지 — 헤더가 없다

C++의 #include·헤더/구현 분리가 Go엔 없습니다. 코드는 파일이 아니라 패키지 단위로 묶입니다.

  • 한 디렉터리 = 한 패키지. 파일을 몇 개로 쪼개든 같은 패키지면 서로 자유롭게 참조합니다(전방 선언 불필요).
  • 가시성은 대소문자로 결정됩니다. 이름이 대문자로 시작하면 공개(export), 소문자면 패키지 내부용입니다. public/private 키워드가 없습니다.
1
2
3
4
package geometry

func Area(r Rect) float64 { ... }   // 대문자 → 다른 패키지에서 호출 가능
func scale(...) { ... }             // 소문자 → 이 패키지 안에서만

모듈은 패키지들의 배포 단위입니다. go mod init example.com/myapp으로 시작하면 go.mod가 생기고, 의존성이 여기 기록됩니다. C++의 헤더 경로·링커 설정 씨름 없이 import 경로만으로 해결됩니다(도구는 ⑦에서).

C++ 전환으로 정리

C++Go핵심 차이
초기화 안 하면 쓰레기값zero value모든 타입에 정의된 기본값
std::pair·출력 인자다중 반환값언어가 직접 지원
while, do-while, forfor 하나반복문 하나로 통합
암묵 형변환명시적 변환만타입 다르면 손으로
헤더/#include, public/private패키지 + 대소문자 export헤더 없음, 키워드 없음

자주 막히는 지점

  • 안 쓴 변수·import가 컴파일 에러 — C++은 경고지만 Go는 에러입니다. “일단 선언해 두고 나중에 쓰기”가 안 됩니다. 코드가 항상 깔끔하게 유지되도록 강제하는 의도적 설계.
  • 대소문자로 가시성 결정 — 다른 패키지에서 안 보인다면 십중팔구 이름을 소문자로 시작한 것.
  • := vs = — 새 변수는 :=, 기존 변수 재대입은 =. 이미 있는 변수에 :=를 쓰면 “no new variables” 에러(단, 여러 변수 중 하나라도 새것이면 허용).

통과 기준

  • go mod init으로 만든 모듈에서, 다중 반환 함수를 정의해 다른 패키지에서 호출할 수 있다.
  • zero value와 명시적 변환, 대소문자 export를 설명할 수 있다.

다음은 ② struct·method·interface입니다. 클래스 없이 사고하는 Go 타입 시스템의 뼈대로, C++ 습관과 가장 크게 부딪히는 단계입니다.

Reference

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.