Computer_Language/GO

[Go] 12. Go(golang)의 메소드(method)

Joo-Topia 2019. 12. 7. 09:49

이전 공부에서 golang의 구조체에 대해서 정리를 했었다.

오늘 정리할 내용은 구조체의 메소드에 관한 내용이다.

 

메소드


객체지향 언어에서 특정 속성들의 기능을 수행하기 위해 만들어진 특별한 함수를 "메소드"라고 한다.

Go 언어는 객체지향 언어이지만 필드와 메소드를 묶어서 정의하는 클래스가 없다.

Go 언어에서 메소드를 구조체 내부에서 정의하지 않고 구조체 밖에 일반 함수처럼 별도로 선언한다.

 

 

Go언어의 메소드


Go언어에서 메소드를 선언하는 문법은 일반 함수를 선언하는 문법과 차이가 있다.

- 기본 함수 선언 문법
func 함수 이름(매개변수 이름 매개변수형) 반환 형{ ` ` `

- 메소드 선언 문법
func (매개변수이름 구조체 이름) 메소드 이름() 반환형 { ` ` `

메소드에서도 기본 함수에서 사용했던 Pass by value와 Pass by reference를 구별할 수 있다.

- 관련 코드 및 설명

package main

import "fmt"

type Square struct {
	width, height float32
}

//아래의 (source Square)은 어떤 구조체를 전달 받는지 명시하는 'receiver'이다.
func (source Square) SquArea() float32 {
	return source.width * source.height
}

//아래의 (source *Square)은 어떤 구조체를 전달 받는지 명시하는 'receiver'이다.
//위 함수는 Value Reveiver였다면 아래 함수는 Pointer Receiver이다.
func (source *Square) SquAreaRef() float32 {
	source.width += 1
	return source.width * source.height
}

func main() {
	var s1 = new(Square)
	//구조체 포인터를 선언하는 문법이다.

	s1.width = 10
	s1.height = 5

	//내부에서 값의 변화가 없는 메서드 이다.
	//호출 시 객체가 자동으로 매개변수로 들어간다고 생각하면 쉽다. (파이썬의 self)
	area := s1.SquArea()
	fmt.Println("사각형 구조체의 넓이 : ", area)

	//Value Receiver와 Pointer Receiver
	area = s1.SquAreaRef()
	fmt.Println("사각형 구조체의 넓이(참조 메서드 사용 시) : ", area)
	area = s1.SquAreaRef()
	fmt.Println("사각형 구조체의 넓이(참조 메서드 사용 시) : ", area)
	area = s1.SquAreaRef()
	fmt.Println("사각형 구조체의 넓이(참조 메서드 사용 시) : ", area)

	//참조 리시버를 사용했기 때문에 내부에서 객체의 필드 값을 변경 시키면 외부 객체에도 변경이 반영 된다.

}

 

 

마무리


1월 2일 입사라 여러 가지에 많은 시간을 못 쓰고 있다. 하지만 공부는 꾸준히 해야 된다고 생각하여 블로그 관리에 비중을 줄이게 되었다ㅜ

입사 후 적응이 잘 되면 열심히 활성화시켜야겠다.

*구름 edu의 "바로 실행해보면서 배우는 Go Lang"을 수강 후 정리한 내용입니다.
소스코드는 깃허브 저장소를 참고!