08 메서드와 인터페이스

Go language course for beginners


메서드

Go에서의 구조체는 메서드를 가질 수 있습니다.

메서드는 함수 정의 앞에 리시버를 적어주면 됩니다.

메서드는 . 연산자를 사용해서 호출할 수 있습니다.

이 코드에서 (p Person)는 값 리시버 입니다.

값 리시버는 구조체의 값을 복사합니다, 따라서 메서드에서 구조체의 값을 변경할 수 없습니다. (복사본만 변경됩니다)

type Person struct {
    Name string
    Age  int
}

func (p Person) YearOfBirth() int {
    return 2021 - p.Age
}

func main() {
    p := Person{Name: "John", Age: 42}

    fmt.Println(p.YearOfBirth()) // 1979
}

구조체 내부의 값을 바꾸거나 구조체가 클때는 포인터 리시버를 사용합니다.

type Person struct {
    Name string
    Age  int
}

func (p *Person) SetAge(age int) { // 포인터 리시버
    p.Age = age
}

func (p Person) YearOfBirth() int { // 값 리시버
    return 2021 - p.Age
}

func main() {
    p := &Person{Name: "John", Age: 42} // p : *Person
    fmt.Println((*p).YearOfBirth()) // 원칙상 이렇게 적는 것이 맞지만 Go는 auto ref, auto deref를 지원하기 때문에 아래와 같이 쓸 수 있습니다.
    fmt.Println(p.YearOfBirth()) // 1979

    p.SetAge(43)

    fmt.Println(p.YearOfBirth()) // 1978
}

인터페이스

인터페이스는 메서드들의 집합입니다.

인터페이스 타입은 해당 메서드들을 구현하는 구조체를 보유할 수 있습니다.

인터페이스는 interface 키워드를 사용해서 선언합니다.

type Bird interface {
    Fly()
}