Go lang - 11 : 포인터 2

개발조아·2022년 3월 26일
0

go-lang

목록 보기
11/13

포인터, Pointer ?

포인터에 대해 어느정도 알고 있다고 가정하고 생략하며 진행한다.

일단 핵심은 변수가 저장된 메모리의 [주소 값] 을 활용하는 것이다.
주로 외부에서 변수를 수정하는 경우 사용한다.

올바른 포인터의 사용은 프로그램을 더 효율적이고
더 빠르게 만들어준다.

일단 문법을 살펴보면 다음과 같다

package main

import "fmt"

func main() {
	x := 3000
	y := "만큼 사랑해!"
	pointerX := &x	// 주소값
	pointerY := &y

	fmt.Println(pointerX)
	fmt.Println(pointerY)
	fmt.Println(*pointerX)	// 역 참조
	fmt.Println(*pointerY)

}

일단 Go 의 포인터 구문은 C/C++ 과 거의 같다
& : 메모리 주소 반환
* : 주소 값을 역으로 참조해서 메모리를 찾고 안에 값을 반환

포인터에 대한 쉬운 자료는 엄청 많다 (검색해보자)

여기서 차별점은 가비지 컬렉터도 사용하기 때문에 메모리 관리도 편리하다
빈 포인터는 nil로 초기화된다

포인터를 통해 업데이트

package main

import "fmt"

func update(i *int) {
	*i = 20
}

func main() {
	x := 3000
	y := "만큼 사랑해!"
	pointerX := &x // 주소값
	pointerY := &y

	update(pointerX)

	fmt.Println(pointerX)
	fmt.Println(pointerY)
	fmt.Println(*pointerX) // 역 참조
	fmt.Println(*pointerY)

}


update func 에서 pointerX가 가진 주소값을 복사했고
복사한 주소값이 가진 값을 역참조하고 값을 바꾼 것이다

이런 코드는 데이터 흐름이 복잡해질 수 있어 주의가 필요하다.
이는 가비지 컬렉터 성능과 관련있다

변수 수정을 위한 포인터 사용이 불가피 한 경우는
함수가 해당 포인터를 인터페이스로 예상할 때 뿐이라고 한다
이유는 제네릭이 아직 없기 때문이다.

그럼에도 성능개선을 위한 이점이 많다

추후 알고리즘 관련 포스팅에서 성능 차이를 확인해보자

profile
https://github.com/askePhoenix

0개의 댓글