티스토리 뷰

Programming Language/Go

[Go] 포인터 & 참조 타입

SdardewValley 2021. 11. 12. 22:00
반응형

Go에서는 포인터와 참조 타입(슬라이스, 맵, 채널, 함수, 메서드)을 모두 제공한다. 참조 타입은 데이터를 직접 가지지 않고 데이터의 메모리 공간을 가리킨다. 포인터는 값에 접근 하는 수단이고 주소값을 직접 변경할 수 없다.

 

포인터 생성 & 초기화

포인터 변수는 *타입 방식으로 선언한다. 64비트 머신에서 포인터는 16바이트, 32비트 머신에서는 8바이트 크기를 가진다.

 

포인터를 생성하는 방식

1. 주소 연산자 &로 메모리 주소를 포인터 변수에 할당

2. new() 함수로 초기화한 메모리를 포인터 변수에 할당

 

&을 사용하여 포인터 생성

var p *int // 포인터 생성

value := 1024

p = &value // 메모리 주소 할당

 

p에는 주소 값이 저장되어 있다. 주소 값에 있는 값을 가져오기 위해서는 C와 마찬가지로 포인터 앞에 * 연산자를 붙이면 된다.

*p

 

p와 value의 관계

  • p == &i
  • *p == i

 

 

구조체 포인터

int 포인터 생성
int 포인터 출력 결과

 

struct 포인터 생성
struct 포인터 출력 결과

int 포인터를 출력하면 포인터의 주소값이 출력된다.

 

struct 포인터를 출력하면 주소값은 출력되지 않고 &구조체의 값이 함께 출력된다.

 

 

&을 사용하여 포인터 생성

 

new() 함수는 메모리 공간에 매개변수로 전달 받은 타입에 맞게 초기화를 하고 주소를 리턴한다.

 

new를 사용하여 포인터를 생성하고 값을 넣음
출력 결과

 

 

call by reference

Go에서 함수를 호출할 때 call-by-value 방식으로 동작한다.매개변수로 전달받은 값을 변경하고 싶다면 포인터를 사용하여 call-by-reference를 하면 된다.

 

슬라이스 전달
출력 결과

배열 대신 슬라이스를 함수에 전달하면, 참조가 전달 되어 시스템의 부담을 줄일 수 있다.

 

구조체도 슬라이스와 마찬가지로 포인터로 전달을 하면 시스템의 부담을 줄일 수 있다.

 

구조체 포인터를 사용하지 않을 때
출려결과

 

구조체 포인터를 사용했을 때
출력결과

구조체 포인터를 사용한 경우 구조체의 값이 변경되었다. 구조체도 call-by-value 방식으로 동작하는 것을 확인할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함