Go - Interface

Interface

인터페이스는 OOP에서 다형성을 형성하고 결합도를 낮추기 위해 사용되는 추상화 기법이다. 

type SampleInterface interface {
	PrintMember()
	// Method(s string)
	// Method(n1, n2 int) int
}

type ABInterface interface {
	AInterface
	BInterface
}

interface 명령어를 통해 인터페이스를 생성한다. 일반적으로 내부에 구현될 메서드를 선언해야 한다. 그런데 인터페이스 내부에 인터페이스를 담기도 한다. 


Interface 기본값

interface는 추상화된 개념이기 때문에 그 자체로는 nil 타입을 가진다. 

func main() {
    var itf SampleInterface
    fmt.Print(itf)
}  // <nil>

그리고 빈 interface는 모든 타입이 될 수 있기 때문에 아래와 같이 사용할 수도 있다. 

func CheckType(interface{}) {}

Duck typing

Go는 인터페이스를 사용할 때 인터페이스와 구현체를 결합한다. 반대되는 Java를 생각해보면 구현할 때부터 implements를 통해 어떤 인터페이스를 구현할지 명시하고 구현해야 한다. 반면 Go에서는 인터페이스와 구현이 독립적으로 진행되고, 사용될 때 결합한다. 

func main() {
    imp := SampleObject{"James"}
    var itf SampleInterface

    itf = imp
    itf.PrintMember()
}

type SampleInterface interface {
    // 인터페이스
    PrintMember()
}

type SampleObject struct {
    // 구현체
    member string
}

func (ss SampleObject) PrintMember() {
    fmt.Println(ss.member)
}

인터페이스인 SampleInterface와 구현체인 SampleObject는 별도로 선언되었다. 그리고 main에서 사용될 때 결합하는 것을 볼 수 있다. 


크기

인스턴스 메모리 주소 (8) 타입 정보 (8)

인터페이스는 총 16Byte를 가진다.