자바스크립트를 활성화 해주세요

Tucker의 Go 언어 프로그래밍 4장 요약

 ·  ☕ 3 min read

Tucker의 Go 언어 프로그래밍스터디 요약 노트입니다.

4장. 변수

일단 이 책에서는 내가 생각하는 컴퓨터공학의 핵심이라 생각하는 타입의 개념에 대해 충실히 설명하고 있다.

예를 들어 1과 1.0은 다르고, 숫자 1234와 전화번호 1234가 다른 것 처럼 적절한 타입으로 표현하는 것(프로그래머의 추상화 관점)과, 이를 통해 컴퓨터가 메모리의 값을 적절한 방식으로 해석하게 됨(하드웨어 구현 관점)을 설명하고 있다.

int의 크기

go언어에서는 int의 크기가 시스템의 크기에 따라 결정된다고 한다. 책에 나온 정의가 약간 부정확해 보여서 직접 실험해봤다. 컴파일 환경의 비트에 따라 달라진다가 좀 더 정확한 표현인 것 같다.

1
2
3
4
5
6
7
8
9
package main

import "fmt"

func main() {
    var intMax uint = ^uint(0)

    fmt.Println(intMax)
}
# 명시적으로 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 타입이라 정의했다. runeint32의 별칭이라는 것으로 보아, UCS를 모두 표현하는 것으로 보인다.

실제 문자열이 utf-8로 인코딩 되어 있는지 확인해보자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import "fmt"

func main() {
    var multilingual string = "English와 한글이 섞인"

    fmt.Println(multilingual)

    multiLingRunes := []rune(multilingual)
    multiLingBytes := []byte(multilingual)

    fmt.Println(multiLingRunes)
    fmt.Println(multiLingBytes)
}
$ ./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처럼 varval의 차이가 있는 건가 싶었는데, go에서는 const 키워드로 상수를 표현한다고 한다.

굳이 var 키워드가 꼭 필요한가 싶어서 확인해보니, 전역변수 선언에서는 묵시적 선언이 불가능 한 것으로 보인다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import "fmt"

var testVar1 int = 10
testVar2 := 10

func main() {
    fmt.Println(testVar1)
    fmt.Println(testVar2)
}
$ go build
# go_var
./go_var.go:6:1: syntax error: non-declaration statement outside function body

저자 강의


JaeSang Yoo
글쓴이
JaeSang Yoo
The Programmer

목차