# [Go] 변수 메모리영역

natae·2022년 8월 11일
0

## Golang

목록 보기
2/11

### 개요

• golang의 변수 타입별 메모리영역 확인

### 코드

// go 1.18
package study

import "fmt"

type Pos struct {
x, y int
}

var globalPos Pos
var globalPosPtr *Pos
var globalNum int
var globalNumPtr *int
var globalSlice []int = make([]int, 2)
var globalSlicePtr *[]int
var globalMap map[int]int
var globalMapPtr *map[int]int
var globalChan chan int
var globalChanPtr *chan int

func VariableTest() {

localPos := Pos{}
localPosPtr := &Pos{}

var localNum int
var localNumPtr *int

var localSlice []int
localSlice = []int{1, 2}
var localSlicePtr *[]int

var localMap map[int]int
var localMapPtr *map[int]int

var localChan chan int
var localChanPtr *chan int

fmt.Printf("globalPos:\t %p\n", &globalPos)
fmt.Printf("globalNum:\t %p\n", &globalNum)
fmt.Printf("globalSlice:\t %p %p %p\n", &globalSlice, &globalSlice[0], &globalSlice[1])
fmt.Printf("globalMap:\t %p\n", &globalMap)
fmt.Printf("globalChan:\t %p\n", &globalChan)

fmt.Printf("globalPosPtr:\t %p\n", &globalPosPtr)
fmt.Printf("globalNumPtr:\t %p\n", &globalNumPtr)
fmt.Printf("globalSlicePtr:\t %p\n", &globalSlicePtr)
fmt.Printf("globalMapPtr:\t %p\n", &globalMapPtr)
fmt.Printf("globalChanPtr:\t %p\n", &globalChanPtr)

fmt.Printf("localPos:\t %p\n", &localPos)
fmt.Printf("localNum:\t %p\n", &localNum)
fmt.Printf("localSlice:\t %p %p %p\n", &localSlice, &localSlice[0], &localSlice[1])
fmt.Printf("localMap:\t %p\n", &localMap)
fmt.Printf("localChan:\t %p\n", &localChan)

fmt.Printf("localPosPtr:\t %p\n", &localPosPtr)
fmt.Printf("localNumPtr:\t %p\n", &localNumPtr)
fmt.Printf("localSlicePtr:\t %p\n", &localSlicePtr)
fmt.Printf("localMapPtr:\t %p\n", &localMapPtr)
fmt.Printf("localChanPtr:\t %p\n", &localChanPtr)
}

### 출력

globalPos:	 0x104d13100
globalNum:	 0x104d12ef8
globalSlice:	 0x104ce4250 0x1400012c010 0x1400012c018
globalMap:	 0x104ce3df0
globalChan:	 0x104ce3de0
globalPosPtr:	 0x104ce3e08
globalNumPtr:	 0x104ce3e00
globalSlicePtr:	 0x104ce3e10
globalMapPtr:	 0x104ce3df8
globalChanPtr:	 0x104ce3de8
localPos:	 0x1400012c020
localNum:	 0x1400012c008
localSlice:	 0x1400011e018 0x1400012c040 0x1400012c048
localMap:	 0x14000126030
localChan:	 0x14000126040
localPosPtr:	 0x14000126018
localNumPtr:	 0x14000126020
localSlicePtr:	 0x14000126028
localMapPtr:	 0x14000126038
localChanPtr:	 0x14000126048

### 추론

1. 전역 변수와 로컬 변수의 메모리 주소 영역이 완전히 다름
2. 메모리 영역은 일반 변수, Slice 포인터 변수, 포인터 변수 세 영역으로 나뉨
3. map, chan은 기본적으로 포인터(기본형, 포인트형의 메모리 영역이 동일), Slice도 포인터지만 별도의 영역을 사용
4. 로컬 및 전역 Slice의 원소의 메모리 영역은 일반 로컬 변수의 영역과 동일

### 결론

1. 전역 변수는 로컬 변수보다 메모리 주소대가 낮음
-> 전역 변수는 데이터 영역
2. 로컬 일반 변수는 로컬 포인터 변수보다 메모리 주소대가 높음
-> 로컬 일반 변수는 스택 영역, 로컬 포인터 변수는 힙 영역
3. (몇차례 더 테스트 해본 결과) 로컬 Slice 변수는 메모리 주소대가 랜덤
-> Slice는 포인터이고, 가비지컬렉션에 의해 정리되므로 힙 영역으로 추정
서버 프로그래머