[Tucker의 Go 언어 프로그래밍] 19장 메서드

Coen·2023년 11월 1일
1

tucker-go

목록 보기
14/18
post-thumbnail

이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 19장 써머리입니다.

19 메서드

19.1 메서드 선언

메서드를 선언하려면 리시버를 func 키워드와 함수 이름 사이에 중괄호로 명시해야 한다.

type User struct {
	Name string
    Age  int
}

func (u User) GetName() string {
	return u.Name
}

user := User{"Coen", 34}
fmt.Println(user.GetName())
  • 리시버는 모든 로컬 타입들이 가능한데, 로컬 타입이란 해당 패키지 안에서 type 키워드로 선언된 타입을 말한다.

19.1.1 별칭 리시버 타입

//	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
}

19.2 메서드는 왜 필요한가?

  • 메서드는 데이터와 관련 기능을 묶어 코드 응집도를 높인다.

  • 데이터와 기능을 묶어두면 새로운 기능 추가 및 오류 수정시에 관련 코드 부분만 수정할 수 있다.

19.2.1 객체지향: 절차 중심에서 관계 중심으로 변화

  • 객체 간 관계 중심의 프로그래밍 패러다임

  • 순서도 보다는 객체 간의 관계를 나타내는 클래스 다이어그램을 더 중시

19.3 포인터 메서드 vs 값 타입 메서드

  • 리시버를 값 타입과 포인터로 정의할 수 있다.
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
}
profile
백엔드 프로그래머

0개의 댓글