🔥 인터페이스 타입

279자
3분

Go 언어에서 인터페이스 타입은 메서드 시그니처의 집합으로 정의됩니다. 인터페이스 타입의 값은 해당 메서드를 구현하는 모든 값을 저장할 수 있죠.

예를 들어, 다음과 같이 Abser 인터페이스를 정의할 수 있습니다.

type Abser interface {
    Abs() float64
}
 
go

Abser 인터페이스는 Abs() float64 메서드 시그니처를 가지고 있습니다. 이 인터페이스를 구현하는 타입은 Abs() float64 메서드를 반드시 구현해야 합니다.

이제 MyFloat*Vertex 타입이 Abser 인터페이스를 구현하는 예제 코드를 살펴보겠습니다.

type MyFloat float64
 
func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}
 
type Vertex struct {
    X, Y float64
}
 
func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
 
go
  • MyFloat 타입은 Abs() float64 메서드를 구현하여 Abser 인터페이스를 만족합니다.
  • Vertex 타입도 Abs() float64 메서드를 구현하므로 Abser 인터페이스를 만족하죠.

하지만 Vertex 타입(값 타입)은 Abs() float64 메서드를 구현하지 않았기 때문에 Abser 인터페이스를 만족하지 않습니다.

이제 main 함수에서 인터페이스를 사용하는 방법을 알아보겠습니다.

func main() {
    var a Abser
    f := MyFloat(-math.Sqrt2)
    v := Vertex{3, 4}
 
    a = f  // a MyFloat implements Abser
    fmt.Println(a.Abs()) // 1.4142135623730951
 
    a = &v // a *Vertex implements Abser
    fmt.Println(a.Abs()) // 5
 
    // In the following line, v is a Vertex (not *Vertex)
    // and does NOT implement Abser.
    a = v // 컴파일 에러 발생!
}
 
go
  • aAbser 인터페이스 타입의 변수입니다.
  • fMyFloat 타입의 값이고, MyFloatAbser 인터페이스를 구현하므로 a = f는 유효합니다.
  • &vVertex 타입의 값이고, VertexAbser 인터페이스를 구현하므로 a = &v도 유효하죠.
  • 하지만 vVertex 타입의 값이고, VertexAbser 인터페이스를 구현하지 않으므로 a = v는 컴파일 에러를 발생시킵니다.

이렇게 인터페이스를 사용하면 서로 다른 타입의 값을 동일한 인터페이스 타입으로 다룰 수 있어 코드의 유연성과 확장성을 높일 수 있습니다.