🔥 빈 인터페이스 (Empty Interface)

298자
4분

Go 언어에서는 메서드를 하나도 지정하지 않은 인터페이스를 **빈 인터페이스(Empty Interface)**라고 부릅니다.

interface{}
 
go

빈 인터페이스는 어떤 타입의 값도 담을 수 있습니다. 왜냐하면 모든 타입은 적어도 0개 이상의 메서드를 구현하기 때문이죠.

빈 인터페이스는 타입을 알 수 없는 값을 다루는 코드에서 사용됩니다. 예를 들어, fmt.Print 함수는 interface{} 타입의 인수를 여러 개 받습니다.

다음은 빈 인터페이스를 사용하는 예제 코드입니다.

package main
 
import "fmt"
 
func main() {
	var i interface{}
	describe(i)
 
	i = 42
	describe(i)
 
	i = "hello"
	describe(i)
}
 
func describe(i interface{}) {
	fmt.Printf("(%v, %T)\n", i, i)
}
 
go

코드를 하나씩 살펴보겠습니다.

var i interface{}
 
go
  • i라는 변수를 interface{} 타입으로 선언합니다.
  • 이렇게 하면 i는 어떤 타입의 값도 저장할 수 있게 됩니다.
describe(i)
 
go
  • i 변수를 describe 함수에 전달합니다.
  • 이 때 i는 아직 아무 값도 할당되지 않은 상태입니다.
i = 42
describe(i)
 
go
  • i에 정수 42를 할당합니다.
  • 다시 describe 함수를 호출하여 i의 값과 타입을 출력합니다.
i = "hello"
describe(i)
 
go
  • 이번에는 i에 문자열 "hello"를 할당합니다.
  • describe 함수를 호출하여 i의 값과 타입을 출력합니다.
func describe(i interface{}) {
	fmt.Printf("(%v, %T)\n", i, i)
}
 
go
  • describe 함수는 interface{} 타입의 인수 i를 받습니다.
  • fmt.Printf를 사용하여 i의 값과 타입을 출력합니다.
    • %v는 값을 기본 형식으로 출력합니다.
    • %T는 타입을 출력합니다.

프로그램을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

(<nil>, <nil>)
(42, int)
(hello, string)
text
  • 첫 번째 출력은 i가 아무 값도 할당되지 않은 상태이므로 <nil>이 출력됩니다.
  • 두 번째 출력은 i에 정수 42가 할당되었으므로 값은 42, 타입은 int로 출력됩니다.
  • 세 번째 출력은 i에 문자열 "hello"가 할당되었으므로 값은 "hello", 타입은 string으로 출력됩니다.

이처럼 빈 인터페이스를 사용하면 함수가 다양한 타입의 값을 받을 수 있게 됩니다. 이는 Go 언어에서 매우 유용한 기능 중 하나입니다. 타입에 구애받지 않고 값을 전달할 수 있어 코드의 유연성과 재사용성을 높일 수 있습니다.