[go] 구조체(struct)의 값 복사와 참조 복사의 차이

Go 언어에서는 구조체(struct)를 사용하여 여러 데이터를 하나의 논리적인 단위로 묶을 수 있습니다. 이 구조체를 다룰 때 값 복사와 참조 복사의 차이를 이해하는 것은 중요합니다. 이번 포스트에서는 이 둘의 차이를 알아보겠습니다.

값 복사 (Pass By Value)

값 복사는 구조체를 다른 변수에 할당할 때, 구조체의 모든 필드 값이 복사되는 방식을 의미합니다. 이는 원래 구조체와 새로운 변수가 독립적으로 동작한다는 것을 의미합니다. 즉, 원본 구조체를 변경해도 새로운 변수에는 영향을 주지 않습니다.

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := Person{Name: "John", Age: 30}
    p2 := p1

    p1.Name = "Adam"
    p1.Age = 35

    fmt.Println(p1) // 출력: {Adam 35}
    fmt.Println(p2) // 출력: {John 30}
}

위의 예제에서 p1p2는 독립적인 변수입니다. p1의 필드 값을 변경해도 p2에는 영향을 주지 않습니다.

참조 복사 (Pass By Reference)

참조 복사는 구조체를 다른 변수에 할당할 때, 구조체의 메모리 주소가 복사되는 방식을 의미합니다. 이는 원래 구조체와 새로운 변수가 같은 메모리를 참조하는 것을 의미합니다. 따라서 한쪽에서 구조체의 필드 값을 변경하면 다른 쪽에서도 변경된 값을 참조할 수 있습니다.

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := &Person{Name: "John", Age: 30}
    p2 := p1

    p1.Name = "Adam"
    p1.Age = 35

    fmt.Println(p1) // 출력: &{Adam 35}
    fmt.Println(p2) // 출력: &{Adam 35}
}

위의 예제에서 p1p2는 같은 메모리를 참조합니다. 따라서 p1의 필드 값을 변경하면 p2에서도 변경된 값을 참조할 수 있습니다.

결론

구조체를 다룰 때 값 복사와 참조 복사의 차이를 이해하는 것은 중요합니다. 값 복사를 사용하면 원본 구조체와 새로운 변수가 독립적으로 동작하고, 참조 복사를 사용하면 같은 메모리를 참조하는 변수가 생기게 됩니다. 이런 차이를 이해하여 적절한 방식을 선택하는 것이 프로그래밍에서 오류를 방지하고 정확성을 유지하는 데 도움이 됩니다.

참고 자료