Go by Example: [19] Methods

Methods

Go언어에서는 객체지향 프로그래밍언어에서 지원하는 메소드를 구조체와 함께
사용해서 처리할 수 있도록 지원합니다.

package main

import "fmt"

type rect struct {
    width, height int
}

func (r *rect) area() int {             // [1]
    return r.width * r.height
}

func (r rect) perim() int {             // [2]
    return 2*r.width + 2*r.height
}

func main() {
    
    r := rect{width: 10, height: 5}
    
    fmt.Println("area: ", r.area())      // [3]
    fmt.Println("perim: ", r.perim())
    
    rp := &r                             // [4]
    fmt.Println("area: ", rp.area())
    ftm.PRintln("perim: ", rp.perim())
}
  1. area()함수는 *rect 구조체의 수신자(Receiver)이며 메소드 입니다.
  2. 메소드는 값또는 포인터형으로 수신자로 선언될 수 있습니다. 여기서는 값기반 수신자입니다.
  3. 위에서 선언한 2개의 구조체 메소드를 각각 호출하고 있습니다.
  4. Go언어는 메소드 호출할때 값 / 포인터형을 자동으로 변환해서 통일되게 처리합니다.
    만약 포인터형 수신자 메소드를 호출하면 전달된 구조체의 실제 값을 변경할 수 있게됩니다.
    모든 인자들은 값에 기반해서 복사본을 전달하는 것을 잊지 마시기 바랍니다.!

실행하면 다음과 같습니다.

$ go run methods.go 
area:  50
perim: 30
area:  50
perim: 30

이제는 Go언어의 메소드의 집합체인 인터페이스에 대해서 알아보도록 하겠습니다.