[Go] 변수

JunBeomHan·2023년 2월 13일
0

Go

목록 보기
1/2

오늘의 학습 목록

✅ 변수란 무엇인지 알아보자!
✅ Golang 에서 변수를 선언해보자

🥡 변수란 무엇인지 알아보자!

1. 변수란 "값을 저장하는 메모리 공간을 가리키는 이름이다"

변수의 정의는 값을 저장하는 메모리 공간을 가리키는 이름입니다.

그러면 변수를 사용하는 이유는 무엇일까?

컴퓨터는 계산의 연속이다. 계산을 용이하기 위해선 변수를 이용하면 쉽고 효과적으로 메모리에 있는 데이터를 조작할 수 있다. 즉 쉽고 효과적으로 메모리에 있는 데이터를 조작하기 위해 변수를 사용한다.

2. Go언어는 강타입 언어이다.

강타입 언어란 무엇일까?

강타입 언어란 서로 다른 타입관 연산에 엄격한 언어를 뜻한다.
강타입 언어를 사용하게 되면 사용하기 까다로운 단점이 있지만, 타입으로 생길 수 있는 문제를 미연에 방지할 수 있다.

👉 Golang 에서 변수를 선언해보자

1. Golang 에서는 아래와 같이 변수 선언을 한다.

변수 선언이란 무엇일까?

컴퓨터에게 값을 저장할 공간을 마련하라고 명령을 내리는 것이다.
또한 이것을 메모리 할당이라고 한다.

아래의 예제를 통해 변수를 선언해 보도록 하겠습니다.

var [variable name] [type] = value

var는 variable 의 약자로써, 변수 선언을 알리는 키워드 이다.

var키워드 이외에 const(상수) 키워드도 존재한다.

[variable name]은 변수 이름을 적어준다.

프로그래머는 이름을 통해 값이 저장된 메모리 공간에 손쉽게 접근할 수 있다.

[type] 변수의 타입을 적어준다.

변숫값의 형태를 말한다.

[value] 초기값을 적어준다.

변수가 가리키는 메모리 공간에 저장된 값이다.

2. 변수의 선언 후 컴퓨터 상황을 도식화 해보자.

아래의 예제 코드를 도식화 해보도록 하겠습니다.

package main

import "fmt"

func main() {
	var a int = 97
	var b int = 98

	fmt.Println(a, b)
}

위 코드를 빌드하면 아래와 같은 상황을 볼 수 있습니다.

위에서 말했다 싶이 변수는 "값을 저장하는 메모리 공간을 가리키는 이름" 이라는 것을 확인 할 수 있습니다.

3. 변수명을 선언할 때 규칙에 따르자.

변수 이름을 변수명이라 합니다. Golang 에서 변수명을 선언할 때 주의해야 할 점이 있습니다.
아래는 변수를 선언할 때 지켜야 할 변수명 작성 규칙입니다.

  1. 변수명은 문자, _, 숫자를 사용해 지을 수 있지만 첫 글자는 반드시 문자나 _로 시작해야 한다.
    올바른 예 ) abc, a, _F, 하나_둘
    틀린 예) 123, 1abc, %abc
  2. _를 제외한 다른 특수문자(space 포함)을 포함할 수 없다.
    올바른 예) ab_c, golang_good
    틀린 예) ab~c, goalng&bad, [[aaa]]

반드시 지켜야 하는 것이 아니지만, 다음과 같이 권장 사항이 존재합니다.

  1. 변수명은 영문자를 제외한 다른 언어의 문자를 사용하지 않는다.
  2. 변수명은 여러 단어가 이어지면 두 번쨰 단어부터는 대문자로 시작한다. (카멜 표기법을 사용한다)
  3. 밑줄 _은 일반적으로 사용하지 않으며, _를 사용하는 경우는 함수와 패키지 부분에서 서 사용한다.

4. 변수의 타입들

그러면 이제까지 변수와 변수 선언을 할 때 변수명 작성 규칙에 대해 알아보았다. 그러면 왜 타입이 필요할까?

타입이 왜 필요한 이유

타입이 필요한 이유는 두 가지 입니다.

  1. 타입은 공간 크기를 나타내기 때문이다.

    변수를 정의할 때 값을 저장하는 메모리 공간을 가리키는 이름이다 라고 정의 했다.
    하지만 변수를 엄밀히 정의 하자면 값을 저장하는 메모리 공간의 시작주소를 가리키는 이름 이라고 할 수 있다.
    즉, 변수는 값을 저장하는 메모리 공간의 시작주소를 가지고 있기 때문에 타입의 크기를 이용해 해당 메모리 주소에서 얼마나 읽을지 결정할 수 있기 때문에 타입의 크기가 필요하다.
  1. 데이터를 해석하기 위함이다.

    위에서 말했다 싶이 메모리 주소에서 얼마나 읽을지 결정해야 하기 때문에 타입이 필요하다 했다. 우리는 메모리 주소 관점에서 살펴봤지만, 컴파일러 입장에서는 정수형으로 데이터를 해석할 지 실수형으로 해석할 지 알아야 한다. 즉 데이터를 해석하기 위해 변수 타입이 필요하다.

Golang 에서 타입의 종류는 아래와 같습니다.

이름설명값의 범위
unit324바이트 부호 없는 정수0 ~ 4294967295
unit648바이트 부호 없는 정수0 ~ 18446744073709551615
int81바이트 부호 있는 정수-128 ~ 127
int162바이트 부호 있는 정수-32768 ~ 32767
int324바이트 부호 있는 정수-2147483648 ~ 2147483647
int648바이트 부호 있는 정수-9223372036854775808 ~ 9223372036854775807
float324바이트 실수IEEE ~ 754 32비트 실수
float648바이트 실수IEEE ~ 754 64비트 실수
complex648바이트 복소수(진수, 가수)진수와 가수 범위는 float32 범위와 같음
complex12816바이트 복소수(진수, 가수)진수와 가수 범위는 float64 범위와 같음
byteunit8의 별칭, 1바이트 데이터를 나타낼 때 사용0~255
runeint32의 별칭, UTF_8로 문자 하나를 나타낼 때 사용-2147483648 ~ 2147483647
int32비트 컴퓨터에서는 int32, 64비트 컴퓨터에서는 int64와 같음
unit32비트 컴퓨터에서는 unit32, 64비트 컴퓨터에서는 unit64와 같음

5. 이외 타입들

Golang 에서는 위 타입 말고 더 많은 타입들을 지원합니다.
이외 타입들은 아래와 같습니다.

boolean

참과 거짓 두 값만 가지는 타입이다. 선언은 bool로 하고, 참은 true, 거짓은 false 로 표현한다.

string

문자열을 사용할 때 가지는 타입이다.

배열

같은 타입의 요소들로 이루어진 연속된 메모리 공간을 나타내는 자료구조 이다.

슬라이스

Go 언어에서 제공하는 기변 길이 배열을 말한다. 배열은 고정 길이인 반면, 슬라이스는 길이를 늘리거나 줄일 수 있다.

구조체

필드(변수)의 집합 자료구조이다. 보통 상관관계가 있는 데이터를 묶어 놓을 때 사용한다.

포인터

메모리 주소를 값으로 값는 타입이다. 포인터를 이용해서 같은 메모리 공간을 가리키는 여러 변수를 만들 수 있다.

함수 타입

함수를 가리키는 타입이다. 함수 타입을 함수 포인터라고도 한다. 사용할 함수를 동적으로 바꿀 때 유용하다.

인터페이스

메소드 정의의 집합이다.

키오 값을 갖는 데이터를 저장해둔 자료구조이다.

채널

멀티스레드 환경에 특화된 큐 형태의 자료구조이다.

6. 타입별 기본값

기본값이란

변수를 선언할 때 초기값을 생략하면 다음과 같은 표의 값이 자동적으로 대입되는 값을 말합니다.

타입기본값
모든 정수 타입0
모든 실수 타입0.0
불리언false
문자열""
그외nil

nill은 정의되지 않은 메모리 주소를 나타내는 Go 키워드이다.

7. 다른 변수 선언의 형태

요청) integer 라는 정수형 타입의 7를 대입한 변수를 선언해주세요

응답 1)

var integer int = 7

응답 2)

var integer = 7

응답 3)

integer := 7 // integer는 int 타입으로 자동 지정됩니다.

선언 대입문
선언 대입문이란 말 그대로 선언과 대입을 한꺼번에 하는 구문이다. 선언 대입문을 사용하면 var 키워드와 타입을 생략할 수 있다.

숫자값 기본 타입

응답 2), 응답 3)은 좌변의 값에 따라 자동적으로 타입을 지정한다. 만약 우변이 숫자이면 int로, 실수면 float64가 기본타입이 된다.

8. 타입 변환

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로 변환

타입변환 시 유의 해야 할 점

타입 변환 시 유의점 두 가지가 있습니다.

1. 실수 타입에서 정수 타입으로 타입 변화하면 소수점 이하 숫자가 없어진다.

위 코드에서 var c int = int(b) 코드는 c 값에 3이 대입된다.

2. 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환하며 값이 달라질 수 있다.

아래 예를 보겠습니다.

package main

func main() {
	var a int16 = 3312
    var c int8 = int8(a)
}

위 예제에서 var c int8 = int8(a) 코드를 보면 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환했습니다. 위 코드를 도식화 하면 아래와 같습니다.

이처럼 c변수에는 3312 값이 아닌 상위 1바이트를 잃어 -16 값이 저장됩니다.

9. 변수의 범위

사람도 언젠가 죽는 듯이 변수도 언젠가 메모리상에서 사라지게 됩니다. 즉 범위가 존재한다는 뜻이죠
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 전역변수 사라짐

이처럼 변수는 자신이 속한 중괄호를 벗어나면 사라집니다.

10. 숫자 표현

그러면 Golang 에서는 어떻게 숫자와 실수를 표현할까요?

정수 표현

이 블로그글을 참고해주세요
블로글을 제작중입니다. 죄송합니다.

실수 표현

이 블로그글을 참고해주세요
블로글을 제작중입니다. 죄송합니다.

😇오늘은 이만

이처럼 오늘은 Golang에서 변수란 무엇인지 알아보고 Golang 에서 변수를 선언해 보았습니다.
즐기며 공부하자 오늘 수고하셨습니다.


이 포스팅은 "Tucker의 Go 언어 프로그래밍:Golang 입문부터 고급 기법까지, 재미있는 4가지 프로젝트와 함께"의 책을 기반으로 작성된 글임을 밝힙니다.

0개의 댓글