『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트입니다.
4장. 변수
일단 이 책에서는 내가 생각하는 컴퓨터공학의 핵심이라 생각하는 타입의 개념에 대해 충실히 설명하고 있다.
예를 들어 1과 1.0은 다르고, 숫자 1234와 전화번호 1234가 다른 것 처럼 적절한 타입으로 표현하는 것(프로그래머의 추상화 관점)과, 이를 통해 컴퓨터가 메모리의 값을 적절한 방식으로 해석하게 됨(하드웨어 구현 관점)을 설명하고 있다.
int의 크기
go언어에서는 int
의 크기가 시스템의 크기에 따라 결정된다고 한다. 책에 나온 정의가 약간 부정확해 보여서 직접 실험해봤다. 컴파일 환경의 비트에 따라 달라진다가 좀 더 정확한 표현인 것 같다.
|
|
# 명시적으로 x86 32bit로 컴파일 하려면 앞에 환경변수를 변경한다.
$ GOARCH=386 GO386=softfloat go build
# 32bit 실행파일 확인
$ file go_intmax
go_intmax: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, Go BuildID=whcf5YULQAGTt7WJw_Bi/_S-7XiOp74YDhMdaR-XW/kAzTzAYBcTiwIMmaKgmI/NcdUi1SXls08b19JVtIc, not stripped
$ ./go_intmax
4294967295
# 명시적으로 x86 64bit로 컴파일 하려면 앞에 환경변수를 변경한다.
$ GOARCH=amd64 go build
# 64bit 실행파일 확인
$ file go_intmax
go_intmax: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=WUYerYNB9m74ls69fi0P/-XlxGK553eA5t4u4wzct/aa8a3tMsB8mwewlWCl3k/P0xI5AHDRcm1sthL6TCV, not stripped
$ ./go_intmax
18446744073709551615
참고로 C의 경우 int
크기의 정의가 해당 프로세서가 가장 효율적으로 사용할 수 있는 크기로 정의되어 있다.
일반적으로 32bit 환경이거나 64bit 환경이거나 모두 32bit를 사용하고 있으며 (과거 16bit 시절에는 16bit를 사용했음.) 실질적인 32~64의 적용은 long
type에 적용되거나, pointer의 크기에만 적용된다.
실제 C에서 적용되는 자료형 크기 정보는 C language data type model를 참고하기 바란다.
string, rune
go에서는 모든 문자열을 UTF-8로 인코딩해서 나타내며, 모든 문자를 표현하기 위한 타입을 rune
타입이라 정의했다. rune
이 int32
의 별칭이라는 것으로 보아, UCS를 모두 표현하는 것으로 보인다.
실제 문자열이 utf-8로 인코딩 되어 있는지 확인해보자.
|
|
$ ./go_multilingual
English와 한글이 섞인
[69 110 103 108 105 115 104 50752 32 54620 44544 51060 32 49438 51064]
[69 110 103 108 105 115 104 236 153 128 32 237 149 156 234 184 128 236 157 180 32 236 132 158 236 157 184]
var의 명시적 표기 필요성
go에서 변수 선언에는 var
키워드를 사용하는데, :=
할당자를 통해 묵시적으로 변수 선언이 가능하다. 묵시적인 표기로도 선언이 가능한데 왜 굳이 var
라는 키워드가 필요할까?
혹시 kotlin처럼 var
와 val
의 차이가 있는 건가 싶었는데, go에서는 const
키워드로 상수를 표현한다고 한다.
굳이 var 키워드가 꼭 필요한가 싶어서 확인해보니, 전역변수 선언에서는 묵시적 선언이 불가능 한 것으로 보인다.
|
|
$ go build
# go_var
./go_var.go:6:1: syntax error: non-declaration statement outside function body