Go에서의 인터페이스는 메서드의 집합체로, 인터페이스를 만족하기 위해서는 위해서는 인터페이스가 갖고있는 모든 메소드를 구현 하기만 하면 된다.

단, Java의 implements와 같은 표기는 하지 않기 때문에 어떤 인터페이스를 구현 한건지 코드만 봤을땐 파악하기 힘들다는 단점이 있다.

예제

Pet이라는 구조체가 AnimalCat 두개의 인터페이스를 구현하는 예제이다.

인터페이스 정의

package zoo

type Animal interface {
	Walk()
}

type Cat interface {
	Cry()
}

인터페이스 구현

두 인터페이스가 정의 되어있는 zoo패키지를 import한 후, 각 메소드를 구현 한다.

package main

import (
	"fmt"
	"lostfind/playground/zoo"
)

type Pet struct {
	name string
	age  int
}

// Cat의 인터페이스 구현
func (p *Pet) Cry() {
	fmt.Println("Nya")
}

// Animal 인터페이스의 구현
func (p *Pet) Walk() {
	fmt.Println("I walk with four feet.")
}

func main() {
	// 인터페이스 변수
	var animal zoo.Animal
	var cat zoo.Cat

	myPet := &Pet{
		name: "Nyanko",
		age:  10,
	}

	// myPet은 Cat, Animal의 인터페이스를 구현 하였으므로 각 인터페이스 변수에 대입 가능
	cat = myPet
	animal = myPet

	cat.Cry() // Nya
	animal.Walk() // I walk with four feet.
}

Java에서의 표현

단순히 이해를 돕기위한 코드로 Java를 코딩 안한지 꽤 오랜 시간이 지나서 문법이 정확하지 않을 수 있다.

public interface Animal {
  public void Walk();
}

public interface Cat {
  public void Cry();
}

class Pet implements Animal, Cat {
  public void Walk() {
    System.out.println("I walk with four feet.");
  }

  public void Cry() {
    System.out.println("Nya");
  }
}