변수 선언 및 형변환

프로그래밍 언어를 배울 때 가장 기초적이고 기본적으로 알아야 하는 것이 변수 선언으로, go에서는 아래와 같이 다양한 형태의 변수 선언을 지원한다.

var a int = 1
var b int
b = 2
var c = 3
d := 4

첫번째 방식(var a int = 1)이 가장 기본적인 형태로, var 라는 키워드로 변수를 선언하겠다고 알려준 뒤 변수명과 타입, 초기값을 넣어준다.

초기값에는 상수 뿐만 아니라 다른 연산 결과나 변수, 수식들은 사용할 수 있다.

변수 선언시 (var b int) 처럼 초기화해주지 않을 경우에는 미리 지정된 디폴트값으로 설정되는데, 다른 언어와 비슷하게 정수/실수형은 0, bool은 false, 문자열은 “”, 나머지는 널을 가리키는 nil 값이 들어간다.

타입을 생략하는(var c = 3) 경우에는 초기값에 해당하는 타입을 추론해서 지정하는데, 타입을 생략한 경우에는 반드시 초기화를 해줘야한다.

마지막 경우(d := 4)에는 선언과 대입을 함께하는 방식인데, 타입 추론에 var 키워드 생략까지 얹어서 더 편하게 사용 가능하다. 자주 사용된다.

var (
    x int64
    y float64
    z string
    w bool
)

위에처럼 var 키워드 뒤를 괄호로 묶은 뒤, 그 안에 다양한 타입의 여러 변수들을 var 키워드 없이 선언할 수 있다.

이러한 방식은 함수 내에서도 가능하고 함수 밖에서도 가능한데, := 처럼 선언과 대입을 함께하는 방식은 함수 바깥에서는 사용 불가능하다.


모든 변수들은 타입이 지정되어야 하는데, 이는 변수에 접근할 때 메모리상에서 얼마만큼의 공간을 읽어가야하는지에 대해 알아야 하기 때문이다.

따라서 타입별로 미리 크기가 지정되어 있는데, go에는 아래와 같은 타입들이 존재한다.

타입설명
int정수형, 8,16,32,64 등 비트 크기 지정 가능
uintunsigned int로, int 와 똑같이 비트 크기 지정 가능
float실수형, 32,64 비트 크기 지정 가능
complex복소수, 64,128 등 비트 지정 가능
bool불리언 값으로, true/false
string문자열
포인터메모리 주소를 값으로 가지는 타입, C와 동일
[]타입배열, 고정 길이
슬라이스가변 길이 배열
키값쌍으로 이루어진 해시맵 자료구조
구조체여러 변수들의 집합, 클래스 역할
인터페이스메써드 집합


프로그래밍 언어들은 변수의 타입에 대해서 관대한 언어(약 타입)와 검사를 강하게 하는(강 타입) 언어로 나눌 수 있다.

Go는 강 타입 언어들 중에서도 굉장히 엄격한 언어로, 일반적인 많은 언어에서 지원하는 자동 형 변환마저도 지원해주지 않아 사용자가 하나하나 해줘야 한다.

즉 값들을 연산하거나 대입하는 과정에서 타입이 조금만 달라도 용납하지 않는다.

var a int32 = 1
var b float32 = 2.0
var c int64 = 3
d := a + b
e := a + c

// # command-line-arguments
// ./test.go:10:9: invalid operation: a + b (mismatched types int32 and float32)
// ./test.go:11:9: invalid operation: a + c (mismatched types int32 and int64)

주석처리된 내용이 실행하였을 때 출력된 에러 메시지인데, 심지어 같은 정수형(int32, int64)임에도 불구하고 형변환을 지원하지 않는 걸 확인할 수 있다.

형변환은 int32(c), float32(a) 와 같이 타입명을 가지고 묶어주면 된다.

var a int32 = 1
var b float32 = 2.0
var c int64 = 3
d := float32(a) + b
e := a + int32(c)

타입을 변환할 때, 다른 언어들과 마찬가지로 실수를 정수로 변경하는 경우 소수점 아래 값들이 떼어진다는 점과, 큰 범위에서 작은 범위로 변환 시 비트가 잘려나가면서 값이 바뀐다는 점을 주의해야 한다.