🔥 포인터
389자
5분
Go 언어는 포인터를 지원하는데요. 포인터는 값의 메모리 주소를 가지고 있어요.
T
타입은T
값에 대한 포인터예요. 포인터의 기본값은nil
이에요.
var p *int
go
&
연산자는 피연산자에 대한 포인터를 생성한답니다.
i := 42 p = &i
go
- 연산자는 포인터가 가리키는 값을 나타내요.
fmt.Println(*p) // p 포인터를 통해 i 값을 읽어옵니다 *p = 21 // p 포인터를 통해 i 값을 설정합니다
go
이것을 "역참조" 또는 "간접 참조"라고 해요.
C언어와 달리 Go 언어는 포인터 연산을 지원하지 않아요.
아래는 포인터를 사용하는 예제 코드예요:
package main import "fmt" func main() { i, j := 42, 2701 p := &i // i를 가리키는 포인터 fmt.Println(*p) // 포인터를 통해 i 값을 읽어옵니다 *p = 21 // 포인터를 통해 i 값을 변경합니다 fmt.Println(i) // i의 새로운 값을 확인해 봅니다 p = &j // j를 가리키는 포인터 *p = *p / 37 // 포인터를 통해 j 값을 37로 나눕니다 fmt.Println(j) // j의 새로운 값을 확인해 봅니다 }
go
위 코드를 한 줄씩 자세히 살펴볼게요.
i, j := 42, 2701
go
i
와j
변수를 선언하고 각각 42와 2701로 초기화합니다.
p := &i // i를 가리키는 포인터
go
p
변수를i
의 주소로 초기화하는 포인터로 선언합니다.
fmt.Println(*p) // 포인터를 통해 i 값을 읽어옵니다
go
p
포인터가 가리키는 값, 즉i
값을 출력합니다.
*p = 21 // 포인터를 통해 i 값을 변경합니다
go
p
포인터가 가리키는 값, 즉i
값을 21로 변경합니다.
fmt.Println(i) // i의 새로운 값을 확인해 봅니다
go
i
변수의 값을 출력하여 21로 변경되었음을 확인합니다.
p = &j // j를 가리키는 포인터
go
p
포인터를j
의 주소로 변경합니다. 이제p
는j
를 가리킵니다.
*p = *p / 37 // 포인터를 통해 j 값을 37로 나눕니다
go
p
포인터가 가리키는 값, 즉j
값을 37로 나눕니다.
fmt.Println(j) // j의 새로운 값을 확인해 봅니다
go
j
변수의 값을 출력하여 73으로 변경되었음을 확인합니다. (2701 / 37 = 73)
위의 예제를 통해 포인터를 선언하고 사용하는 기본적인 방법을 배웠어요. 포인터는 메모리 주소를 저장하고 해당 주소에 저장된 값을 간접적으로 접근할 수 있게 해준답니다.
Go에서는 포인터 연산을 지원하지 않기 때문에 포인터로 배열이나 구조체 요소에 접근할 때는 인덱스나 필드 이름을 사용해야 해요. 예를 들어 *p++
와 같은 포인터 연산은 불가능하죠.
포인터는 Go에서 자주 사용되며, 특히 구조체, 함수 매개변수, 리턴 값 등에서 효율적인 메모리 사용을 위해 활용된답니다. 포인터를 잘 이해하고 활용하면 Go 프로그램의 성능을 높일 수 있어요.