[golang] 포인터와 주소값
golang 에서 flag 포인터와 주소값을 사용하게 되었는데,
기본적인 건데도 개념이 확실하게 잡혀있지 않다보니 계속 헷갈렸다.
이 기회에 쉬운 예시를 통해서 확실하게 정리해보기로 했다.
변수를 선언하면 그림과 같이 메모리의 한 부분을 할당하여 선언한 값을 저장하고, 값이 저장된 공간 주소를 가지게 된다.
func main() {
var word = "Hello"
}
word 를 선언한 경우, 그림1처럼 주소 0000이라는 곳에 "Hello" 라는 string 값이 저장이 된다.
즉, 변수마다 고유의 주소를 할당받게 되는 것이다.
주소값(&)은 word의 "Hello" 가 아니라 그 주소값을 가져올 수 있다.
func main() {
var word = "Hello"
fmt.Println(word, &word)
}
결과 값 : Hello 0xc00220330
포인터(*)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다.
포인터 변수에 주소값을 대입하여 그 주소가 가지고 있는 value를 처리할 수 있다.
func main() {
var word = "Hello"
var *p = &word
fmt.Println(word, &word, *p)
}
결과 값 : Hello 0xc00220330 Hello
여기서 선언된 *p 는 word 의 주소값을 대입받아 Hello를 받아올 수 있으며, *p값을 변경하면 0xc00220330 주소에 저장된 Hello 값도 변경된다.
아래 예시를 보면 * 와 &를 더 자세히 이해할 수 있다.
func main() {
val := 1024
fmt.Println(val, &val)
callbyvalue(val)
fmt.Println(val, &val)
callbyref(&val)
fmt.Println(val, &val)
return
}
func callbyvalue(i int) {
i += 100
}
func callbyref(i *int) {
*i += 100
}
결과값 : 1024 0xc000010130
1024 0xc000010130
1124 0xc000010130
callbyvalue 에서는 새로운 i라는 변수에 1024라는 값을 저장하고, +100을 한 것이기 때문에 val 값에 영향이 없다.
하지만 callbyref 에서는 i 라는 *int 포인터가 val 의 주소값을 받아 val 값에 연결이 되었고, 연결된 값에 +100을 해주었기 때문데 결과적으로 1124라는 값이 출력된다.
여기까지 기초적이지만 헷갈렸던 개념을 정리해보았다!!:))