본문 바로가기
Language/Golang

Golang (Go언어) 변수

by HeeWorld 2024. 10. 24.

Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.

 

Golang 마스코트 Gopher(고퍼)

 

 

변수란?

- 프로그래밍에서 변수(Variable)는 값을 저장하는 메모리 공간을 가르키는 이름(수학의 변수와 다름)

- 컴퓨터 입장에서 프로그램은 메모리에 있는 데이터를 언제 어떻게 변경할지를 나타낸 문서

 

- 값을 저장하는 위치 저장소는 하드디스크와 메모리 두 가지가 있음. 

  → 하드디스크는 데이터를 저장하는 공간이고 느리다는 단점이 있음 다만, 컴퓨터가 꺼졌을 때 데이터가 삭제되지 않음

  → 메모리는 속도가 빠른 대신 컴퓨터가 꺼졌을 때 데이터가 삭제 됨

  → 프로그램이 실행될 때 CPU가 메모리에서 값을 가지고(Copy) 와서 실행 함

 

package main

import "fmt"

func main() {
  var a int = 10    // a 변수 선언
  var msg string = "Hello Variable"      // msg 변수 선언
  
  a = 20    // a 값 변경
  msg = "Good Morning"    // msg 값 변경
  fmt.println(msg, a)    // msg와 a 값 출력
  
 }

 

 

a 변수 선언

- var=variable의 약자로 변수를 쓰고싶다고 알려주는 것

- a는 변수명으로 영문자 또는 숫자를 사용함

- int는 변수의 타입으로 어떤 형태의 타입을 가지고 있는지를 의미하며, integer(정수)의 약자

- = 는 대입 연산자 우변에 있는 값을 좌변에 넣어라 즉, 10이라는 값을 a에 넣어라. 라는 의미

 

msg 변수 선언

- msg라는 변수를 쓸거야 라는 의미

- string(타입) 문자열로 문자를 담을 수 있음

- 우변에는 문자를 사용해야하고, 문자열은 따옴표("")를 묶어서 사용함

 

a 값 변경

- 변수 값 변경 → 아까 위에서 a에 10이라는 값을 넣어둠. 그 값을 변경하는 것

- 대입 연산자(Assignment Operator,=) 우변에 있는 값을 좌변의 값에 넣는다(복사한다)

- 앞에서 선언한 a값의 공간에 20을 넣는 것

 

msg 값 변경

- msg 변수가 가르키는 공간에 우변의 값을 넣어라

 

msg와 a 값 출력

- 마지막으로, 변수 값 출력 fmt 패키지가 가지고 있는 println이라는 함수를 쓰겠다라는 의미로 msg와 a 변수의 값을들 출력함

- 변수가 가르키고 있는 메모리에 있는 데이터를 출력

 

메모리 어딘가에 변수 자리를 만들고, 값을 넣어주는 것

 

변수의 4가지 속성

 

1. 이름

- a가 이름이 되는 것 (프로그래머에게 중요한 것)

 

2. 값

- 변수가 가르키는 메모리 공간, 그 공간에 저장된 값

- a가 가르키는 메모리 공간의 값이 10이라는 의미

 

3. 주소

- 변수가 저장된 메모리 공간의 시작 주소

   → 메모리 상에 어떤 위치를 나타낼 때 주소가 있어야 함 (컴퓨터 입장에서 이름이 필요 없음)

- 0부터 시작해서 1byte 씩 번호를 매겨 변수의 위치를 나타냄

   → 컴퓨터 입장에서 0/1 밖에 모름, 변수 이름(a)은 의미가 없고 변수를 메모리 주소로 생각함

 

4. 타입

- 변수가 가르키고 있는 데이터의 형태

- 정수, 실수, 문자열이냐 등

- 사이즈를 가지고 있음

   → 공간은 범위를 나타냄 from과 to가 있음

   → from은 시작점을 나타냄 끝은 시작점에 +size를 더하면 끝(to)이 됨

- 타입의 사이즈는 고정(fixed)되어 있음

 

 

숫자 타입

- 부호 없는 정수 숫자는 unit, 부호 있는 정수 숫자는 int, 실수는 float로 나타내며 뒤에 붙는 숫자는 비트 단위를 의미

이름 설명 값의 범위
unit8 1바이트 부호 없는 정수 0 ~ 255
unit16 2바이트 부호 없는 정수 0 ~ 65535
unit32 4바이트 부호 없는 정수 0 ~ 4294967295
unit64 8바이트 부호 없는 정수 0 ~ 18446744073709551615
int8 1바이트 부호 있는 정수 -128 ~ 127
int32 2바이트 부호 있는 정수 -32768 ~ 32767
int64 4바이트 부호 있는 정수 -2147483647 ~ 2147483647
float32 4바이트 실수 IEEE-754 32비트 실수
float64 8바이트 실수 IEEE-754 64비트 실수
complex64 8바이트 복소수(진수, 가수) 진수와 가수 범위는 float32 범위와 같음
complex128 16바이트 복소수(진수, 가수) 진수와 가수 범위는 float64 범위와 같음
byte uint8의 별칭, 1바이트 데이터를 나타낼 때 사용 0 ~ 255
rune int32의 별칭, UTF-8로 문자 하나를 나타낼 때 사용 -2147483648 ~ 2147483647
int 32비트 컴퓨터에서는 int32, 64비트 컴퓨터에서는 int64와 같음  
uint 32비트 컴퓨터에서는 uint32, 64비트 컴퓨터에서는 uint64와 같음  

 

 

그외 타입

- 불리언(boolean): 참(true)과 거짓(false) 두 값만 가지는 타입

- 문자열(string)

- 배열(array): 같은 타입의 요소들로 이루어진 연속된 메모리 공간을 나타내는 자료구조 

- 슬라이스: Go 언어에서 제공하는 가변 길이 배열 (슬라이스는 길이를 늘리거나 줄일 수 있음)

- 구조체: 필드(변수)의 집합 자료구조

- 포인터: 메모리 주소를 값으로 갖는 타입

- 함수타입: 함수를 가르키는 타입이며, 다른 말로 함수 포인터라고 함 (사용할 함수를 동적으로 바꿀 때 유용)

- 인터페이스: 메서드 정의의 집합

- 맵: key와 vaule를 갖는 데이터를 저장해둔 자료구조

- 채널(Channel): 멀티스레드 환경에 특화된 큐 형태 자료구조

 

 

변수 선언의 다른 형태

- Go에서는 여러 형태의 변수 선언을 지원함

package main

import "fmt"

func main () {
  var a int = 3   // 가장 기본 형태
  var b int       // 초깃값 생략, default 값(0)으로 대체
  var c = 4       // 타입 생략, 변수 타입은 우변 값의 타입이 됨
  d := 5          // 가장 많이 사용하는 형태로, 선언 대입문 :=을 사용해서 var 키워드와 타입 생략
  
  fmt.Println(a, b, c, d)
 }

위 변수 실행 결화 (hello, 3.14는 실습 시 추가로 작성함)

 

 

타입 변환

- 연산의 각 항목의 타입은 반드시 같아야 함.

   → Go 언어는 최강 타입으로, int+int64 같이 다른 타입의 항목을 연산할 수 없음 (타입이 다르면 연산이 불가능)

 

<타입 변환 전>

package main

import "fmt"

func main() {
	a := 3        // int - 64 bit = int 64, Go는 int와 int64는 다른 타입으로 봄
	var b float64 = 3.5

	var c int = b      // error
	d := a * b         // a를 float64로 바꾸던지, b의 타입을 바꾸던지 해야함.

	var e int64 = 7
	f := a * e     // a는 int, e는 int64 타입으로 같은 정수지만 타입이 달라 연산 불가

	fmt.Println(a, b, c, d, e, f)
}

 

<타입 변환 후>

package main

import "fmt"

func main() {
	a := 3    // int
	var b float64 = 3.5   // float64

	var c int = int(b)     // 3.5 -> 3 (실수가 정수가 됨)
	d := float64(a) * b    // a를 float64로 바꾸던지, b의 타입을 바꾸던지 해야함.

	var e int64 = 7
	f := a * int(e)      // e를 int로 변환

	fmt.Println(a, b, c, d, e, f)
}

 

타입 변환 후 출력 값

'Language > Golang' 카테고리의 다른 글

Golang (Go언어) 함수(Function)  (2) 2024.10.30
Golang (Go언어) 연산자(Operator)  (0) 2024.10.26
Golang (Go언어) fmt 패키지  (3) 2024.10.26
Golang (Go 언어) 이란?  (5) 2024.10.22
Golang (Go 언어) 설치 (Mac)  (0) 2024.10.22