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

위의 대량 선언에서 firstNamelastName은 문자열로 선언되었고, 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이 여기서 보이지 않기 때문에 컴파일 오류가 발생합니다
}

위 예제에서 localVariablelocalVariableExample 함수 내에서만 접근할 수 있습니다.

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 // 전역 변수의 값을 변경
}

이 예제에서 globalVariablemain 함수와 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
}

위 코드는 요일을 나타내는 열거를 선언하며, iotaconst 블록 내에서 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)  // 이것은 유효한 구문입니다
}

이 예제에서 LocalConstmain 함수 내에서만 접근할 수 있고, GlobalConst는 패키지 전체에서 접근할 수 있습니다.