Golang Interface & Duck typing

Minseok Kim·2023년 2월 5일
0

Interface란?

type Sample interface {
  test() string
  test(a int) string // Error: duplicated method name
  _(x int) int         // Error: no name method
}
  • 추상화된 상호 작용으로 메소드로 구성되어있는 하나의 구현체

Interface를 사용하는 이유?

  1. 외부 모듈을 사용하는 과정에서 사용 범위를 설정하기 위해
    • A라는 Interface에 사용할 Method만 정의
    • 외부 모듈에서 사용하는 객체를 A에 할당
    • 외부 모듈 전부가 아닌 내가 A에서 정의한 메소드만 활용함으로써 사용 범위 축소 및 에러 핸들링이 용이해짐
  2. 함수의 파라미터로 인터페이스를 사용해, 여러 스트럭트를 받기 위함 (제네릭 대용?)
    • 여러 스트럭트에서 정의되어있는 함수들을 활용해서 새로운 함수를 만들 수 있음
      type Sayer interface {
          Say() string
      }
      
      type Cat struct{}
      
      func (c Cat) Say() string { return "meow" }
      
      type Dog struct{}
      
      func (d Dog) Say() string { return "woof" }
      
      // c, d는 Say라는 method를 갖고 있기 때문에 Sayer 인터페이스로 선언할 수 있음
      animals := []Sayer{c, d}
      
      // 인터페이스를 변수로 받는 함수를 선언함으로써 다양한 객체에서 사용할 수 있게됨
      func MakeTalk(s Sayer) {
          fmt.Println(reflect.TypeOf(s).Name(), "says:", s.Say())
      }
    • 빈 인터페이스 (interface{})의 경우 아무런 메소드가 정의되어있지 않기 때문에 무엇이든 받을 수 있는 구조였구나…!
    • 이러한 기반엔 Duck Typing이라는 동적 타이핑이 존재함

Duck Typing

  • 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것
  • 클래스 상속이나 인터페이스 구현으로 타입을 구분하는 대신, 객체가 어떤 타입에 걸맞은 변수와 메소드를 지니면 객체를 해당 타입에 속하는 것으로 간주

만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.

profile
Developer @CHLNGERS

0개의 댓글