🔥 인터페이스 타입

279자
3분

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

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

go
type Abser interface {
    Abs() float64
}
 
go
type Abser interface {
    Abs() float64
}
 

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

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

go
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
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)
}
 
  • MyFloat 타입은 Abs() float64 메서드를 구현하여 Abser 인터페이스를 만족합니다.
  • Vertex 타입도 Abs() float64 메서드를 구현하므로 Abser 인터페이스를 만족하죠.

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

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

go
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
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 // 컴파일 에러 발생!
}
 
  • aAbser 인터페이스 타입의 변수입니다.
  • fMyFloat 타입의 값이고, MyFloatAbser 인터페이스를 구현하므로 a = f는 유효합니다.
  • &vVertex 타입의 값이고, VertexAbser 인터페이스를 구현하므로 a = &v도 유효하죠.
  • 하지만 vVertex 타입의 값이고, VertexAbser 인터페이스를 구현하지 않으므로 a = v는 컴파일 에러를 발생시킵니다.

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

YouTube 영상

채널 보기
AI에서 선형대수학이 중요한 이유
AI에서 고차원 임베딩이 무엇일까?
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학
Trie 자료구조 파이썬 구현: Search와 Starts With 연산 | Trie 자료구조 이야기
AI를 위한 선형대수 - 전단, 행렬식, 변환의 핵심
5편, B-Tree 내부 노드에서 키를 삭제할 때 정렬 규칙을 지키는 방법
10편, 파이썬으로 구현하는 B+ Tree