Go/A Tour of Go 따라하기

[A Tour of Go 따라하기] 상수 (Constants)

IdeaFusion 2019. 1. 25. 17:22
반응형

상수 (Constants)


상수는 const 키워드와 함께 변수처럼 선언합니다.

상수는 문자(character), 문자열(string), 부울(boolean), 숫자 타입 중의 하나가 될 수 있습니다.

package main

import "fmt"

const Pi = 3.14

func main() {
    const World = "안녕"
    fmt.Println("Hello", World)
    fmt.Println("Happy", Pi, "Day")

    const Truth = true
    fmt.Println("Go rules?", Truth)
}

출력 결과

Hello 안녕
Happy 3.14 Day
Go rules? true
해당 소스는 main 함수 외부, 내부에서 상수에 접근하여 출력합니다.
한번 정의된 상수는 재정의 할 수 없습니다(cannot assign)
Go는 여러가지 자료형을 지원하는데 https://golang.org/pkg/builtin/ 링크에서 확인하실수 있습니다.

숫자형 상수 (Numeric Constants)

숫자형 상수는 정밀한 값(values) 을 표현할 수 있습니다.

타입을 지정하지 않은 상수는 문맥(context)에 따라 타입을 가지게 됩니다.

코드를 통해 needInt(Big) 는 어떤 결과를 출력할지 실험해보세요.

package main

import "fmt"

const (
    Big   = 1 << 100
    Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
    return x * 0.1
}

func main() {
    fmt.Println(needInt(Small))
    fmt.Println(needFloat(Small))
    fmt.Println(needFloat(Big))
}

출력 결과

21
0.2
1.2676506002282295e+29

line 6 : Big 상수는 1의 값을 좌측 시프트 연산으로 100번 이동하였습니다.

line 7 : Small 상수는 Big 상수의 값을 우측 시프트 연산으로 99번 이동하였습니다.

Big 상수는 1 * (2^100) 의 값이며, Small 상수는 Big상수 / (2^99) 의 값이 되겠습니다.

여기까지는 출력에 문제가 없어보입니다. 예제에서 제시한 needInt(Big)을 해보겠습니다.

package main

import "fmt"

const (
    Big   = 1 << 100
    Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
    return x * 0.1
}

func main() {
    fmt.Println(needInt(Small))
    fmt.Println(needFloat(Small))
    fmt.Println(needFloat(Big))
    fmt.Println(needInt(Big)) // 추가
}

출력 결과

main.go:19:21: constant 1267650600228229401496703205376 overflows int

line 19에서 에러가 발생했네요. Big을 int형으로 출력하고싶었지만 오버플로우가 발생되었습니다.

Big의 시프트연산은 1에서 100비트를 이동해버려서 int의 32비트를 한참 초과하였습니다.

Big을 출력하려면 제약조건 내에서의 값 조정이 필요해보입니다.


Go언어의 상수 (Constants)를 학습하였습니다.

반응형