이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 19장 써머리입니다.
메서드를 선언하려면 리시버를 func 키워드와 함수 이름 사이에 중괄호로 명시해야 한다.
type User struct {
Name string
Age int
}
func (u User) GetName() string {
return u.Name
}
user := User{"Coen", 34}
fmt.Println(user.GetName())
// func (i int) Add(j int) int { //int는 로컬타입이 아니기에 불가능
// return i + j
// }
type MyInt int
func (i MyInt) Add(j int) int {
return int(i) + j
}
func Test_AliasMethod(t *testing.T) {
var num MyInt = 5
t.Log(num.Add(10)) // 15
}
메서드는 데이터와 관련 기능을 묶어 코드 응집도를 높인다.
데이터와 기능을 묶어두면 새로운 기능 추가 및 오류 수정시에 관련 코드 부분만 수정할 수 있다.
객체 간 관계 중심의 프로그래밍 패러다임
순서도 보다는 객체 간의 관계를 나타내는 클래스 다이어그램을 더 중시
func (u *User) GetOldByPointer(years int) {
u.Age += years
}
func (u User) GetOldByValue(years int) {
u.Age += years
}
func (u User) GetOldByValueReturnReceiver(years int) *User {
u.Age += years
return &u
}
func Test_PointerMethodValueMethod(t *testing.T) {
user := &User{"Coen", 34}
user.GetOldByPointer(1) //포인터 주소의 값 변경
t.Log(user.Age) //35
user.GetOldByValue(1) //복사된 리시버 값 변경
t.Log(user.Age) //35
user = user.GetOldByValueReturnReceiver(1) //복사된 리시버 값 변경 하여 return
t.Log(user.Age) //36
}