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