프로그래밍Go 백엔드 개발자

Go에서 인터페이스란 무엇이며, 그것의 구현 및 비교는 어떻게 이루어지며, 다른 언어의 인터페이스와의 차이는 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

Go에서 인터페이스는 타입이 이 인터페이스에 맞도록 구현해야 하는 메소드의 집합입니다. 명시적인 키워드 implements가 없으며, 호환성은 _구조적_일 뿐이고 선언적이지 않습니다. 인터페이스 타입의 변수에 실제 타입을 할당할 수 있는 것은 해당 타입이 인터페이스의 모든 메소드를 구현할 때만 가능합니다.

중요한 점: 인터페이스 변수는 데이터(value)와 타입(type)에 대한 두 개의 포인터를 포함합니다.

선언 및 구현 예:

type Printer interface { Print() } type MyPrinter struct{} func (mp MyPrinter) Print() { fmt.Println("printing...") } var p Printer = MyPrinter{} p.Print() // "printing..."

반전의 질문

인터페이스 변수가 nil일 경우 무슨 일이 발생할까요? "var i interface{} = nil"과 "var i interface{}"는 어떻게 다른가요?

자주 잘못된 답변 — "두 값 모두 nil입니다". 사실은 아닙니다:

  • var i interface{} = nil — 변수는 실제로 nil입니다 (type=nil, value=nil)
  • 그러나 var p *MyPrinter = nil; var i Printer = p라면, i != nil입니다. type != nil이기 때문입니다 (i 내부에 type=*MyPrinter, value=nil이 존재하므로), if i == nil과 같은 많은 검사가 기대하는 대로 작동하지 않을 수 있습니다.

예:

var p *MyPrinter = nil var i Printer = p fmt.Println(i == nil) // false!

주제에 대한 미세한 부분을 알지 못해 발생한 실제 오류 사례


이야기

설명: 한 서비스에서 오류 처리기가 nil 값의 인터페이스를 반환했고, 클라이언트는 오류를 널이 아닌 것으로 간주하여 불필요한 작업을 수행했습니다. 문제는 nil와의 인터페이스 비교에 있었습니다.


이야기

설명: 테스트를 작성할 때 nil 필드를 가진 구조체를 반환한 후 인터페이스 타입의 오류가 nil과 같음으로 잘못 체크되었습니다. 테스트는 실제 오류를 탐지하지 못해 프로덕션에서 버그가 발생했습니다.


이야기

설명: 하나의 인터페이스 타입에서 다른 타입으로 마이그레이션할 때 명시적인 implements가 없던 탓에 새 인터페이스의 모든 메소드를 구현하는 것을 잊었습니다. 코드는 컴파일되었지만, 인터페이스는 구현되지 않았고, 몇몇 모킹 함수가 작동하지 않았습니다.