Menu
Coddy logo textTech

포인터 리시버 vs 값 리시버

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 8번째.

메서드는 값 수신기 또는 포인터 수신기를 가질 수 있습니다. 값 수신기는 구조체의 복사본에서 작동합니다. 포인터 수신기는 원본 구조체에서 작동하며 해당 필드를 수정할 수 있습니다.

값 리시버 — 복사본에서 작동합니다

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// 이것은 원본을 수정하지 않습니다
func (c Counter) IncrementWrong() {
    c.Count++ // 복사본만 변경합니다!
}

포인터 리시버 — 원본을 수정합니다

// 이것은 원본을 수정합니다
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

둘을 함께 사용하기

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // 출력: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // 출력: 0
}

메서드가 데이터를 읽기만 할 때는 값 리시버(value receiver)를 사용하세요. 메서드가 구조체의 필드를 수정해야 할 때는 포인터 리시버(pointer receiver)(*StructName)를 사용하세요. Go는 자동으로 참조를 처리하므로, 두 가지 모두 동일한 방식으로 호출합니다.

challenge icon

챌린지

중급

올바른 리시버 타입을 사용하여 Wallet 구조체에 메서드를 추가하세요:

  • GetBalance — 값 리시버, 현재 잔액을 반환합니다
  • Deposit — 포인터 리시버, 잔액에 금액을 추가합니다
  • Withdraw — 포인터 리시버, 잔액이 충분한 경우에만 금액을 차감합니다

치트 시트

메서드는 **값 수신기(value receiver)** 또는 **포인터 수신기(pointer receiver)**를 가질 수 있습니다. 값 수신기는 구조체의 복사본에서 작동합니다. 포인터 수신기는 원본 구조체에서 작동하며 필드를 수정할 수 있습니다.

값 수신기(Value receiver) — 복사본에서 작동:

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

포인터 수신기(Pointer receiver) — 원본을 수정:

func (c *Counter) Increment() {
    c.Count++
}

메서드가 데이터를 읽기만 할 때는 값 수신기를 사용하세요. 메서드가 구조체의 필드를 수정해야 할 때는 포인터 수신기(*StructName)를 사용하세요.

직접 해보기

package main

import "fmt"

func main() {
    var balance, deposit, withdraw float64
    fmt.Scan(&balance, &deposit, &withdraw)

    w := Wallet{Balance: balance}

    fmt.Printf("Balance: %.2f\n", w.GetBalance())

    w.Deposit(deposit)
    fmt.Printf("After deposit: %.2f\n", w.GetBalance())

    w.Withdraw(withdraw)
    fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())

    fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨