메소드 오버로딩(Method Overloading)은 객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 복합 애플리케이션을 손쉽게 구축할 수 있도록 도와주는 기능입니다. 함수 오버로딩 또는 메소드 오버로딩이란 동일한 이름을 가진 여러 개의 메소드를 정의하되, 각 메소드가 받아들이는 입력 파라미터(인자)의 타입이나 개수에 따라 서로 다르게 동작하도록 하는 기능을 말합니다.
Java나 C++ 같은 다른 프로그래밍 언어에서는 이러한 방식이 잘 지원되며, 컴파일 시점에 호출될 메소드가 결정되기 때문에 정적 다형성(Static Polymorphism)이라고 부릅니다.
일반적인 오버로딩 예제와 PHP의 한계
먼저 일반적인 방식의 메소드 오버로딩 코드를 살펴보겠습니다.
<?php
class machine {
function doTask($var1){
return $var1;
}
function doTask($var1,$var2){
return $var1 * $var1;
}
}
$task1 = new machine();
$task1->doTask(5,10);
?>출력 결과
Error
설명
위 코드는 에러를 발생시킵니다. PHP에서는 같은 이름의 메소드를 클래스 내에 두 번 선언하는 것이 허용되지 않기 때문입니다. 즉, PHP는 전통적인 의미의 메소드 오버로딩을 지원하지 않습니다.
반면 Java나 C++ 같은 언어에서는 doTask($var1)과 doTask($var1, $var2)를 서로 다른 오버로드된 메소드로 인식합니다. 후자를 호출하려면 두 개의 파라미터를 전달해야 하고, 전자는 하나의 파라미터만 필요합니다. 이처럼 코딩 시점에 어떤 함수를 호출할지 결정하는 동작 방식을 정적 다형성, 즉 메소드 오버로딩이라고 합니다.
PHP5에서 __call() 매직 메서드로 오버로딩 구현하기
그렇다면 PHP5에서는 메소드 오버로딩을 어떻게 구현할 수 있을까요? 정답은 PHP의 매직 메서드(Magic Method)인 __call()을 활용하는 것입니다.
PHP에서 오버로딩이란 메소드의 동작이 입력 파라미터에 따라 동적으로 변화하는 것을 의미합니다. 런타임에 존재하지 않는 메소드가 호출되면 그 요청을 대신 처리해 주는 방식으로 유연성을 확보할 수 있습니다.
__call() 메서드란?
클래스 내부에 __call() 메서드가 정의되어 있으면, 해당 클래스의 객체가 존재하지 않는 메소드를 호출할 때 원래의 메소드 대신 __call()이 자동으로 실행됩니다. 첫 번째 인자로는 호출된 메소드 이름이, 두 번째 인자로는 전달된 파라미터 배열이 넘어옵니다.
__call()을 활용한 실전 예제
다음 예제를 통해 PHP에서의 메소드 오버로딩을 자세히 이해해 보겠습니다.
<?php
class Shape {
const PI = 3.142;
function __call($name, $arg){
if($name == 'area')
switch(count($arg)){
case 0 : return 0;
case 1 : return self::PI * $arg[0];
case 2 : return $arg[0] * $arg[1];
}
}
}
$circle = new Shape();
echo $circle->area(3);
$rect = new Shape();
echo $rect->area(8,6);
?>출력 결과
9.426 48
설명
Shape 클래스에는 area() 메소드가 실제로 정의되어 있지 않습니다. 하지만 객체가 area()를 호출하는 순간, 매직 메서드 __call()이 이를 감지하여 동적으로 처리합니다. 파라미터가 하나만 전달되면 원의 넓이(PI × 반지름)를 계산하고, 두 개가 전달되면 사각형의 넓이(가로 × 세로)를 계산합니다.
즉, area() 메소드는 __call() 덕분에 동적으로 생성·실행되며, 전달된 파라미터의 개수에 따라 그 동작이 달라지는 것이 바로 PHP식 메소드 오버로딩입니다. 이 패턴을 활용하면 하나의 메소드 이름으로 다양한 상황에 유연하게 대응하는 깔끔한 코드를 작성할 수 있습니다.