프로그래밍Go 개발자

Go에서 구조체에 대한 메서드는 어떻게 작동합니까? 메서드의 선언과 함수는 어떻게 다르며 별칭 타입에 대한 메서드는 어떻게 구현됩니까?

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

답변

Go에서 메서드는 특정 타입에 대한 메서드임을 나타내는 receiver (리시버)가 있는 함수입니다:

type User struct { Name string } func (u *User) SayHello() { fmt.Println("안녕하세요,", u.Name) }
  • 메서드는 특정 타입(예: User)과 연결되어 있지만, 함수는 그렇지 않습니다.
  • 메서드의 리시버((u *User))는 함수의 첫 번째 인수처럼 작동하지만, 구문과 호출이 다릅니다.

중요! 메서드는 여러분의 패키지에서 정의된 타입에만 선언할 수 있습니다 (다른 패키지에서 정의된 타입, 포함 내장 타입에는 메서드가 없음). 별칭에 대한 동작은 특별합니다:

  • 기존의 타입을 기반으로 한 새로운 타입(type MyInt int)에 대해서는 메서드를 추가할 수 있습니다.
  • 타입 별칭(type MyInt = int)에 대해서는 메서드를 추가할 수 없습니다. 왜냐하면 이것은 단순히 별칭일 뿐입니다.

예:

type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // 타입 별칭 type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // 컴파일 오류

트릭 질문

[]int 타입 슬라이스에 대해 메서드를 선언할 수 있습니까, 아니면 타입 별칭에 대해 메서드를 선언할 수 있습니까?

답변: 내장 타입 슬라이스([]int)에 대해서는 메서드를 선언할 수 없습니다. 슬라이스 기반의 새로운 사용자 정의 타입에 대해서는 가능합니다:

type MySlice []int func (s MySlice) Sum() int { ... } // 허용됨

타입 별칭에 대해서는 불가능합니다:

type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // 오류

이 주제의 미세한 차이를 알지 못해 발생한 실제 오류의 예


이야기

마이크로서비스 프로젝트에서 팀은 int64에 대한 타입 별칭을 정의하고 그에 대해 유효성 검사 메서드를 선언하려 했습니다 — 코드가 컴파일되지 않아 모든 구조체를 리팩토링해야 했습니다.

이야기

백엔드 프로젝트에서 커스텀 슬라이스에 대한 메서드를 작성했지만 실수로 새로운 타입(type ... []T)을 정의하지 않고 내장된 []T로 작업하여 슬라이스의 요소에 대한 메서드를 하나도 추가할 수 없었습니다.

이야기

외부 패키지의 타입(예: time.Time)에 메서드를 추가하려고 했으나 날짜와의 작업을 표준화하기 위해 이것이 Go에서 불가능하다는 것을 알게 되어 조합(composition) 및 유틸리티 함수를 사용해야 했습니다.