🔥 인터페이스는 암시적으로 구현된다
Go 언어에서는 인터페이스를 구현할 때 명시적인 선언이 필요하지 않습니다. 대신 해당 인터페이스의 메서드를 구현하기만 하면 암시적으로 그 인터페이스를 구현하게 됩니다. 이를 통해 인터페이스의 정의와 구현을 분리할 수 있으며, 구현체는 어떤 패키지에서든 미리 약속하지 않고 나타날 수 있습니다.
다음 예제 코드를 통해 이를 살펴보겠습니다:
package main import "fmt" type I interface { M() } type T struct { S string } // 이 메서드는 타입 T가 인터페이스 I를 구현한다는 것을 의미합니다. // 하지만 우리는 명시적으로 선언할 필요가 없습니다. func (t T) M() { fmt.Println(t.S) } func main() { var i I = T{"hello"} i.M() }
go
위 코드에서는 I
라는 인터페이스를 정의하고 있습니다. 이 인터페이스는 M()
이라는 메서드를 가지고 있습니다.
type I interface { M() }
go
그리고 T
라는 구조체를 정의합니다. 이 구조체는 S
라는 문자열 필드를 가지고 있습니다.
type T struct { S string }
go
다음으로 T
타입에 대해 M()
메서드를 구현합니다. 이 메서드는 T
타입의 S
필드를 출력하는 역할을 합니다.
func (t T) M() { fmt.Println(t.S) }
go
이 메서드를 구현함으로써 T
타입은 I
인터페이스를 암시적으로 구현하게 됩니다. 우리는 따로 "T
가 I
를 구현한다"는 것을 명시적으로 선언할 필요가 없습니다.
마지막으로 main()
함수에서는 I
타입의 변수 i
를 선언하고, 이를 T
타입의 값으로 초기화합니다. 그리고 i.M()
을 호출하여 T
타입의 M()
메서드를 실행합니다.
func main() { var i I = T{"hello"} i.M() }
go
이 코드를 실행하면 T
타입의 S
필드 값인 "hello"가 출력됩니다.
이처럼 Go 언어에서는 인터페이스를 암시적으로 구현할 수 있습니다. 이는 인터페이스와 구현체 간의 결합도를 낮추고, 코드의 유연성을 높이는 데 도움을 줍니다. 우리는 인터페이스를 정의하고, 해당 인터페이스의 메서드를 구현하기만 하면 됩니다. 이를 통해 다양한 타입들이 동일한 인터페이스를 구현할 수 있게 되며, 이는 코드의 재사용성과 확장성을 증대시킵니다.