PHP에서의 함수 오버로딩(Function Overloading)
함수 오버로딩은 같은 이름을 가진 여러 메서드를 만들 수 있도록 허용하는 기능으로, 각 메서드는 인자로 전달받는 매개변수의 타입이나 개수에 따라 서로 다르게 동작합니다. 참고로 PHP는 C++나 자바와 같은 전통적인 방식의 오버로딩 문법을 직접 지원하지 않지만, __call() 매직 메서드를 활용하면 이와 유사한 효과를 손쉽게 구현할 수 있습니다.
예제
다음은 __call() 메서드를 사용해 함수 오버로딩을 구현한 예제입니다.
<?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.42648
이 예제에서 area() 메서드는 호출 시 전달된 인자의 개수에 따라 다른 연산을 수행합니다. 인자가 하나일 때는 원의 넓이(반지름 × π)를, 두 개일 때는 사각형의 넓이(가로 × 세로)를 계산하며, 인자가 없으면 0을 반환합니다. 하나의 메서드 이름으로 여러 동작을 처리하는 것이 바로 오버로딩의 핵심입니다.
PHP에서의 함수 오버라이딩(Function Overriding)
함수 오버라이딩은 상속 관계에 있는 부모 클래스와 자식 클래스가 동일한 이름과 동일한 개수의 인자를 가진 메서드를 각각 정의하는 것을 말합니다. 자식 클래스에서 재정의된 메서드는 부모 클래스의 메서드를 덮어쓰며, 실제로 호출되는 메서드는 객체가 어느 클래스의 인스턴스인지에 따라 결정됩니다.
예제
다음은 함수 오버라이딩을 구현한 예제입니다.
<?php
class Base {
function display() {
echo "\nBase class function declared final!";
}
function demo() {
echo "\nBase class function!";
}
}
class Derived extends Base {
function demo() {
echo "\nDerived class function!";
}
}
$ob = new Base;
$ob->demo();
$ob->display();
$ob2 = new Derived;
$ob2->demo();
$ob2->display();
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Base class function! Base class function declared final! Derived class function! Base class function declared final!
Derived 클래스의 demo() 메서드는 부모 클래스인 Base의 demo()를 오버라이딩했기 때문에, Derived 객체에서 demo()를 호출하면 자식 클래스의 메서드가 실행됩니다. 반면 display() 메서드는 자식 클래스에서 재정의되지 않았으므로, Derived 객체에서 호출해도 Base 클래스의 메서드가 그대로 실행되는 것을 확인할 수 있습니다.
오버로딩과 오버라이딩의 핵심 차이
- 함수 오버로딩: 같은 메서드 이름으로 인자의 개수나 타입에 따라 다른 동작을 수행하도록 하는 기법으로, PHP에서는 __call() 매직 메서드를 통해 구현합니다.
- 함수 오버라이딩: 상속 구조에서 자식 클래스가 부모 클래스의 메서드를 동일한 시그니처(이름과 인자 구성)로 재정의하는 것입니다.
- 적용 범위: 오버로딩은 주로 단일 클래스 내부에서 발생하고, 오버라이딩은 부모-자식 클래스 간의 상속 관계에서 발생합니다.