관리 메뉴

bright jazz music

Go - 메소드2 (Go의 메소드 내부적 호출/ struct에 메소드 추가하기) 본문

Language/Go

Go - 메소드2 (Go의 메소드 내부적 호출/ struct에 메소드 추가하기)

bright jazz music 2021. 2. 18. 23:27
package accounts

import (
	"errors"
	"fmt"
)

//Account struct
type Account struct {
	owner   string
	balance int
}

var errNoMoney = errors.New("Can't witdhraw") //에러의 변수명은 err로 시작해야 함

//NewAccount creates Account
func NewAccount(owner string) *Account {
	account := Account{owner: owner, balance: 0}
	return &account //사본 말고 메모리 주소 반환
}

//Deposit x amount on your account
func (a *Account) Deposit(amount int) { //메소드임.

	//이 때 a는 Deposit 메소드의 receiver이다.
	//리시버의 이름은 struct의 첫 글자를 따서 소문자로 지어야 한다.
	//이렇게 하는 것만으로도 main에서 account.Deposit()을 사용할 수 있음
	// *을 붙이지 않으면Deposit()가 호출되어 account를 받는 순간에 복사해서 받아온다.
	//따라서 10이 들어가지 않는다.
	// 복사된 account가 아니라 호출한 원본을 사용하기 위해서는 *를 붙여야 한다.
	// 이 경우, 리시버를 포인터 리시버라고 부른다.
	// 이렇게 복사를 하는 이유는 보안 때문이다.

	a.balance += amount
}

//Balance of your account
func (a Account) Balance() int {
	return a.balance
}

//Withdraw x amount from your account
func (a *Account) Withdraw(amount int) error {
	if a.balance < amount {
		//return error.Error() 기존의 에러
		return errNoMoney //새로운 에러
		//그러나 에러가 발생해도 그게 터미널 등에 표현되지는 않는다.
		// Go에는 exception이 없기 때문이다. 따라서 err를 다룰 코드를 직접 해줘야 한다.
	}
	a.balance -= amount
	return nil //null
}

// ChangeOwner of the account
func (a *Account) ChangeOwner(newOwner string) {
	a.owner = newOwner
}

//Owner of the account
func (a Account) Owner() string { //owner를 반환
	return a.owner
}

//Go가 내부적으로 메소드를 호출하는 경우가 있는데, string으로 struct를 반환하는 것임
// Go가 자동으로 호출해 주는 메소드.... python의 _str_처럼... 그중 하나가 String()임

func (a Account) String() string { //&{hojun 10}형식이 아래의 내용으로 바뀜
	return fmt.Sprint(a.Owner(), "'s account. \nHas ", a.Balance())
}

 

 

메인

 

 

 

package main

import (
	"fmt"

	"github.com/hojuncha997/learngo/accounts"
)

func main() {
	account := accounts.NewAccount("hojun")
	account.Deposit(10)
	// err := account.Withdraw(20)
	// if err != nil { //에러를 받아서 처리
	// 	fmt.Println(err)
	// }
	// fmt.Println(account.Balance(), account.Owner())

	fmt.Println(account)

}


============


&{hojun 10} 에서

hojun's account.
Has 10

로 모습이 바뀜
Comments