1. 변수와 상수
Golang에서 변수와 상수는 프로그램에서 매우 중요한 역할을 하는 두 가지 기본 개념입니다.
-
변수는 프로그램 내에서 데이터를 저장하는 데 사용되는 명명된 식별자입니다. Golang에서는
var
키워드를 사용하여 변수를 선언합니다. -
상수는 프로그램 내에서 값을 변경할 수 없는 식별자입니다. Golang에서는
const
키워드를 사용하여 상수를 선언합니다.
2. Golang 변수의 선언과 초기화
2.1. 단일 변수의 선언과 할당
Go 언어에서는 var
키워드를 사용하여 var 변수_이름 타입
형식으로 변수를 선언합니다. 선언 후에 변수에 값이 할당될 수 있거나 선언과 동시에 초기화할 수 있습니다. 예를 들면:
var age int // 정수 변수 age를 선언합니다
age = 25 // 변수에 값 할당
var name string = "Alice" // 변수 name을 선언하고 초기화합니다
2.2. 다중 변수의 선언
Go 언어는 여러 변수를 동시에 선언할 수 있어서 코드를 더 간결하게 만들 수 있습니다. 일반적으로 함수의 시작 부분이나 패키지 수준에서 대량의 선언이 이루어집니다. 예를 들면:
var (
firstName, lastName string
age int
)
firstName = "John"
lastName = "Doe"
age = 30
위의 대량 선언에서 firstName
과 lastName
은 문자열로 선언되었고, age
는 정수입니다.
2.3. 타입 추론과 짧은 변수 선언
Go 언어에서는 변수의 타입을 명시적으로 지정할 필요가 없는 경우가 있습니다. 변수를 선언할 때 초기화 표현이 제공되면 Go는 변수의 타입을 추론할 수 있습니다. 이를 타입 추론이라고 합니다. :=
를 사용한 짧은 변수 선언은 타입 추론을 기반으로 변수의 선언과 초기화를 간단하게 만들 수 있습니다. 예를 들면:
city := "Beijing" // 짧은 변수 선언을 사용하여 동시에 city를 선언하고 초기화합니다
country := "China" // country는 문자열 타입으로 추론됩니다
짧은 변수 선언은 함수 내에서만 사용할 수 있으며 전역 범위에서는 사용할 수 없다는 점에 유의해야 합니다.
2.4. 함수 외부에서의 변수 선언
함수 외부에서 선언된 변수는 패키지 수준 범위를 갖습니다. 이러한 변수는 패키지 전체에서 볼 수 있고 액세스할 수 있습니다. 예를 들면:
var globalVar string = "전역 변수입니다" // 전역 변수를 선언합니다
func printGlobalVar() {
fmt.Println(globalVar) // 함수 내에서 전역 변수에 액세스합니다
}
전역 변수는 패키지 내의 모든 함수 사이에서 공유될 수 있지만, 잠재적인 이름 충돌과 명확하지 않은 참조를 피하기 위해 주의해서 사용해야 합니다.
Tip: 여기서 기본 함수 코드를 이해하는 것이 충분하며, 함수에 대한 상세한 설명은 후속 섹션에서 제공될 것입니다.
3. 기본 데이터 타입과 제로 값
3.1. Golang의 기본 데이터 타입
Go 언어에서 각 변수 유형은 명시적인 의미론과 행동적 특성을 제공합니다. 다음은 일반적인 기본 데이터 유형입니다:
-
int
,int8
,int16
,int32
,int64
: 정수의 다양한 범위 -
uint
,uint8
,uint16
,uint32
,uint64
: 부호 없는 정수 -
float32
,float64
: 부동 소수점 숫자 -
bool
: 부울 값 (true 또는 false) -
string
: 문자열
3.2. 제로 값의 개념
Go 언어에서 변수는 선언 후 해당 유형의 제로 값으로 자동으로 초기화됩니다. 제로 값은 변수가 명시적으로 초기화되지 않았을 때 해당 유형의 기본값을 의미합니다. 이는 다른 언어에서는 흔하지 않지만, Go에서는 모든 변수가 항상 유효한 초기값을 가지도록 보장합니다. 각 기본 데이터 유형의 제로 값은 다음과 같습니다:
- 정수의 제로 값은
0
입니다 - 부동 소수점 숫자의 제로 값은
0.0
입니다 - 부울의 제로 값은
false
입니다 - 문자열의 제로 값은 빈 문자열
""
입니다
예를 들면:
var i int // 제로 값은 0
var f float64 // 제로 값은 0.0
var b bool // 제로 값은 false
var s string // 제로 값은 ""
제로 값의 개념을 이해하는 것은 변수의 초기화 동작을 이해하는 데 매우 중요하며, 널 포인터나 초기화되지 않은 오류를 방지하는 데 사용될 수 있습니다.
4. 변수의 범위
4.1 지역 변수
지역 변수는 함수 내에서 정의된 변수로, 해당 함수 내에서만 접근할 수 있습니다. 함수 매개변수 또한 지역 변수에 속합니다. 생성된 순간부터 함수 실행이 완료될 때까지 지역 변수는 유지되다가 사라집니다. 함수가 호출될 때마다 지역 변수가 재생성됩니다.
func localVariableExample() {
var localVariable int = 10 // 이것은 지역 변수입니다
fmt.Println(localVariable)
}
func main() {
localVariableExample() // 출력: 10
// fmt.Println(localVariable) // 이 구문은 localVariable이 여기서 보이지 않기 때문에 컴파일 오류가 발생합니다
}
위 예제에서 localVariable
은 localVariableExample
함수 내에서만 접근할 수 있습니다.
4.2 전역 변수
전역 변수는 함수 외부에서 정의된 변수로, 동일 패키지 내의 모든 파일에서 접근할 수 있습니다. 다른 패키지에서 전역 변수를 사용하려면 Go의 접근 제어 규칙에 따라 변수 이름이 대문자로 시작해야 합니다.
package main
import "fmt"
var globalVariable int = 20 // 이것은 전역 변수입니다
func main() {
fmt.Println(globalVariable) // 출력: 20
changeGlobal()
fmt.Println(globalVariable) // 출력: 30
}
func changeGlobal() {
globalVariable = 30 // 전역 변수의 값을 변경
}
이 예제에서 globalVariable
은 main
함수와 changeGlobal
함수에서 모두 볼 수 있습니다.
5 상수의 선언과 사용
5.1 const
키워드
상수를 정의하기 위해 const
키워드를 사용합니다. 상수는 수정할 수 없는 값으로, 한 번 정의되면 그 값은 변경할 수 없습니다. 상수는 정수, 부동 소수점, 불리언, 또는 문자열과 같은 기본 데이터 유형이 될 수 있습니다.
const Pi = 3.14 // 부동 소수점 상수를 선언
const StrConst string = "안녕, 세상아!" // 문자열 상수를 선언
func main() {
fmt.Println(Pi)
fmt.Println(StrConst)
}
5.2 열거 상수
Go 언어에는 특정한 열거 유형이 없지만 iota
키워드를 사용하여 열거를 구현할 수 있습니다. const
블록 내에서 각 추가적인 상수 선언은 iota
의 값을 1씩 증가시킵니다.
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
func main() {
fmt.Println(Sunday) // 출력: 0
fmt.Println(Saturday) // 출력: 6
}
위 코드는 요일을 나타내는 열거를 선언하며, iota
는 const
블록 내에서 0으로 초기화되고 각 후속 선언마다 1씩 증가합니다.
5.3 상수의 범위
상수의 범위는 변수와 유사합니다. 함수 내에서 상수가 정의되면 해당 함수 내에서만 사용할 수 있습니다. 함수 외부(전역)에서 상수가 정의된 경우 패키지 전체에서 사용할 수 있으며 첫 글자가 대문자인 경우 다른 패키지에서도 접근할 수 있습니다.
상수의 범위를 관리하면 전역 범위 오염이 줄어들고 프로그램의 유지보수성과 가독성이 향상됩니다.
const GlobalConst = "이것은 전역 상수입니다"
func main() {
const LocalConst = "이것은 지역 상수입니다"
fmt.Println(GlobalConst) // 이것은 유효한 구문입니다
fmt.Println(LocalConst) // 이것은 유효한 구문입니다
}
func anotherFunction() {
// fmt.Println(LocalConst) // 이는 컴파일 오류를 발생시킵니다: LocalConst는 이 함수에서 보이지 않습니다
fmt.Println(GlobalConst) // 이것은 유효한 구문입니다
}
이 예제에서 LocalConst
는 main
함수 내에서만 접근할 수 있고, GlobalConst
는 패키지 전체에서 접근할 수 있습니다.