이번 포스팅에서는 Go 언어에서 변수를 선언하고 초기화하는 방법에 대해 알아보고자 한다.
< 목차 >
- 변수 선언
- 변수 선언의 다른 형태
- 타입 변환
프로그래밍에서 변수란 값을 저장하는 메모리 공간을 가리키는 이름이다. 변수를 이용해 값에 접근하고 값을 변경하는 데 사용한다. 변수는 이름, 값, 타입, 주소 속성을 갖는다. 또한 변수 간 값의 전달은 항상 복사를 통해 일어난다.
1. 변수 선언
변수를 사용하기 위해서는 우선 변수를 선언해야 한다. 변수 선언은 컴퓨터에게 값을 저장할 공간을 마련하라고 명령을 내리는 것과 같다. 다음은 Go 언어에서 변수를 선언하는 방식이다.
var aa int = 10
var 는 variable의 약자로 변수 선언을 알리는 키워드이다. aa는 변수 이름을 가리키고 int는 해당 변수가 어떤 타입인지를 나타낸다. 마지막으로 대입연산자 = 을 사용해 초기값 10으로 초기화한다.
👉 변수의 4가지 속성
- 이름 : 프로그래머는 변수 이름을 통해 값이 저장된 메모리 공간에 손쉽게 접근할 수 있다.
- 값 : 변수가 가리키는 메모리 공간에 저장된 값이다.
- 주소 : 변수가 저장된 메모리 공간의 시작 주소를 말한다.
- 타입 : 변수 값의 형태를 말한다. 정수 타입, 실수 타입, 문자열 등의 다양한 타입들이 존재한다. 자료형 혹은 데이터 타입이라고도 한다.
위와 같이 변수 aa를 선언하면 컴퓨터는 메모리에 int 타입 크기에 해당하는 공간을 할당하고 그 공간이 위치한 메모리 시작 주소를 aa로 지칭한다. 그리고 메모리 공간에 10이라는 값을 복사한다.
2. 변수 선언의 다른 형태
Go 언어에서는 다양한 형태의 변수 선언을 지원하고 있다.
👉 기본 형태
var a int = 1
👉 초기값 생략. 초기값은 타입별 기본값으로 대체.
변수를 선언할 때 초기값을 생략하면 기본값이 자동으로 대입된다.
var b int
타입 | 기본값 |
모든 정수 타입 ( int8, int16, int32, int64, uint8, uint16, uint32, uint64, int, uint, byte, rune ) |
0 |
모든 실수 타입 ( float32, float64, complex64, complex128 ) |
0.0 |
불리언 | false |
문자열 | "" ( 빈 문자열 ) |
그 외 | nil ( 정의되지 않은 메모리 주소를 나타내는 Go 키워드 ) |
👉 타입 생략. 변수 타입은 우변 값의 타입이 됨.
타입을 생략할 경우 우변의 타입으로 좌변(변수)의 타입이 지정된다. 만약 우변이 숫자이면 기본 타입으로 결정된다. 정수는 int , 실수는 float64 가 기본 타입이다.
var c = 2
👉 선언 대입문 := 를 사용해서 var 키워드와 타입 생략.
선언 대입문이란 말 그대로 선언과 대입을 한꺼번에 하는 구문이다. 선언 대입문을 사용하면 var 키워드와 타입을 생략해 변수를 선언할 수 있다.
d := 3
// d는 int 타입으로 자동 지정된다.
package main
import "fmt"
func main() {
var a int = 1
var b int
var c = 2
d := 3
fmt.Println(a, b, c, d)
}
// output : 1 0 2 3
3. 타입 변환
프로그래밍 언어를 구분할 때 타입 검사를 하는가 안 하는가에 따라 강 타입 언어와 약 타입 언어로 구분한다. Go 언어는 강 타입 언어 중에서도 가장 강하게 타입 검사를 하는 최강 타입 언어이다. 따라서 Go 언어에서는 연산이나 대입에서 타입이 다를 경우 에러가 발생한다.
a := 1 // int
var b float64 = 2.5 // float64
var c int = b // Error - float64 변수를 int에 대입 불가
d := a * b // Error - 다른 타입인 int 변수와 float64 연산 불가
var e int64 = 5 // int64
f := a * e // Error - a는 int 타입, e는 int64 타입으로 같은 정수값이지만
// 타입이 달라서 연산 불가
위의 예제 코드에서처럼 Go 언어에서는 같은 숫자값이라도 타입이 다르면 연산이 되지 않기 때문에 타입을 변환해서 연산을 해줘야 한다. 이를 타입 변환이라고 한다. 타입 변환은 원하는 타입명을 적고 ( )로 변환시키고 싶은 변수를 묶어주면 된다. 타입 변환을 이용해서 위의 예제 코드를 에러 없이 다시 써보도록 하자.
a := 1 // int
var b float64 = 2.5 // float64
var c int = int(b) // float64에서 int로 변환
d := float64(a * c) // int에서 float64로 변환
var e int64 = 7 // int64
f := int64(a) * e // int에서 int64로 변환
타입 변환을 할 때는 두가지 유의사항이 있다. 첫째, 실수 타입에서 정수 타입으로 타입 변환하면 소수점 이하의 숫자가 없어진다는 점이다. (소수점 이하 숫자는 반올림 되지 않고 버려진다.) 따라서 Go언어에서는 다음 두 연산의 결과가 같지 않다.
package main
import "fmt"
func main() {
var aa float64 = 3.5
b := int(aa * 3)
c := int(aa) * 3
fmt.Println(b, c)
}
// output : 10, 9
두번째 유의사항은 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환하면 값이 달라질 수 있다는 점이다.
package main
import "fmt"
func main() {
var a int16 = 3456
var b int8 = int8(a)
fmt.Println(a)
fmt.Println(b)
}
// output
// 3456
// -128
위의 예제코드에서처럼 타입 변환을 하게되면 a의 값이 3456에서 -128로 변하게 된다. 이는 2바이트 정수 int16에서 1바이트 정수 int8로 변환할 때 상위 1바이트가 없어지기 때문에 나타난 결과이다.
Reference
- Tucker의 Go 언어 프로그래밍
'Go' 카테고리의 다른 글
Golang 시작하기 (0) | 2024.12.09 |
---|