Interface란?
type Sample interface {
test() string
test(a int) string
_(x int) int
}
- 추상화된 상호 작용으로 메소드로 구성되어있는 하나의 구현체
Interface를 사용하는 이유?
- 외부 모듈을 사용하는 과정에서 사용 범위를 설정하기 위해
- A라는 Interface에 사용할 Method만 정의
- 외부 모듈에서 사용하는 객체를 A에 할당
- 외부 모듈 전부가 아닌 내가 A에서 정의한 메소드만 활용함으로써 사용 범위 축소 및 에러 핸들링이 용이해짐
- 함수의 파라미터로 인터페이스를 사용해, 여러 스트럭트를 받기 위함 (제네릭 대용?)
- 여러 스트럭트에서 정의되어있는 함수들을 활용해서 새로운 함수를 만들 수 있음
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" }
animals := []Sayer{c, d}
func MakeTalk(s Sayer) {
fmt.Println(reflect.TypeOf(s).Name(), "says:", s.Say())
}
- 빈 인터페이스 (interface{})의 경우 아무런 메소드가 정의되어있지 않기 때문에 무엇이든 받을 수 있는 구조였구나…!
- 이러한 기반엔 Duck Typing이라는 동적 타이핑이 존재함
Duck Typing
- 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것
- 클래스 상속이나 인터페이스 구현으로 타입을 구분하는 대신, 객체가 어떤 타입에 걸맞은 변수와 메소드를 지니면 객체를 해당 타입에 속하는 것으로 간주
만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.