Menu
Coddy logo textTech

포인터 리시버

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 8번째.

값 수신기는 구조체의 복사본을 대상으로 작동하는 반면, 포인터 수신기는 원래의 구조체 인스턴스를 직접 다룹니다. 포인터 수신기를 사용하여 메서드를 정의하면, 메서드는 구조체의 복사본이 아닌 구조체에 대한 포인터를 받기 때문에 원본 데이터를 수정할 수 있습니다.

포인터 리시버를 만들려면, 리시버 선언의 타입 이름 앞에 별표 *를 추가합니다:

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // 이것은 원본 구조체를 수정합니다
}

이 예제에서 (p *Person)은 포인터 리시버입니다. Person 인스턴스에서 haveBirthday 메서드를 호출하면, 메서드는 원본 구조체에 대한 포인터를 받습니다. 이 포인터를 통해 구조체 필드에 가해진 모든 변경 사항은 원본 데이터를 영구적으로 수정합니다.

포인터 리시버는 메서드가 구조체의 필드를 업데이트해야 할 때 필수적이며, 데이터의 상태를 변경하는 작업에 완벽합니다.

quiz icon실력 점검

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

quiz icon실력 점검

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

quiz icon실력 점검

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

challenge icon

챌린지

쉬움

이 챌린지에서는 간단한 은행 계좌 시스템을 구축하여 포인터 리시버(pointer receiver)를 사용하는 메서드를 만드는 연습을 합니다. Account 구조체를 생성하고 포인터 리시버를 사용하여 계좌 잔액을 수정할 수 있는 메서드를 정의하게 됩니다.

세 가지 입력을 받게 됩니다:

  • 계좌 소유주의 이름을 나타내는 문자열 (예: "John Smith")
  • 초기 계좌 잔액을 나타내는 문자열 (예: "1000.50")
  • 거래 금액을 나타내는 문자열 (예: "250.75")

수행할 작업은 다음과 같습니다:

  1. 두 개의 필드 Name (string)과 Balance (float64)를 가진 Account 구조체를 정의합니다.
  2. 주어진 금액을 계좌 잔액에 더하는 포인터 리시버를 가진 deposit 메서드를 생성합니다.
  3. 주어진 금액을 계좌 잔액에서 빼는 포인터 리시버를 가진 withdraw 메서드를 생성합니다.
  4. 계좌 정보를 "Account: [name], Balance: $[balance]" 형식으로 출력하는 밸류 리시버(value receiver)를 가진 displayBalance 메서드를 생성합니다.
  5. 입력값을 파싱하여 Account 인스턴스를 생성합니다.
  6. displayBalance를 호출하여 초기 잔액을 표시합니다.
  7. 거래 금액으로 deposit을 호출합니다.
  8. displayBalance를 호출하여 입금 후 잔액을 표시합니다.
  9. 거래 금액으로 withdraw를 호출합니다.
  10. displayBalance를 호출하여 최종 잔액을 표시합니다.

잔액은 소수점 둘째 자리까지 표시되어야 합니다. 이 챌린지는 복사본을 작업하는 밸류 리시버와 달리, 포인터 리시버가 어떻게 메서드에서 원래 구조체 데이터를 수정할 수 있게 하는지 보여줍니다.

치트 시트

포인터 리시버는 구조체의 복사본이 아닌 구조체에 대한 포인터를 받음으로써 원본 구조체 인스턴스와 직접 작업합니다. 이를 통해 메서드가 원본 데이터를 수정할 수 있습니다.

포인터 리시버를 만들려면 리시버 선언에서 타입 이름 앞에 별표 *를 추가하세요:

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // 이 코드는 원본 구조체를 수정합니다
}

메서드가 구조체의 필드를 업데이트해야 할 때 포인터 리시버를 사용하세요. 이는 데이터의 상태를 변경하는 작업에 적합합니다.

직접 해보기

package main

import (
	"fmt"
	"strconv"
)

// TODO: 여기에 Account 구조체를 정의하세요

// TODO: 여기에 포인터 리시버를 사용하는 deposit 메서드를 정의하세요

// TODO: 여기에 포인터 리시버를 사용하는 withdraw 메서드를 정의하세요

// TODO: 여기에 값 리시버를 사용하는 displayBalance 메서드를 정의하세요

func main() {
	// 입력 읽기
	var name string
	var initialBalanceStr string
	var transactionAmountStr string
	
	fmt.Scanln(&name)
	fmt.Scanln(&initialBalanceStr)
	fmt.Scanln(&transactionAmountStr)
	
	// 문자열 입력을 적절한 타입으로 변환
	initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
	transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
	
	// TODO: Account 인스턴스 생성
	
	// TODO: 초기 잔액 표시, 입금 수행, 잔액 표시, 출금 수행, 최종 잔액 표시
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨