2024. 1. 25. 09:07γBackend/π©΅ Go
λͺ©ν
- Goμ struct μ΄ν΄
- structμ method μ΄ν΄
- method μ function μ μ°¨μ΄ μ΄ν΄
ꡬ쑰체(Struct ) λ?
Go μΈμ΄μ structλ λ°μ΄ν°λ₯Ό λ¬Άλ λ° μ¬μ©λλ μλ£ν μ λλ€. structλ λ€μν λ°μ΄ν° νμ μ νλλ₯Ό λ¬Άμ΄ νλμ λ μ½λλ‘ λ§λ€ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ κ΄λ ¨ μλ λ°μ΄ν°λ₯Ό λ Όλ¦¬μ μΌλ‘ κ·Έλ£Ήννκ³ κ΅¬μ‘°νν μ μμ΅λλ€.
ꡬ쑰체 μ μ
ꡬ쑰체(struct)λ λ€μκ³Ό κ°μ΄ μ μν μ μμ΅λλ€.
type νμ
λͺ
struct {
νλλͺ
νμ
...
νλλͺ
νμ
}
μ΄κΈ°ν
μλ μμμ½λλ Account ꡬ쑰체λ₯Ό Owner(κ³μ’μ£Ό)μ Balance(μμ‘) νλμ ν¨κ» μ μνμ΅λλ€. κ΅¬μ‘°μ²΄λ‘ λ³μλ₯Ό μμ±ν λ νλ μμλ‘ μ΄κΈ°κ°μ λμ νκ±°λ, νλλͺ μ μ§μ νμ¬ μ΄κΈ°ν ν μ μμ΅λλ€.
package banking
// Account struct
type Account struct {
Owner string
Balance int
}
// νλ μμλλ‘ μ΄κΈ°ν
var account Account = Account{"Hoo", 1000000}
// νλλͺ
κ³Ό ν¨κ» μ΄κΈ°ν
var account Account = Account{ Owner: "Hoo", Balance: 1000000}
ꡬ쑰체λ ν¨μμ λ§μ°¬κ°μ§λ‘ νλλͺ μ μ¬μ©νμ¬ μΈλΆμ λ ΈμΆμν¬ νλ(Public)μ λ ΈμΆ μν€μ§ μμ νλ(Private)λ₯Ό μ€μ ν μ μμ΅λλ€. νλλͺ μ΄ λλ¬Έμλ‘ μμνλ©΄ μΈλΆμμ μ¬μ©μ΄ κ°λ₯νμ§λ§, μλ¬Έμλ‘ μμνλ κ²½μ°μλ μΈλΆμμ μ¬μ©μ΄ λΆκ°λ₯ν©λλ€.
νμ¬ Accountμ λ΄λΆ νλ (Owner, Balance) λ λͺ¨λ λλ¬Έμ(Capital letter)λ‘ μ μΈλΌ μλλ°, Golang μμλ public ν μνλ₯Ό μλ―Έν©λλ€. μ¦ μΈλΆ package μμ ν΄λΉ νλμ ꡬ쑰체μ μ κ·Όν μ μμ΅λλ€.
package main
func main() {
account := banking.Account{Owner: "hoo", Balance: 1000000}
fmt.Println(account) // μΆλ ₯ : {hoo 100000}
}
function μ μ΄μ©ν ꡬ쑰체 μ μ
Account ꡬ쑰체λ₯Ό νμ©ν΄ κ°λ¨ν object λ₯Ό μμ±ν μ μμμ΅λλ€. νμ§λ§ μ μμμ νλλ λͺ¨λ public νκ² μ μλΌ μμ΄, μ΄λ―Έ μ μλ ꡬ쑰체μ κ°μ λꡬλ μ½κ² μμ ν μ μλ λ¬Έμ μ μ΄ μμ΅λλ€.
func main() {
account := banking.Account{Owner: "hoo", Balance: 1000000}
account.Balance = 100 // λꡬλ μ½κ² κ°μ μμ ν μ μλ λ¬Έμ μ‘΄μ¬
fmt.Println(account) // μΆλ ₯ : 0
}
νλλ₯Ό public μΌλ‘ μ΄μ΄λκΈ° λλ¬Έμ λꡬλ Balance μ μ κ·Όνμ¬ κ°μ μμ ν μ μμ΅λλ€. λ©μ©‘νλ μκ³ κ° κ°μκΈ° 0μΌλ‘ λ³κ²½λλ λΆμμ¬κ° λ°μν μλ μμ΅λλ€.
νλλ₯Ό μλ¬Έμλ‘ μ μΈνλ©΄ private μΌλ‘ λ³κ²½ν μ μμ΅λλ€. νμ§λ§ private νκ² λ³κ²½λ νλλ μΈλΆ ν¨ν€μ§μμ μ κ·Όν μ μκΈ° λλ¬Έμ object λ₯Ό μμ± νλ €λ©΄ λ€λ₯Έ λ°©λ²μ΄ νμν©λλ€. Golang μ λ³λμ μμ±μ κ°λ μ΄ μκΈ° λλ¬Έμ functionμ νμ©ν΄ objectλ₯Ό λ§λ€μ΄μΌ ν©λλ€.
// Account struct
type Account struct {
owner string
balance int
}
// NewAccount creates Account
func NewAccount(owner string) *Account {
account := Account{owner: owner, balance: 0}
return &account // μλ‘ λ§λ€μ΄μ§ object λ₯Ό 리ν΄
}
NewAccount ν¨μλ₯Ό ν΅ν΄ Account λ₯Ό μμ±ν μ μκ² λμ΅λλ€. μ μμ μ½λμμλ owner νλλ§ μ£Όμ νμ¬ κ°μ μ€μ νκ³ balanace λ κ°μΆμ΄ μΈλΆμμ λ³κ²½ν μ μλλ‘ κ°μ νμ΅λλ€.
func main() {
account := banking.NewAccount("hoo")
fmt.Println(account) // μΆλ ₯: &{hoo 0}
}
Method λ₯Ό μ΄μ©ν ꡬ쑰체 - νλ κ° μ μ
μν κ³μ’(account) κ°μ²΄λ₯Ό μμ±νμ§λ§ owner λ§ μ μλκ³ balance λ μμ μ΄ λΆκ°λ₯ν μνμ λλ€. κΈ°μ‘΄ μ½λμμλ Balance νλκ° λλ¬Έμλ‘ μ μλμ΄(public) κ° ν λΉκ³Ό μμ μ΄ κ°λ₯νμ§λ§ μμ λ μ½λλ μλ¬Έμλ‘ balance λ₯Ό μ μνμ¬ μ§μ κ°μ ν λΉνκ±°λ μμ ν μ μλ μνμ λλ€.
Golang μ struct νμμ method λ₯Ό μ μνμ¬ private νλμ κ°μ μμ ν μ μλλ‘ ν©λλ€. Java μμ private νλμ μ§μ μ κ·Όμ΄ λΆκ°λ₯ν λμ setter λ λ³λμ method λ₯Ό λ§λ€μ΄ κ°μ μμ νλ κ²κ³Ό λΉμ·ν κ°λ μ΄λΌ μκ°ν μ μμ΅λλ€.
// Account struct
type Account struct {
owner string
balance int
}
// Deposit `x` amount on your account
// between the func and name(Deposit) `a` is called as Receiver
// pointer receiver -> don't make a copy of object, just use the object.
func (a *Account) Deposit(amount int) {
a.balance += amount
}
Deposit method λ balance μ ν λΉν κ°μ amount λΌλ μΈμλ‘ λ°μ΅λλ€.
func μμ½μ΄μ Deposit λ©μλλͺ μ¬μ΄μ μμΉν (a *Account) λ receiver λ‘ λ©μλκ° μ΄λ€ νμ μ κ°μ λμνλμ§ λͺ μνλ λΆλΆμ λλ€. Receiverλ ν¨μκ° μν νμ μ μ§μ νλλ° μ¬μ©λλ©° λ©μλλ₯Ό μ μνλλ° νμν μμμ λλ€.
Receiver λ 2κ°μ§ μ’ λ₯λ‘ λΆλ₯λ©λλ€.
κ°(Value) Receiver:
- κ°(receiver)λ ν΄λΉ νμ μ 볡μ¬λ³Έμ λ°μ΅λλ€.
- λ©μλ λ΄μμ receiver λ₯Ό λ³κ²½νλλΌλ νΈμΆμμκ²λ μν₯μ λ―ΈμΉμ§ μμ΅λλ€.
- μ£Όλ‘ κ°μ λ³κ²½νμ§ μλ μ½κΈ° μ μ© λ©μλμ μ¬μ©λ©λλ€.
ν¬μΈν°(Pointer) Receiver:
- ν¬μΈν°(receiver)λ ν΄λΉ νμ μ ν¬μΈν°λ₯Ό λ°μ΅λλ€.
- λ©μλ λ΄μμ receiver λ₯Ό λ³κ²½νλ©΄ νΈμΆμμκ²λ λ³κ²½μ΄ λ°μλ©λλ€.
- μ£Όλ‘ κ°μ λ³κ²½νλ λ©μλμ μ¬μ©λ©λλ€. λ©μλκ° νΈμΆλ λ ꡬ쑰체μ 볡μ¬λ₯Ό νΌν λ μ μ©ν©λλ€.
Account μ method μ μ
// Account struct
type Account struct {
owner string
balance int
}
// Withdraw your account, return error when balance is lower than amount
func (a *Account) Withdraw(amount int) error {
if a.balance < amount {
return errors.New("cant withdraw you are poor")
}
a.balance -= amount
return nil
}
// Balance of your Account
func (a Account) Balance() int {
return a.balance
}
// Deposit x amount on your account
func (a *Account) Deposit(amount int) {
a.balance += amount
}
μ΄μ balance νλκ° private νλλΌλ struct μ μ μλ method λ₯Ό ν΅ν΄ balance κ°μ μ‘°μ ν μ μμ΅λλ€. νΉν Withdraw λ©μλμλ μμ‘(balance) λ³΄λ€ amount κ° λμ λ μμ‘ λΆμ‘±μ΄λΌλ μμΈμ²λ¦¬λ κ°λ₯νλλ‘ λΉμ¦λμ€ λ‘μ§μ μΆκ°ν μ μμ΅λλ€.
package main
import (
"fmt"
"log"
"nomad-go/chapter2/banking"
)
func main() {
account := banking.NewAccount("hoo")
fmt.Println("Account : ", account) // Account : &{hoo 0}
account.Deposit(2000000)
fmt.Println(account.Balance()) // 2000000
err := account.Withdraw(1000000)
if err != nil {
log.Fatalln(err)
}
fmt.Println(account.Balance(), account.Owner()) // 1000000 hoo
fmt.Println(account) // &{hoo 1000000}
}
method μ functionμ μ°¨μ΄
μ μμ μμ NewAccount λ₯Ό μ΄μ©ν΄ Account κ°μ²΄λ₯Ό μμ±ν λ functionμ΄λΌ νννκ³ , κ³μ’(balance)μ κ°μ μμ ν λ μ μν Deposit μ method λΌ νννμ΅λλ€. μ΄ λμ μλμ κ°μ μ°¨μ΄μ μ κ°μ§λλ€.
ν¨μ (function)
- ν¨μλ νΉμ ꡬ쑰체λ νμ μ μ’ μλμ§ μλ λ 립μ μΈ κΈ°λ₯μ μνν©λλ€.
- ν¨μλ ν¨ν€μ§ λ 벨μμ μ μλλ©° νΉμ νμ κ³Ό 무κ΄νκ² μ¬μ©λ μ μμ΅λλ€.
λ©μλ (Method)
- λ©μλλ νΉμ νμ μ μ’ μλμ΄ κ·Έ νμ μ μΈμ€ν΄μ€μ λν΄ λμν©λλ€.
- λ©μλλ ν΄λΉ νμ μ μ°κ²°λ ν¨μλ‘μ, νΉλ³ν μμ μ(receiver)λ₯Ό κ°μ§κ³ μμ΅λλ€.
μ 리
- Goμ struct λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό κ΄λ¦¬νκ³ μ΄κΈ°ννλ λ°©λ²μ μ μ μμμ΅λλ€.
- λ©μλλ₯Ό μ΄μ©νμ¬ κ΅¬μ‘°μ²΄μ λμμ μ μν μ μμ΅λλ€. λ©μλλ νΉμ νμ μ μ’ μλμ΄ ν΄λΉ νμ μ μΈμ€ν΄μ€μ λν΄ λμνλ©°, κ°(receiver) λλ ν¬μΈν°(receiver)λ‘ μ μν μ μμ΅λλ€.
- λ§μ§λ§μΌλ‘, ν¨μμ λ©μλμ μ°¨μ΄λ₯Ό κ°λ¨ν μ 리νμ΅λλ€. ν¨μλ νΉμ ꡬ쑰체μ μ’ μλμ§ μλ λ 립μ μΈ κΈ°λ₯μ μννλ©°, λ©μλλ νΉμ νμ μ μ’ μλμ΄ ν΄λΉ νμ μ μΈμ€ν΄μ€μ λν΄ λμνλ ν¨μλ‘ μ΄ν΄ν μ μμ΅λλ€.