[go] Go 언어에서 메소드의 값 전달 방식

Go 언어에서는 메소드의 값 전달 방식이 기본적으로 적용됩니다. 이는 기존의 객체 지향 언어에서 사용되는 참조 전달 방식과 다른 특징입니다.

값 복사

Go 언어에서 메소드를 호출할 때, 메소드의 복사되어 전달됩니다. 이는 원래의 값과 메소드에서 받은 값이 서로 독립적으로 존재하게 됨을 의미합니다. 메소드에서 값을 변경하더라도 원래의 값에는 영향을 주지 않습니다.

package main

import "fmt"

type Rectangle struct {
    width  float64
    height float64
}

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    fmt.Println("원래 값:", rect)   // {10 5}
    
    area := rect.Area()
    
    fmt.Println("메소드 호출 후 값:", rect)  // {10 5}
    fmt.Println("계산된 면적:", area)       // 50
}

위의 예제에서 Rectangle 구조체에 Area 메소드를 정의하였습니다. Area 메소드는 Rectangle 구조체의 면적을 계산하여 반환합니다.

main 함수에서 Rectangle 객체를 생성하고, Area 메소드를 호출하여 면적을 계산합니다. 하지만, 메소드에서 면적을 계산하더라도 rect 객체의 값에는 영향을 주지 않고 독립적으로 처리됩니다.

따라서 rect 객체의 값을 출력해도 메소드 호출 이후에도 원래의 값과 동일한 결과를 얻을 수 있습니다.

값 포인터

원하는 경우, Go 언어에서는 메소드의 값을 복사하지 않고 포인터로 전달하는 방식을 사용할 수 있습니다. 이를 통해 메소드에서 원래의 객체를 변경할 수 있습니다.

package main

import "fmt"

type Rectangle struct {
    width  float64
    height float64
}

func (r *Rectangle) Scale(scaleFactor float64) {
    r.width *= scaleFactor
    r.height *= scaleFactor
}

func main() {
    rect := &Rectangle{width: 10, height: 5}
    fmt.Println("원래 값:", rect)   // &{10 5}
    
    rect.Scale(2)
    
    fmt.Println("메소드 호출 후 값:", rect)  // &{20 10}
}

위의 예제에서는 Rectangle 구조체를 포인터로 선언하여 메소드에 전달하고 있습니다. Scale 메소드는 Rectangle 구조체의 너비와 높이에 지정된 배율을 곱하여 크기를 조절합니다.

main 함수에서 Rectangle 객체를 포인터로 생성하고, Scale 메소드를 호출하여 크기를 조절합니다. 이때, 메소드에 포인터로 전달되므로 메소드에서의 변경이 원래의 객체에도 반영되게 됩니다.

따라서 메소드 호출 이후에 rect 객체의 값이 변경되어 있는 것을 확인할 수 있습니다.

결론

Go 언어에서 메소드의 값 전달 방식은 기본적으로 복사 방식이지만, 포인터를 사용하여 참조 방식으로 전달하는 것도 가능합니다. 값 복사 방식은 원래의 객체에 영향을 주지 않으면서 독립적으로 처리됩니다. 반면, 포인터를 사용할 경우 원래의 객체를 변경할 수 있습니다.

이러한 특징을 이해하고 올바르게 활용하여 Go 언어의 메소드를 적절하게 사용하는 것이 중요합니다.


참고문서: