본문 바로가기

Programming Language/Golang

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는 본격적이라기 보다는 '체험' 수준인데

시간되는대로 포스팅할 예정이다.