🔥 포인터를 통한 구조체 필드 접근

228자
3분

구조체 포인터를 통해 구조체의 필드에 접근할 수 있습니다.

구조체 포인터 p를 통해 구조체의 X 필드에 접근하려면 (*p).X와 같이 작성할 수 있지만, 이 표기법은 다소 번거롭습니다. 그래서 Go 언어에서는 명시적인 역참조 없이 그냥 p.X라고 쓸 수 있도록 허용하고 있습니다.

다음 코드를 살펴봅시다:

package main
 
import "fmt"
 
type Vertex struct {
    X int
    Y int
}
 
func main() {
    v := Vertex{1, 2}   // Vertex 구조체 변수 v를 선언하고 초기값을 설정합니다.
    p := &v             // v의 주소를 구조체 포인터 p에 할당합니다.
    p.X = 1e9           // 구조체 포인터 p를 통해 v의 X 필드 값을 1e9로 변경합니다.
    fmt.Println(v)      // 변경된 v의 값을 출력합니다.
}
 
go

위 코드에서는 다음과 같은 순서로 동작이 이뤄집니다:

  1. Vertex 구조체 타입을 정의합니다. 이 구조체는 XY라는 두 개의 int 타입 필드를 가집니다.
  2. main 함수에서 Vertex 구조체 변수 v를 선언하고 {1, 2}로 초기화합니다.
  3. v의 주소를 구조체 포인터 p에 할당합니다. 이제 pv를 가리키는 포인터입니다.
  4. 구조체 포인터 p를 통해 vX 필드 값을 1e9로 변경합니다. 여기서 p.X라고 쓰면 자동으로 역참조되어 (*p).X와 같이 동작합니다.
  5. 변경된 v의 값을 출력합니다. {1000000000 2}가 출력될 것입니다.

이처럼 구조체 포인터를 통해 간편하게 구조체의 필드에 접근하고 값을 변경할 수 있습니다. 명시적인 역참조 없이 . 연산자만으로 필드에 바로 접근할 수 있어 코드가 간결해집니다.

구조체 포인터를 활용하면 함수 내에서 구조체의 필드를 직접 변경할 수 있게 되므로, 구조체 변수를 함수에 전달할 때 값 복사가 아닌 참조로 전달하여 메모리 사용량을 줄일 수 있습니다.