Golang - Class가 없다(?) Receiver 알아보기
간단하게 알아보는 Receiver
처음에는 좀 당황했다.
클래스가 없으면 OOP 이런게 안..되나??
왜냐면 나는 지금까지 배운 내용(MVC라던가 DI Container를 사용한 Nest 등)에서
클래스를 사용해서 메서드를 호출하는 방식으로 코드를 짜 왔기 때문이다.
다행이도, GO에는 리시버라는게 그 역할을 한다고 해서, 간단하게 포스팅해보려 한다.
type Account struct {
owner string
balance int
}
은행 계좌 Account 구조체를 예시로 들어봤다.
func NewAccount(owner string) *Account {
account := Account{owner: owner, balance: 0}
return &account
}
새 계좌를 만드는 함수고, 여기서 금액을 높이는 Deposit이란 함수를 추가로 만들어보자
func (a *Account) Deposit(amount int) {
a.balance += amount
}
함수앞에 (a *Account) 라는게 붙어있는데, 이게 바로 리시버라고 불리는,
다른 언어에서는 메서드를 뜻하는 부분이다.
리시버를 굳이 연결시키자면, 구조체(객체)를 연결하는 매개체 정도로 이해하면 될 것 같다.
a를 이용하여 Account 구조체에 접근할수 있는 것이다.
그런데 뜬금없이 * 이 붙은건 뭔가 싶을텐데...
이건 '값'과 '참조'의 차이라고 보면 된다. (SQL 등에서는 all 로 쓰이지만 여기선 다르다)
*를 붙이면 그 값은 참조가 되어, struct에 있는 원본이 변경된다.
그렇지 않으면, 그 값은 복사가 되는 것.
위의 예시를 본다면, *를 붙이지 않고 리시버를 사용하면, 아무리 돈을 많이 deposit 해도
balance는 0이 될 것이다.
오늘 이 포스팅을 쓰면서 느낀거는
신기하기도 한데, 확실히 공부는 끝이 없다는 것.
그런데 JS를 먼저 한 입장에서 이렇게 비교가 가능한것들을 보면
신기하기도 하다.
아직 Go는 본격적이라기 보다는 '체험' 수준인데
시간되는대로 포스팅할 예정이다.