golang
golang8 interface
Green-Flamingo
2022. 2. 28. 00:31
interface
- 구체적인 내용 없이 단순 관계만 매핑
- 어떤 구조체든 이 조건들을 만족하는 메소드들만 있다면 동일한 인터페이스 타입을 가진다.
- 덕타이핑
- 어떤 구조체든 이 조건들을 만족하는 메소드들만 있다면 동일한 인터페이스 타입을 가진다.
- 구조체는 관계+구현
type MyInterface interface{
myFunc() string
}
- myFunc함수를 가진 인터페이스
- 함수를 변수처럼 보기 때문에 다른 인자라 하더라도 같은 변수로 인식한다.
- 서로 다른 타입이라 하더라도 같은 이름의 함수를 가질 수 없다.
- 인터페이스로 받는 내용은 인터페이스의 조건만 만족한다면 어떤 타입이든 수용한다.
- 함수의 내용을 관여하지 않는다.
- 추상화
- 함수의 내용을 관여하지 않는다.
여러개의 인터페이스
- 상속된 인터페이스를 사용할 때는 상위에서 구현된 인터페이스들을 모두 구현되어야 사용할 수 있다.
type Inter1 interface{
func1()
}
type Inter2 interface{
func2()
}
type Inter3 interface{
Inter1
Inter2
}
Inter3을 이용하는 객체는 Inter1과 Inter2의 내용을 구현해야 동작한다.
duck typing
- 오리라는 분류를 해부하지 않고 특징으로만 파악하자.
- 사람도 오리처럼 행동이 가능하면 사람도 오리 분류에 들어간다.
- 객체의 타입도 구현되어 있는 함수들로 파악하자!
- 서로 다른 타입 A와 B는 C라는 인터페이스의 내용을 구현하였으면 구조체 A와 B는 모두 C타입으로 사용될 수 있다.
장점
- loose coupling
- 클라이언트는 해당 객체의 메소드들 직접 사용하지 않고 간접적으로 사용한다.
- 낮은 의존성
- 코드 재사용성 증가
단점
- 불필요한 기능을 작성할 수 있다.
- 사람이라는 객체에 공격과 방어라는 인터페이스 함수가 있으면 NPC객체가 이 인터페이스 타입을 가지기 위해선 불필요한 공격과 방어라는 함수 내용을 작성해야 한다.
Example: 연산자 인터페이스
type Operation interface {
plus() int
minus() int
}
Operation이란 인터페이스는 plus와 minus함수만 정의되어있으면 어떤 구조체든 Operation타입이다.
plus, minus함수의 내용은 몰라, 하지만 plus, minus를 구현하면 Operation타입이야
// duck typing
func Plus(op Operation) int {
return op.plus()
}
func Minus(operation Operation) int {
return operation.minus()
}
인터페이스 객체를 가져와서 plus와 minus를 불러서 반환한다.
func TestInterface(t *testing.T) {
s1 := Opends{
num1: 10,
num2: 20,
}
ret1 := Plus(s1)
ret2 := Minus(s1)
fmt.Println("Plus ", ret1)
fmt.Println("Minus ", ret2)
}
클라이언트는 Plus와 Minus함수의 내부 구조를 알 필요 없이 파라미터만 준수하면 실행이 가능하다.