포인터 리시버
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 8번째.
값 수신기는 구조체의 복사본을 대상으로 작동하는 반면, 포인터 수신기는 원래의 구조체 인스턴스를 직접 다룹니다. 포인터 수신기를 사용하여 메서드를 정의하면, 메서드는 구조체의 복사본이 아닌 구조체에 대한 포인터를 받기 때문에 원본 데이터를 수정할 수 있습니다.
포인터 리시버를 만들려면, 리시버 선언의 타입 이름 앞에 별표 *를 추가합니다:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // 이것은 원본 구조체를 수정합니다
}이 예제에서 (p *Person)은 포인터 리시버입니다. Person 인스턴스에서 haveBirthday 메서드를 호출하면, 메서드는 원본 구조체에 대한 포인터를 받습니다. 이 포인터를 통해 구조체 필드에 가해진 모든 변경 사항은 원본 데이터를 영구적으로 수정합니다.
포인터 리시버는 메서드가 구조체의 필드를 업데이트해야 할 때 필수적이며, 데이터의 상태를 변경하는 작업에 완벽합니다.
챌린지
쉬움이 챌린지에서는 간단한 은행 계좌 시스템을 구축하여 포인터 리시버(pointer receiver)를 사용하는 메서드를 만드는 연습을 합니다. Account 구조체를 생성하고 포인터 리시버를 사용하여 계좌 잔액을 수정할 수 있는 메서드를 정의하게 됩니다.
세 가지 입력을 받게 됩니다:
- 계좌 소유주의 이름을 나타내는 문자열 (예:
"John Smith") - 초기 계좌 잔액을 나타내는 문자열 (예:
"1000.50") - 거래 금액을 나타내는 문자열 (예:
"250.75")
수행할 작업은 다음과 같습니다:
- 두 개의 필드
Name(string)과Balance(float64)를 가진Account구조체를 정의합니다. - 주어진 금액을 계좌 잔액에 더하는 포인터 리시버를 가진
deposit메서드를 생성합니다. - 주어진 금액을 계좌 잔액에서 빼는 포인터 리시버를 가진
withdraw메서드를 생성합니다. - 계좌 정보를
"Account: [name], Balance: $[balance]"형식으로 출력하는 밸류 리시버(value receiver)를 가진displayBalance메서드를 생성합니다. - 입력값을 파싱하여
Account인스턴스를 생성합니다. displayBalance를 호출하여 초기 잔액을 표시합니다.- 거래 금액으로
deposit을 호출합니다. displayBalance를 호출하여 입금 후 잔액을 표시합니다.- 거래 금액으로
withdraw를 호출합니다. displayBalance를 호출하여 최종 잔액을 표시합니다.
잔액은 소수점 둘째 자리까지 표시되어야 합니다. 이 챌린지는 복사본을 작업하는 밸류 리시버와 달리, 포인터 리시버가 어떻게 메서드에서 원래 구조체 데이터를 수정할 수 있게 하는지 보여줍니다.
직접 해보기
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: 초기 잔액 표시, 입금 수행, 잔액 표시, 출금 수행, 최종 잔액 표시
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.