Go by Example: [20] Interfaces

Interfaces

인터페이스(Interfaces)메소드 집합에 붙여진 이름이라고 생각하시면 됩니다.

package main

import "fmt"
import "math"

type geometry interface {                    // [1]
    area() float64
    perim() float64
}

type rect struct {                           // [2]
    width, height float64
}

type circle struct {
    radius float64
}

func (r rect) area() float64 {               // [3]
    return r.width * r.height
}

func (r rect) perim() float64 {
    return 2*r.width + 2*r.height
}

func (c circle) area() float64 {             // [4]
    return math.Pi * c.radius * c.radius
}

func (c circle) perim() float64 {
    return 2*math.Pi * c.radius
}

func measure(g geometry) {                   // [5]
    fmt.Println(g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}

func main() {
    r := rect{width: 3, height: 4}
    c := circle{radius: 5}
    
    measure(r)                               // [6]
    measure(c)
}
  1. 형태를 처리하는 인터페이스를 선언 합니다.
  2. 인터페이스는 메소드의 집합이라고 했습니다. rect, circle 구조체 인터페이스의
    내부 함수는 반드시 구현되어야만 합니다.
  3. Go언어에서 인터페이스내의 함수 구현은 인터페이스에 선언된 함수를 모두 구현하면됩니다.
  4. circle구조체에 대한 인터페이스를 구현합니다.
  5. 만약 인터페이스 타입 변수일 경우 인터페이스이름을 통해서 메소드를 호출하면 됩니다.
    measure함수는 인터페이스를 인자로 받아서 처리합니다.
  6. circle / rect구조체 타입은 모두 geometry인터페이스를 구현했으므로, measure함수의
    인자로 전달 할 수 있습니다.

실행하면 다음과 같습니다.

$ go run interfaces.go
{3 4}
12
14
{5}
78.53981633974483
31.41592653589793

인터페이스에 대한 자세한 내용은 Jordan Orelli블로그에
자세히 설명되어 있으니 참고하시기 바랍니다.