🔥 인터페이스 타입

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 영상

채널 보기
NestJS 인터셉터란? | NestJS 가이드
입력을 전처리하는 Functor - Contravariant와 contramap 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 커스텀 데코레이터 인자 전달 및 파이프 검증 활용법 | NestJS 가이드
NestJS 커스텀 데코레이터, createParamDecorator 사용 | NestJS 가이드
관점 지향 로깅 인터셉터 구현 및 전역 바인딩 전략 | NestJS 가이드
함수 타입과 Hom-Set 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 역할 기반 접근 권한 부여 - Guard, Reflector | NestJS 가이드
Writer 펑터와 클라이슬리 카테고리 | 프로그래머를 위한 카테고리 이론