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를 가진다.