Golang 인터페이스 - Go series(10)

Date:     Updated:

Categories:

Tags: ,

image

인터페이스

구조체가 필드들의 집합체라면, 인터페이스는 메서드의 집합이다!.
타입이 구현해야 하는 메서드 원형을 정의하는데, 한 타입이 인터페이스를 구현한다 라고 하는 것은 그 인터페이스가 가지는 모든 메서드를 구현한다는 것이다.

구조체와 마찬가지로 type문을 사용하여 정의한다.
예시)

type Shape interface{
    area() float64
    perimeter() float64
}
  • 인터페이스 구현 위와 같은 Shape interface를 구현한 Circle이 있다고 가정하자. 아래와 같다.
type Circle struct{
    radius float64
}

func (c Circle) area() float64{
    return math.Pi * c.radius * c.radius
}
func (c Circle) perimeter() float64{
    return 2 * math.Pi * c.radius
}
  • 함수가 파라미터로 인터페이스를 받아들이는 경우고 있다. 이는 어떤 타입이든 해당 인터페이스가 구현된 객체가 들어올 수 있다.
func main(){
    r := Circle{10.1}

    showArea(r)
}

func showArea(shape ...Shape){
    for _,s := range shape{
        println(s.area())
    }
}
  • 빈 인터페이스를 접하게 될 때도 있다. 빈 인터페이스는 interface{}와 같이 표현한다. 이는 위에서 파라미터로 인터페이스를 받는것을 응용 한 것인데 Go의 모든 Type은 적어도 0개 이상의 메서드를 구현한다. 그렇다면 빈 인터페이스란 0개 이상의 메서드를 구현한 type임을 의미하게 된다. 결국 어떠한 타입도 담을 수 있는 컨테이너를 만드는 것이다. Dynamic Type

func main(){
    var x interface{}
    x = 1
    x = "Wonryang"
    printIt(x)
}

func printIt(v interface{}){
    fmt.Println(v) // fmt함수를 사용하지 않으면 원하는 값이 표시되지 않음
}
  • 인터페이스를 이용해 타입비교도 가능하게 된다. interface변수.(타입) 으로 표현하면, 가능하다.
func main(){
    var x interface{} = 10
    ten := x.(int)
    println(ten)
}

Leave a comment