Golang 메서드 사용 방법 예제

프로그램을 작성하다 보면 함수를 사용해야 하는 경우도 있고 메서드를 사용해야 하는 경우도 있습니다.

Go에서는 이 두 개의 작성 방법에 차이가 있습니다.

함수는 일련 된 처리를 하기 위해 만들어 놓은 것을 한곳에 모아둔 것이라고 할 수 있습니다.

메서드는 객체와 연결된 기능이라고 생각하면 됩니다.

간단히 기능이라고 보면 되겠습니다.

그리고 메서드는 리시버를 사용합니다.

리시버란 구조체(객체)와 함수를 연결하는 매개체입니다.

 

메서드 사용 방법

메서드 작성방법을 보겠습니다.

예제

package main

import "fmt"

// 구조체
type Calc struct {val1, val2 int}

// 함수 작성
func Add(functest Calc) int {
	return functest.val1 + functest.val2
}

// 메서드 작성
func (methodtest Calc) Add() int {
	return methodtest.val1 + methodtest.val2
}

func main() {
	functest := Calc{8, 6
	fmt.Println(Add(functest)) 	// 함수 호출

	methodtest := Calc{3, 2}
	fmt.Println(methodtest.Add())	// 메서드 호출
}

 

결과

14
5

 

두 변수를 더하는 함수인 Add와 메서드로 작성한 Add 를 사용해서 결과를 출력했습니다.

메서드와 함수의 차이점이 보이시나요?

함수의 경우에는 선언되어 있는 함수를 호출하고 필요한 파라미터를 설정했습니다.

메서드의 경우에는 구조체.메서드 라는 형태로 실행을 하고 있습니다.

메서드 작성 방법만 따로 보겠습니다.

// 메서드
func (p Calc) Add() int {
	return p.val1 + p.val2
}

func (리시버 타입) 함수이름()반환타입{
	// 처리 작성
	return
}

 

그리고 눈치채신 분들도 계시겠지만 Add라는 같은 함수명으로 선언을 했는데 에러가 발생하지 않았습니다.

이유는 각각 사용되는 공간이 다르기 때문입니다.

메서드의 사용 방법을 조금 더 보겠습니다.

메서드 사용 예제

package main

import "fmt"

// 구조체 선언
type Calc struct {val1, val2 int}

// 더하기 메서드
func (p Calc) Add() int {
	return p.val1 + p.val2
}

// 빼기 메서드
func (p Calc) Sub() int {
	return p.val1 - p.val2
}

// 곱하기 메서드
func (p Calc) Multi() int {
	return p.val1 * p.val2
}

// 나누기 메서드
func (p Calc) Div() int {
	if p.val2 == 0 {
		return 0
	}
	return p.val1 / p.val2
}

func main() {

	p := Calc{5, 2} 	// 구조체 값 대입
	fmt.Println(p.Add())	// 더하기 메서드 사용
	fmt.Println(p.Sub())	// 빼기 메서드 사용
	fmt.Println(p.Multi())	// 곱하기 메서드 사용
	fmt.Println(p.Div())	// 나누기 메서드 사용

	// 다른 변수를 생성
	q := Calc{3, 5}		// 구조체 다른값 대입
	fmt.Println(q.Add())	// 더하기 메서드 사용
}

 

결과

7
3
10
2
8

 

예제에서 볼 수 있듯이 메서드를 선언하고 사용할 때는 리시버.메서드 형태로 호출합니다.

비유가 맞는지 모르겠지만 예를 들기 위해 자바로 설명을 조금 하겠습니다.

자바로 비교해서 생각해보면 String 타입으로 선언한 str 변수가 있다고 가정해보겠습니다.

str 변수에 모든 문자를 대문자로 변경하고 싶은 경우는 str.toUpperCase(), 소문자로 변경하고 싶은 경우에는 str.toLowerCase() 로 strings 오브젝트에 준비되어 있는 메서드를 사용합니다.

str.toUpperCase();
str.toLowerCase();

 

Go에서도 마찬가지로 메서드를 사용하기 위해 미리 사용자가 하고 싶은 처리를 메서드로 구현하고 리시버 형태로 사용할 수 있습니다.

메서드의 기본적인 사용 방법은 여기서 마치도록 하겠습니다.

댓글