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함수의 내부 구조를 알 필요 없이 파라미터만 준수하면 실행이 가능하다.