Pointer

다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다

Test

func main() {
	a := 2
	b := a
	a = 10
	fmt.Println(a, b)
}

위와 같이 int type의 변수 a를 만들고, 만들어진 a를 b에 넣어준다. 그리고, a를 10으로 변경한다면 a와 b의 값은 어떻게 될까?

출력

정답은 a는 10으로 변경되지만, b의 값은 변경되지 않는다. 그렇다면, 가리키는 메모리 주소가 다르다는 것이다. Go에서는 C와 같이 메모리 주소를 보기 위해서는 &를 변수명 앞에 사용하면 된다. 

테스트

func main() {
	a := 2
	b := a
	a = 10
	fmt.Println(&a, &b)
}

출력

예상과 같이 주소값이 다르게 나온다. 근데, 이상한 점이 있다. 왜.. 2바이트 차이가 나는거지...? 내 예상대로라면 4바이트 차이가 나야한다. size를 확인해보면 8로 나온다. os가 64bit이기 때문에 int64를 사용하는 것 같은데, 왜 2바이트 차이가 나는걸까..? 

출력

같은 코드로 여러번 돌려보면 2차이가 있을 때도, 8차이가 있을 때도 존재한다. a의 크기는 8바이트이기 때문에 8차이가 나야되는게 맞는 것 같은데 이상하다. 시스템적인 문제인 것 같다. a의 값으로 9223372036854775807를 넣어줘도 같은 형상이 나타나기 때문이다. 일단, 넘어가자.

 

Pointer를 쓰고싶다면 c언어와 같은 방식으로 사용하면 된다. 변수에 주소값을 넣어주는 것이다.

테스트

func main() {
	a := 2
	b := &a
	a = 10
	fmt.Println(&a, b)
}

출력

a가 가리키는 주소값과 b의 값이 일치하는 것을 볼 수 있다. 값을 확인하기 위해서는 c언어와 같은 방식으로 사용하면된다.

테스트

func main() {
	a := 2
	b := &a
	a = 10
	fmt.Println(a, *b)
}

출력

b는 a주소를 가리키고 있기때문에, a의 값을 변경하면 b도 같이 바뀌는 것을 확인할 수 있다. 물론, b를 이용해서 값을 변경할 수도 있다.

테스트

func main() {
	a := 2
	b := &a
	*b = 10
	fmt.Println(a, *b)
}

출력

 

Pointer의 경우 C와 매우 같은 구조를 가지고있는 것을 볼 수 있다.

 

 

'Go' 카테고리의 다른 글

Maps  (0) 2023.12.30
Arrays/Slices  (0) 2023.12.29
If/switch  (0) 2023.12.28
for, range, args  (0) 2023.12.28
Functions  (0) 2023.12.28

+ Recent posts