변수 선언의 기본
Go에서는 var 키워드를 사용해 변수를 선언할 수 있습니다. 이 방식은 변수 이름과 자료형을 명시하며, 초기값을 동시에 할당할 수도 있습니다.
package main
import "fmt"
func main() {
var name string = "kim"
fmt.Println(name)
}
여기서 name은 문자열 타입의 변수이며, 값으로 "kim"을 가지게 됩니다. Go는 정적 타입 언어이므로, 타입에 맞지 않는 값을 할당하면 컴파일 오류가 발생합니다.
여러 변수 한 번에 선언하기
같은 타입의 여러 변수를 한 줄에서 선언하고 초기화할 수 있습니다.
var x, y int = 10, 20
또는 블록 형식으로 서로 다른 타입의 변수도 그룹화하여 선언 가능합니다.
var (
title string = "Go Study"
age int = 25
valid bool = true
)
제로 값 (Zero Value)
Go에서는 변수를 선언만 하고 초기화하지 않으면 자동으로 해당 타입의 기본값인 제로 값이 할당됩니다.
int→ 0string→ "" (빈 문자열)bool→ false- 포인터 → nil
var count int
var message string
fmt.Println(count, message) // 출력: 0 ""
짧은 변수 선언 (: =)
함수 내부에서는 := 연산자를 사용해 더 간결하게 변수를 선언할 수 있습니다. 이 경우 타입을 생략하고, 컴파일러가 값을 기반으로 타입을 추론합니다.
func main() {
result := "success"
code := 200
active := true
fmt.Println(result, code, active)
}
단, 이 구문은 함수 외부에서는 사용할 수 없으며, 항상 새로운 변수를 선언할 때만 사용해야 합니다.
선언 스타일 비교
다음은 동일한 변수를 다양한 방식으로 선언하는 예입니다.
var a string = "hello"
var b = "world"
var c string
c = "test"
d := "short"
모두 유효하지만, 일반적으로 짧은 선언(:=)이 함수 내에서 가장 흔히 쓰입니다.
변수의 스코프 (유효 범위)
Go의 변수 스코프는 블록 기반입니다. 중괄호 {} 안에서 선언된 변수는 해당 블록 내에서만 접근 가능합니다. 패키지 레벨에서 선언된 변수는 패키지 전체에서 사용할 수 있으며, 대문자로 시작하는 이름은 외부 패키지에서도 참조 가능합니다.
포인터를 통한 값 참조
Go는 포인터를 지원하며, 변수의 메모리 주소를 직접 다룰 수 있습니다. 이를 통해 함수 간에 값을 효율적으로 공유하거나 수정할 수 있습니다.
func multiply(p, q *int) int {
return *p * *q
}
func main() {
num1, num2 := 4, 5
total := multiply(&num1, &num2)
fmt.Println(total) // 출력: 20
}
상수(const)의 사용
상수는 프로그램 실행 중 변하지 않는 값을 정의할 때 사용되며, const 키워드로 선언합니다. 반드시 선언과 동시에 값을 초기화해야 하며, 이후 재할당은 불가능합니다.
const MaxUsers = 100
const Version = "v1.2.0"
상수는 숫자, 문자열, 불리언 등 리터럴 값에 사용되며, 컴파일 시 결정됩니다.
익명 변수 (_)의 활용
함수에서 반환값 중 일부를 무시하고 싶을 때 언더스코어(_)를 사용합니다. 이는 실제로 메모리를 할당하지 않으며, 이름 충돌도 발생하지 않습니다.
func getData() (int, string) {
return 99, "ignored"
}
func main() {
_, text := getData()
value, _ := getData()
fmt.Println(text, value)
}
예제에서 보듯, 필요 없는 반환값은 _로 버릴 수 있어 코드의 의도를 명확히 전달할 수 있습니다.
전역 및 함수 내 선언 규칙
패키지 수준(함수 외부)에서는 모든 선언이 var, const, func 등의 키워드로 시작해야 하며, :=는 사용할 수 없습니다. 이는 문법적으로 필수적인 제약입니다.