Go 객체와 메서드

Private / Public

Go는 단순히 대문자로 시작하면 Public, 소문자로 시작하면 private으로 선언된다. private으로 선언되면 같은 패키지 범위에 있는 경우에만 접근할 수 있다. 객체명, 객체 멤버 모두 대소문자를 활용해 범위를 제한한다. 

func function() {}  // private
func Function() {}  // public

메서드 생성

func (인스턴스명 객체명) 메서드명() 반환값 {}

일반 함수 선언문에서 (인스턴스명 객체)가 추가된다. 예를 들어 Object라는 객체를 정의했다면 아래와 같이 사용한다. 

func (obj Object) method() {
    obj.~  // 객체를 활용한 조작
}

예제

Project
 |--main.go
 |--objects
      |--object.go
// objects/object.go

package objects

import (
    "errors"
    "fmt"
)

type counter struct {
    name  string
    count int
}

func CreateCounter(name string) *counter {
    ct := counter{name: name, count: 0}
    return &ct
}

func (ct *counter) AddOne() {
    ct.count += 1
}

func (ct *counter) MinusOne() error {
    if ct.count > 0 {
        ct.count -= 1
        return nil
    } else {
        return errors.New("error: count = 0")
    }

}

func (ct counter) String() string {
    return fmt.Sprint(ct.name, ": ", ct.count)
}

Go는 객체의 포인터를 통해 바로 멤버 변수에 접근하는 것이 가능하다. 

  • counter: counter 객체는 private 객체이고 내부 멤버 변수들도 private이다. private은 외부 패키지에서는 사용할 수 없기 때문에 같은 패키지 내에서 접근 메서드를 정의해야 한다. 
  • CreateCounter: private 객체이므로 생성 함수도 만들어야 한다. 메모리 절약을 위해 포인터를 활용한 반환을 하도록 만들었다.
  • AddOne: count 변수에 1을 더한다.
  • MinusOne: count 변수가 0보다 클 때 1을 빼고, 그렇지 않을 때 에러를 반환한다. 
  • String: 객체의 'String' 메서드는 Python의 __str__과 같이 객체를 출력했을 때 반환하는 문자열을 나타낸다. 

 

// main.go

package main

import (
    "Project/objects"
    "fmt"
)

func main() {
    james := objects.CreateCounter("James")

    err := james.MinusOne()
    fmt.Println(err)

    james.AddOne()
    james.AddOne()
    fmt.Println(james)
}
error: count = 0
James: 2