반응형
Java와의 차이점
- Java의 참조 타입과 값 타입
- Java에는 원시 타입(primitive type)과 참조 타입(reference type) 존재
- 모든 객체는 참조 타입이며, 메서드 호출 시 객체를 참조로 전달한다
- Java의 객체는 명시적으로 포인터를 사용할 필요가 없다. 모든 객체 변수는 자동으로 참조 타입으로 동작한다
- Go값 타입과 포인터 타입
- 값 타입은 변수의 값을 직접 저장하고, 포인터 타입은 변수의 주소를 저장한다
- 포인터 타입은 메모리의 특정 위치를 가리키며, 이를 통해 원본 데이터를 수정할 수 있다
Go에서 포인터 타입의 사용 예
- 원본 데이터 수정
- 포인터를 사용하면 함수나 메서드에서 원본 데이터를 수정할 수 있다
- 값 타입을 사용하면 데이터의 복사본을 전달하므로 원본 데이터는 수정되지 않는다
- 메모리 사용 효율
- 큰 구조체(struct)나 데이터 블록을 함수에 전달할 때, 값 타입을 사용하면 데이터가 복사된다
- 이 경우 메모리 사용량이 증가할 수 있다
- 포인터를 사용하면 데이터의 주소만 전달하므로 메모리를 더 효율적으로 사용할 수 있다
- 예제
package main
import "fmt"
type Person struct {
Name string
Age int
}
// 포인터 타입 수신자
func (p *Person) SetName(name string) {
p.Name = name
}
// 값 타입 수신자
func (p Person) Greet() {
fmt.Println("Hello, my name is", p.Name)
}
func main() {
person := Person{Name: "Alice", Age: 30}
// 포인터를 전달하여 원본 데이터를 수정
person.SetName("Iron")
// 값 타입 수신자 메서드를 호출하여 데이터 출력
person.Greet()
}
- 다음과 같이 인터페이스를 구현할 때, 값 타입과 포인터 타입을 혼재해서 사용하면 컴파일 에러 발생
package main
import "fmt"
type Person struct {
Name string
Age int
}
type Greeter interface {
Greet()
SetName(name string)
}
func (p Person) Greet() { // 값 타입 수신자
fmt.Println("Hello, my name is", p.Name)
}
func (p *Person) SetName(name string) { // 포인터 타입 수신자
p.Name = name
}
func main() {
var g Greeter
g = Person{Name: "Alice", Age: 30} // 값 타입 할당
g.SetName("Iron") // 컴파일 오류: 인터페이스는 포인터 타입 메서드를 호출할 수 없음
g.Greet()
}
반응형
LIST
'언어 > GO' 카테고리의 다른 글
Go의 Context (1) | 2024.06.30 |
---|---|
Go 고루틴(goroutine) 정리 (0) | 2024.06.29 |