메서드 셋(Method sets)

메서드 셋(Method sets)

어떤 타입에 어떤 메서드를 붙여 부를 수 있는지, 그 기준은 바로 '메서드 셋'이라는 개념이에요. 타입마다 자기만의 메서드 목록을 갖고 있는데, 이걸 정확히 짚고 넘어가야 인터페이스나 포인터 수신자를 다룰 때 헷갈리지 않아요.

출처: Go Specification

본문

타입의 *메서드 셋(method set)*은 그 타입의 피연산자에 대해 호출할 수 있는 메서드들을 결정해요. 모든 타입은 (어쩌면 비어 있을) 메서드 셋을 하나씩 갖고 있는데, 타입에 따라 그 구성이 달라져요.

  • 정의된 타입 T의 메서드 셋은 수신자 타입이 T로 선언된 모든 메서드로 이루어져요.

  • 포인터인 T가 아니고 인터페이스도 아닌, 즉 그냥 정의된 타입 T를 가리키는 포인터의 메서드 셋은 수신자가 *T 또는 T로 선언된 모든 메서드의 집합이에요.

  • 인터페이스 타입의 메서드 셋은 인터페이스의 타입 셋에 있는 각 타입의 메서드 셋들의 교집합이에요 (그 결과 메서드 셋은 보통 인터페이스에 선언된 메서드들의 집합과 같아요).

여기에 덧붙여, 임베디드 필드를 포함하는 구조체(와 구조체에 대한 포인터)에는 추가 규칙이 적용돼요. 자세한 내용은 구조체 타입 섹션에서 설명해요. 그 밖의 다른 모든 타입은 빈 메서드 셋을 가져요.

메서드 셋 안에서는 각 메서드가 고유한 비-빈 메서드 이름을 가져야 해요.

더 알아보기

  • 메서드 셋은 호출 가능한 메서드를 정하므로, 인터페이스 충족 여부를 판단할 때도 같은 기준이 적용돼요.
  • 포인터 수신자와 값 수신자의 차이가 메서드 셋에 어떤 영향을 주는지는 메서드 선언 쪽에서 함께 보면 좋아요.
  • 임베디드 필드가 메서드 승격(promotion)에 미치는 영향은 구조체 타입에서 다뤄요.