[Go] Go언어 구조체(struct)와 메소드(method) 기본 사용법

Go언어에서 구조체(struct)와 메소드(method)의 기본적인 사용법을 정리해보자


환경

  • Go(1.15.8)
  • 다른 프로그래밍 언어 사용 경험


구조체(struct)와 메소드(method)

Go에서의 구조체(struct)

  • Go에서는 자기만의 방식으로 OOP를 지원한다. 여기서 신기하게도 기존에 흔하게 사용하는 class가 없다고 한다. class가 없기에 상속도 없다.
  • 그래서 구조체(struct)와 메소드(method)를 사용한다.
  • 아래에서는 이제 간단하게 구조체(struct)의 사용법과 그에 사용되는 메소드(method)에 대해 알아본다.


구조체(struct) 예시

  • 아래처럼 4가지 방법이 사용가능하다.
  • 기존 예약어인 new를 사용할수도 있고 생성자 함수를 만들수도 있다.
package main

import (
    "fmt"
)

// define struct
type Rectangle struct {
    width int
    height int
}

// define constructor
func NewRectangle(width int, height int) *Rectangle{
    return &Rectangle{width, height}
}

func main() {

    // create instances
    var rec1 = Rectangle{}
    rec1.width = 2
    rec1.height = 3

    rec2 := Rectangle{4, 5}

    var rec3 = new(Rectangle)
    rec3.width = 6
    rec3.height = 7

    var rec4 = NewRectangle(8, 9)

    // check instances
    fmt.Println(rec1.width, rec1.height)
    fmt.Println(rec2.width, rec2.height)
    fmt.Println(rec3.width, rec3.height)
    fmt.Println(rec4.width, rec4.height)
}
2 3
4 5
6 7
8 9


메소드(method) 예시

  • 리시버(Receiver)를 통해 어떤 구조체(struct)의 메소드인지 명시가 가능하다.
  • Value 리시버와 Pointer 리시버가 있다.
  • 아래 예제에서는 (r Rectangle)(r *Rectangle)가 리시버(Receiver)다.
package main

import (
    "fmt"
)

// define struct
type Rectangle struct {
    width int
    height int
}

// define constructor
func NewRectangle(width int, height int) *Rectangle{
    return &Rectangle{width, height}
}

// define methods
func (r Rectangle) area() int{
    return r.width * r.height
}

// pointer receiver
func (r *Rectangle) setWidth(width int){
    r.width = width
}

// value receiver
func (r Rectangle) setHeight(height int){
    r.height = height
}

func main() {

    // create instances
    var rec = NewRectangle(8, 9)

    // check instances
    fmt.Println(rec.width, rec.height)
    fmt.Println()

    // check methods
    fmt.Println(rec.area())
    fmt.Println()

    rec.setWidth(10)
    // rec.height would not changed because its method's receiver is value receiver
    rec.setHeight(10)
    fmt.Println(rec.width, rec.height)
}
8 9

72

10 9


참고자료