R Language Definition: 5.4 UseMethod

R Language Definition: 5.4 UseMethod

UseMethod는 R의 메서드 디스패치를 담당하는 특별한 함수예요. 이 절에서는 UseMethod가 어떻게 동작하고, 평가 모델을 어떻게 바꾸는지 자세히 살펴볼게요.

출처: 문서

본문

5.4 UseMethod

UseMethod는 특별한 함수라서 다른 함수 호출과 다르게 동작해요. 호출 구문은 UseMethod(generic, object) 형태인데, 여기서 generic은 제네릭 함수의 이름이고, object는 어떤 메서드를 선택할지 결정하는 데 사용되는 객체예요. UseMethod는 함수 본문 안에서만 호출할 수 있어요.

UseMethod는 평가 모델을 두 가지 방식으로 바꿔요. 첫째, UseMethod가 호출되면 다음에 호출할 메서드(함수)를 결정해요. 그런 다음 현재 평가 환경을 사용해서 그 함수를 호출해요. 이 과정은 곧 설명할게요. 둘째, UseMethod가 평가 환경을 바꾸는 또 다른 방식은 호출한 함수로 제어권을 돌려보내지 않는다는 점이에요. 즉, UseMethod 호출 뒤에 있는 어떤 문장도 실행되지 않음이 보장돼요.

UseMethod가 호출되면 제네릭 함수는 UseMethod 호출에서 지정된 값이 돼요. 디스패치 대상 객체는 두 번째 인자로 제공되거나, 현재 함수의 첫 번째 인자예요. 그 인자의 클래스가 결정되고, 클래스의 첫 번째 요소가 제네릭 이름과 결합되어 적절한 메서드를 결정해요. 예를 들어 제네릭 이름이 foo이고 객체의 클래스가 "bar"라면, R은 foo.bar라는 이름의 메서드를 검색해요. 그런 메서드가 없으면 앞서 설명한 상속 메커니즘을 사용해서 적절한 메서드를 찾아요.

메서드가 결정되면 R은 그 메서드를 특별한 방식으로 호출해요. R은 새 평가 환경을 만들지 않고, 현재 함수 호출, 즉 제네릭 호출의 환경을 사용해요. UseMethod 호출 전에 이루어진 할당이나 평가는 그대로 유효해요. 제네릭 호출에 사용된 인자는 선택된 메서드의 형식 인자에 다시 대응돼요.

메서드가 호출될 때는 제네릭 호출에서와 개수와 이름이 같은 인자로 호출돼요. 이 인자들은 표준 R 인자 대응 규칙에 따라 메서드의 인자에 매칭돼요. 다만 객체, 즉 첫 번째 인자는 이미 평가된 상태예요.

UseMethod 호출은 평가 프레임에 몇 가지 특별한 객체를 배치하는 효과를 가져요. 그 객체들은 .Class, .Generic, .Method예요. R은 이 특별한 객체들을 사용해서 메서드 디스패치와 상속을 처리해요. .Class는 객체의 클래스이고, .Generic은 제네릭 함수의 이름이며, .Method는 현재 호출되는 메서드의 이름이에요. 메서드가 내부 인터페이스 중 하나를 통해 호출된 경우에는 .Group이라는 객체도 있을 수 있어요. 이에 대해서는 Group methods 절에서 설명할게요. 최초의 UseMethod 호출 이후에는 객체 자체가 아니라 이 특별한 변수들이 이후 메서드 선택을 제어해요.

그런 다음 메서드의 본문이 표준 방식으로 평가돼요. 특히 본문에서 변수를 찾을 때는 메서드에 적용되는 규칙을 따라요. 따라서 메서드에 연결된 환경이 있다면 그 환경이 사용돼요. 실제로는 제네릭 호출을 메서드 호출로 대체한 셈이에요. [R 4.4.0 이전에는 제네릭 프레임의 지역 할당이 메서드 호출로 이어졌지만, 이제는 더 이상 그렇지 않아요.]

제어권이 결코 제네릭으로 돌아오지 않기 때문에, UseMethod 호출 뒤의 어떤 표현식도 실행되지 않는다는 점을 꼭 이해해야 해요.

UseMethod 호출 전에 평가된 제네릭의 인자는 계속 평가된 상태로 남아요.

UseMethod의 첫 번째 인자가 제공되지 않으면 현재 함수의 이름으로 간주돼요. UseMethod에 두 개의 인자가 제공되면 첫 번째는 메서드의 이름이고, 두 번째는 디스패치 대상 객체로 간주돼요. 이 객체는 필요한 메서드를 결정할 수 있도록 평가돼요. 이 경우 제네릭 호출의 첫 번째 인자는 평가되지 않고 버려져요. 메서드 호출에서 다른 인자를 변경할 방법은 없어요. 이 인자들은 제네릭 호출에서와 동일하게 유지돼요. 이는 다음 메서드 호출의 인자를 변경할 수 있는 NextMethod와 대조적이에요.

더 알아보기 (Learn more)

출처: R Language Definition - 5.4 UseMethod