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)를 학습하였습니다.
반응형