반응형


Go Lang의 메소드란 특정한 구조체에 연결되어 호출되는 함수를 의미합니다. 데이터와 코드를 묶어서 응집도를 높이기 위해 사용하는데, 응집도를 높여서 쓰는 것이 유리한 곳에 활용하기에 좋습니다. (통장 입출금 예제 등)

 

메소드의 형태 (함수와 유사하나 리시버 매개변수 추가 선언 필요)

 

func (리시버매개변수이름, 리시버매개변수타입) 메소드명() 리턴값 {
	구조체 멤버를 접근하여 연산수행 가능
}

 


 

메소드를 호출하기 위해서는 메소드를 호출할 값 다음에 . 을 이용하여 메소드를 붙여주면 됩니다. 이 때 메소드를 호출하는 값을 메소드 리시버(method receiver)라고 합니다.

 

메소드 형태를 참고하면서 다음과 같은 예제를 직접 작성해봅시다.

 

예제. 메소드 입출금 예제 만들어보기

 

package main

import "fmt"

type Account string

func (a Account) withdrawMethod() {
	fmt.Println("인출 메소드 실행 >", a) // 리시버 매개변수의 값 출력
}

func (a Account) depositMethod() {
	fmt.Println("입금 메소드 실행 >", a)
}

func main() {
	withdraw := Account("인출이 완료되었습니다")
	withdraw.withdrawMethod()
	deposit := Account("입금이 완료되었습니다")
	deposit.depositMethod()
}

 

출력결과물

 

인출 메소드 실행 > 인출이 완료되었습니다
입금 메소드 실행 > 입금이 완료되었습니다

 

리시버 매개변수의 이름은 원하는대로 사용하셔도 무방하나 하나의 타입에서 정의하는 모든 메서드는 가급적 동일한 리시버 이름을 사용해 가독성을 높이는 것이 좋습니다.

 


통장 입출금 예제를 사용해서 메소드에 대해 더 자세히 알아보도록 하겠습니다.

 

예제. 통장 입출금

 

package main

import "fmt"

type Account struct {
	balance int
}
	// 인출 함수
func withdrawFunc(a *Account, amount int) {
	a.balance -= amount
}
	// 인출 메소드
func (a *Account) withdrawMethod(amount int) {
	a.balance -= amount
}

func main() {
	a := Account{100} 
	b := Account{200}
	// 인출 함수 사용
	withdrawFunc(&a, 30)
	withdrawFunc(&b, 30)
	// 인출 메소드 사용
	a.withdrawMethod(40)
	b.withdrawMethod(50)

	fmt.Printf("%d, %d", a.balance, b.balance)
}

 

출력결과물

 

30, 120

 

메소드와 함수는 모습은 많이 유사하지만 분명한 차이점이 있습니다. 특히 위의 예제에서 인출 함수와 인출 메소드는 큰 차이가 없어보이도록 구성되어 있습니다.

메소드는 리시버 매개변수를 메소드 이름 앞에 작성해주고 호출할때는 리시버를 활용한다는 점에서 함수와의 차이점이 발생합니다.

 

Go Lang에서는 일반적으로 리시버 이름을 (a Account) 혹은 (d Deposit)과 같이 리시버 타입의 첫 번째 문자를 소문자로 사용합니다.

반응형

+ Recent posts