🔥 Nil 인터페이스 값

276자
4분

인터페이스는 값과 타입을 모두 가지고 있는 자료 구조라는 걸 이전 장에서 배웠죠. 그런데 인터페이스 변수에 아무 값도 할당되지 않은 상태를 nil 인터페이스 값이라고 해요. nil 인터페이스 값은 값도 없고 타입도 없는 상태랍니다.

nil 인터페이스에 메서드를 호출하면 런타임 에러가 발생해요. 그 이유는 인터페이스 내부에 어떤 구체적인 타입이 들어있는지 알 수 없기 때문이에요. 그래서 어떤 구체적인 메서드를 호출해야 할지 Go 런타임이 결정할 수 없게 되죠.

아래 코드를 통해 nil 인터페이스 값을 좀 더 자세히 살펴볼까요?

package main
 
import "fmt"
 
type I interface {
	M()
}
 
func main() {
	var i I // i는 I 인터페이스 타입의 nil 값
	describe(i) // i의 값과 타입 출력
	i.M() // nil 인터페이스에 메서드 호출 시도 -> 런타임 에러 발생!
}
 
func describe(i I) {
	fmt.Printf("(%v, %T)\n", i, i) // (<nil>, <nil>) 출력
}
 
go

코드를 하나씩 뜯어보면:

  1. type I interface { M() } - I라는 이름의 인터페이스를 정의합니다. I는 M() 메서드를 가지고 있어요.
  2. var i I - i라는 I 타입의 인터페이스 변수를 선언합니다. 초기값을 할당하지 않아 i는 nil 값을 가지게 되죠.
  3. describe(i) - i를 describe 함수에 전달합니다. describe 함수는 인터페이스 변수의 값과 타입을 출력해 줍니다.
  4. fmt.Printf("(%v, %T)\n", i, i) - i의 값과 타입을 출력합니다. nil 인터페이스이므로 (<nil>, <nil>)이 출력될 거예요.
  5. i.M() - nil 인터페이스 i에 M() 메서드를 호출합니다. 런타임 에러가 발생하게 되죠.

이 예제를 통해 nil 인터페이스 값은 호출할 수 있는 구체적인 메서드가 없다는 것을 확인할 수 있어요. 따라서 언제나 인터페이스 변수를 사용하기 전에는 nil 체크를 하는 습관을 들이는 게 중요하답니다!

nil 인터페이스에 대해 꼭 기억해야 할 핵심 포인트를 정리해 볼게요.

lecture image

이렇게 nil 인터페이스에 대해 알아봤어요. 인터페이스를 사용할 때는 항상 주의깊게 nil 체크를 하면서 코딩하시길 바랍니다. 그러면 런타임 에러를 예방할 수 있을 거예요!