🔥 Nil 인터페이스 값

276자
4분

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

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

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

go
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
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>) 출력
}
 

코드를 하나씩 뜯어보면:

  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 인터페이스에 대해 꼭 기억해야 할 핵심 포인트를 정리해 볼게요.

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

YouTube 영상

채널 보기
트라이(Trie)를 이용한 자동 완성 알고리즘 | Trie 자료구조 이야기
투영과 예측, 그리고 선형 결합 | 선형대수학
행렬의 기본 연산 - 행렬 덧셈, 스칼라 곱, 전치 | 선형대수학
트라이(Trie)에서 단어를 삭제하는 방법 | Trie 자료구조 이야기
내적의 기하학적 의미와 코사인 유사도 원리 | 선형대수학
스칼라 곱셈과 내적의 기하학적 의미 | 선형대수학
벡터의 정의와 덧셈 연산 | 선형대수학
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학