오늘의 학습 목록
✅ 변수란 무엇인지 알아보자!
✅ Golang 에서 변수를 선언해보자
변수의 정의는 값을 저장하는 메모리 공간을 가리키는 이름입니다.
컴퓨터는 계산의 연속이다. 계산을 용이하기 위해선 변수를 이용하면 쉽고 효과적으로 메모리에 있는 데이터를 조작할 수 있다. 즉 쉽고 효과적으로 메모리에 있는 데이터를 조작하기 위해 변수를 사용한다.
강타입 언어란 서로 다른 타입관 연산에 엄격한 언어를 뜻한다.
강타입 언어를 사용하게 되면 사용하기 까다로운 단점이 있지만, 타입으로 생길 수 있는 문제를 미연에 방지할 수 있다.
컴퓨터에게 값을 저장할 공간을 마련하라고 명령을 내리는 것이다.
또한 이것을 메모리 할당이라고 한다.
아래의 예제를 통해 변수를 선언해 보도록 하겠습니다.
var [variable name] [type] = value
var키워드 이외에 const(상수) 키워드도 존재한다.
프로그래머는 이름을 통해 값이 저장된 메모리 공간에 손쉽게 접근할 수 있다.
변숫값의 형태를 말한다.
변수가 가리키는 메모리 공간에 저장된 값이다.
아래의 예제 코드를 도식화 해보도록 하겠습니다.
package main
import "fmt"
func main() {
var a int = 97
var b int = 98
fmt.Println(a, b)
}
위 코드를 빌드하면 아래와 같은 상황을 볼 수 있습니다.
위에서 말했다 싶이 변수는 "값을 저장하는 메모리 공간을 가리키는 이름" 이라는 것을 확인 할 수 있습니다.
변수 이름을 변수명이라 합니다. Golang 에서 변수명을 선언할 때 주의해야 할 점이 있습니다.
아래는 변수를 선언할 때 지켜야 할 변수명 작성 규칙입니다.
- 변수명은 문자,
_
, 숫자를 사용해 지을 수 있지만 첫 글자는 반드시 문자나_
로 시작해야 한다.
올바른 예 ) abc, a,_
F, 하나_둘
틀린 예) 123, 1abc, %abc_
를 제외한 다른 특수문자(space 포함)을 포함할 수 없다.
올바른 예) ab_
c, golang_
good
틀린 예) ab~c, goalng&bad, [[aaa]]
반드시 지켜야 하는 것이 아니지만, 다음과 같이 권장 사항이 존재합니다.
- 변수명은 영문자를 제외한 다른 언어의 문자를 사용하지 않는다.
- 변수명은 여러 단어가 이어지면 두 번쨰 단어부터는 대문자로 시작한다. (카멜 표기법을 사용한다)
- 밑줄
_
은 일반적으로 사용하지 않으며,_
를 사용하는 경우는 함수와 패키지 부분에서 서 사용한다.
그러면 이제까지 변수와 변수 선언을 할 때 변수명 작성 규칙에 대해 알아보았다. 그러면 왜 타입이 필요할까?
타입이 필요한 이유는 두 가지 입니다.
타입은 공간 크기를 나타내기 때문이다.
변수를 정의할 때 값을 저장하는 메모리 공간을 가리키는 이름이다 라고 정의 했다.
하지만 변수를 엄밀히 정의 하자면 값을 저장하는 메모리 공간의 시작주소를 가리키는 이름 이라고 할 수 있다.
즉, 변수는 값을 저장하는 메모리 공간의 시작주소를 가지고 있기 때문에 타입의 크기를 이용해 해당 메모리 주소에서 얼마나 읽을지 결정할 수 있기 때문에 타입의 크기가 필요하다.
데이터를 해석하기 위함이다.
위에서 말했다 싶이 메모리 주소에서 얼마나 읽을지 결정해야 하기 때문에 타입이 필요하다 했다. 우리는 메모리 주소 관점에서 살펴봤지만, 컴파일러 입장에서는 정수형으로 데이터를 해석할 지 실수형으로 해석할 지 알아야 한다. 즉 데이터를 해석하기 위해 변수 타입이 필요하다.
Golang 에서 타입의 종류는 아래와 같습니다.
이름 | 설명 | 값의 범위 |
---|---|---|
unit32 | 4바이트 부호 없는 정수 | 0 ~ 4294967295 |
unit64 | 8바이트 부호 없는 정수 | 0 ~ 18446744073709551615 |
int8 | 1바이트 부호 있는 정수 | -128 ~ 127 |
int16 | 2바이트 부호 있는 정수 | -32768 ~ 32767 |
int32 | 4바이트 부호 있는 정수 | -2147483648 ~ 2147483647 |
int64 | 8바이트 부호 있는 정수 | -9223372036854775808 ~ 9223372036854775807 |
float32 | 4바이트 실수 | IEEE ~ 754 32비트 실수 |
float64 | 8바이트 실수 | IEEE ~ 754 64비트 실수 |
complex64 | 8바이트 복소수(진수, 가수) | 진수와 가수 범위는 float32 범위와 같음 |
complex128 | 16바이트 복소수(진수, 가수) | 진수와 가수 범위는 float64 범위와 같음 |
byte | unit8의 별칭, 1바이트 데이터를 나타낼 때 사용 | 0~255 |
rune | int32의 별칭, UTF_8로 문자 하나를 나타낼 때 사용 | -2147483648 ~ 2147483647 |
int | 32비트 컴퓨터에서는 int32, 64비트 컴퓨터에서는 int64와 같음 | |
unit | 32비트 컴퓨터에서는 unit32, 64비트 컴퓨터에서는 unit64와 같음 |
Golang 에서는 위 타입 말고 더 많은 타입들을 지원합니다.
이외 타입들은 아래와 같습니다.
참과 거짓 두 값만 가지는 타입이다. 선언은 bool로 하고, 참은 true, 거짓은 false 로 표현한다.
문자열을 사용할 때 가지는 타입이다.
같은 타입의 요소들로 이루어진 연속된 메모리 공간을 나타내는 자료구조 이다.
Go 언어에서 제공하는 기변 길이 배열을 말한다. 배열은 고정 길이인 반면, 슬라이스는 길이를 늘리거나 줄일 수 있다.
필드(변수)의 집합 자료구조이다. 보통 상관관계가 있는 데이터를 묶어 놓을 때 사용한다.
메모리 주소를 값으로 값는 타입이다. 포인터를 이용해서 같은 메모리 공간을 가리키는 여러 변수를 만들 수 있다.
함수를 가리키는 타입이다. 함수 타입을 함수 포인터라고도 한다. 사용할 함수를 동적으로 바꿀 때 유용하다.
메소드 정의의 집합이다.
키오 값을 갖는 데이터를 저장해둔 자료구조이다.
멀티스레드 환경에 특화된 큐 형태의 자료구조이다.
변수를 선언할 때 초기값을 생략하면 다음과 같은 표의 값이 자동적으로 대입되는 값을 말합니다.
타입 | 기본값 |
---|---|
모든 정수 타입 | 0 |
모든 실수 타입 | 0.0 |
불리언 | false |
문자열 | "" |
그외 | nil |
nill은 정의되지 않은 메모리 주소를 나타내는 Go 키워드이다.
요청) integer 라는 정수형 타입의 7를 대입한 변수를 선언해주세요
var integer int = 7
var integer = 7
integer := 7 // integer는 int 타입으로 자동 지정됩니다.
선언 대입문
선언 대입문이란 말 그대로 선언과 대입을 한꺼번에 하는 구문이다. 선언 대입문을 사용하면 var 키워드와 타입을 생략할 수 있다.
응답 2), 응답 3)은 좌변의 값에 따라 자동적으로 타입을 지정한다. 만약 우변이 숫자이면 int로, 실수면 float64가 기본타입이 된다.
Goalng 은 강타입 언어입니다. 그리고 자동으로 타입들을 변환해 주지 않습니다. 그 이유는 예기치 못한 에러를 미연에 방지하기 위함 입니다.
아래의 코드를 살펴보며 강타입언어의 느낌을 알아봅시다.
package main
func main() {
a := 3 // a는 int 타입으로 자동 지정된다.
var b float64 = 3.5 // b는 float64 타입이다.
var c int = b // ERROR - float 64의 값을 int타입으로 저장하려고 함.
d := a * b // ERROR - int 타입과 float64 타입의 결과값을 저장하려고 함.
var e int64 = 7
f := a * e // ERROR - int 타입과 int64타입의 결과값을 저장하려고 함.
Golang은 같은 정수형 계열의 타입이여도 명시된 타입이 다르면 에러가 난다는 점에 유의합시다.
위처럼 Golang은 강타입 언어이고 위 소스코드의 문제를 해결하기 위해서는 타입 변환이 필요합니다!
타입변환은 원하는 타입명을 적고 괄호 안에 변화시키고 싶은 변수를 묶어주어 사용합니다.
var X = type(variable)
위 예제를 에러없이 작성하면 다음과 같습니다.
package main
func main() {
a := 3
var b float64 = 3.5
var c int = int(b)
d := float64(a * c) // int 에서 float64로 변환
var e int64 = 7
f := int64(d) * e // float64에서 int64로 변환
타입 변환 시 유의점 두 가지가 있습니다.
위 코드에서 var c int = int(b)
코드는 c 값에 3이 대입된다.
아래 예를 보겠습니다.
package main
func main() {
var a int16 = 3312
var c int8 = int8(a)
}
위 예제에서 var c int8 = int8(a)
코드를 보면 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환했습니다. 위 코드를 도식화 하면 아래와 같습니다.
이처럼 c변수에는 3312 값이 아닌 상위 1바이트를 잃어 -16 값이 저장됩니다.
사람도 언젠가 죽는 듯이 변수도 언젠가 메모리상에서 사라지게 됩니다. 즉 범위가 존재한다는 뜻이죠
Golang 에서는 변수의 범위를 자신이 속한 중괄호를 벗어나면 사라집니다.
아래 예제를 살펴봅시다.
package main
var g int = 10
func main() {
var m int = 20
{
var s int = 50
} // s 지역변수는 사라짐
m = s + 20 // ERROR - 변수 s를 찾을 수 없음
} // m 지역변수 사라짐
// g 전역변수 사라짐
이처럼 변수는 자신이 속한 중괄호를 벗어나면 사라집니다.
그러면 Golang 에서는 어떻게 숫자와 실수를 표현할까요?
이 블로그글을 참고해주세요
블로글을 제작중입니다. 죄송합니다.
이 블로그글을 참고해주세요
블로글을 제작중입니다. 죄송합니다.
이처럼 오늘은 Golang에서 변수란 무엇인지 알아보고 Golang 에서 변수를 선언해 보았습니다.
즐기며 공부하자 오늘 수고하셨습니다.
이 포스팅은 "Tucker의 Go 언어 프로그래밍:Golang 입문부터 고급 기법까지, 재미있는 4가지 프로젝트와 함께"의 책을 기반으로 작성된 글임을 밝힙니다.