본문 바로가기
Go

golang 리시버

by 참새는 짹짹 2021. 2. 14.

go 언어에서는

클래스가 없어

그 클래스에 갖는 메소드가 없는 대신

리시버를 통해

구조체가 갖는 메소드를 나타낼 수 있다

type Item struct {
	price, discount int
}

func (i Item) DiscountPrice() int {
	return i.price - i.discount
}

위와 같이 함수명 앞에

구조체 타입과 변수명을 같이 선언하면서

해당 구조체의 메소드임을 알려주고

이를 리시버라고 한다

💡
리시버는 메소드에서 매개변수와 같이 사용할 수 있으며 go 언어는 포인터를 사용 하기 때문에 리시버도 value 리시버, pointer 리시버로 나뉜다

Value 리시버


복사된 구조체의 데이터를 전달 받음

func (i Item) DiscountPrice() int {
	return i.price - i.discount
}

  • 메소드에서 구조체 데이터 변경이 일어나도

    메소드를 호출한 호출자(구조체)의 데이터에는 변경이 없음

  • 구조체의 데이터를 복사하기 때문에 메소드의 호출자가

    값이든 포인터든 메소드 사용 가능

Pointer 리시버


구조체의 포인터를 전달 받음

func (i *Item) SetDiscount(newDiscount int) {
	i.discount = newDiscount
}

  • 메소드에서 구조체 데이터 변경이 일어나면

    메소드를 호출한 호출자(구조체)의 데이터도 변경

  • 메소드의 호출자가 값인 경우 사용이 불가능
    • 포인터를 받기 전에 값의 복사부터 이루어져

      pointer 리시버 메소드의 의도(데이터 변경)대로

      동작이 이루어지지 못함

하지만

값에 대한 주소를 얻을 수 있는 경우에는

컴파일러가 자동으로 주소 연산자를 붙여 이를 호출함

item := Item{5000,500} // 값
item.SetDiscount(1000) // pointer 리시버 메소드 호출
// (&item).SetDiscount(1000) 컴파일러가 자동으로 변경

참고


예제로 배우는 Go 프로그래밍 - Go 메서드
1. Go 메서드(Method) 앞에서(Go 구조체) 언급했듯이 Go 언어는 객체지향 프로그래밍(OOP)을 고유의 방식으로 지원한다. 타 언어의 OOP의 클래스가 필드와 메서드를 함께 갖는 것과 달리 Go 언어에서는 struct가 필드만을 가지며, 메서드는 별도로 분리되어 정의된다. Go 메서드는 특별한 형태의 func 함수이다. 메서드는 함수 정의에서 func 키워드와 함수명 사이에 "그 함수가 어떤 struct를 위한 메서드인지"를 표시하게 된다.
http://golang.site/go/article/17-Go-%EB%A9%94%EC%84%9C%EB%93%9C
쉽게 읽는 Effective Go 번역 (4) - Rain.i
첫번째], [ 두번째], [ 세번째] 에 이어 네번째 Effective Go 번역 이어갑니다. 표면적으로는 C 나 C++ 에서의 초기화와 크게 달라보이지 않지만, Go 에서의 초기화가 훨씬 강력한 기능을 제공합니다.복잡한 구조체가 초기화동안 생성될 수 있을 뿐 더러, 초기화되는 객체 간 또는 서로 다른 패키지 간의 순서 문제도 정확하게 처리되거든요.(이 말은 계속 읽다 보면 이해하게 되실거예요.)
http://cloudrain21.com/effective-go-4#methods

'Go' 카테고리의 다른 글

Go run, build, install?  (0) 2021.01.20
Go modules  (0) 2021.01.19
golang 상속? 임베딩?  (0) 2021.01.08

댓글