phpclass/클래스활용2000. 6. 12. 14:51
함수 재정의란?
객체지향언어에서 말하는 함수 재정의(함수 오버라이딩;function overriding)는 부모클래스(base class)에서 정의되어 있는 멤버함수를 파생클래스(derived class)에서 자신에 맞는 멤버함수로 재정의 하여 부모클래스의 멤버함수를 무효화시키는 경우를 말합니다. 이를 위해서는 재정의 하고자 하는 부모클래스에 있는 함수의 함수명, 파라미터 수 및 데이터형을 동일하게 하여 파생클래스에 정의하면 됩니다.
PHP3에서의 함수 재정의
위에서 정의한 의미로 보면 PHP3에서는 함수 재정의라는 것이 특별히 정의되어 있지 않습니다. PHP3는 스크립트라는 특성 때문인지 모르겠으나 함수명만 같으면 파라미터 수 또는 데이터형에 관계없이 몇 개의 함수를 정의하던지 하나만 유효합니다. 같은 클래스 내에서는 아래쪽에 정의된 함수만 유효하며 두개 이상의 클래스가 상속 관계에 있을 때는 파생클래스에서 정의된 함수만 유효합니다. 즉 나중에 정의된 함수만 접근할 수 있습니다.
예를 들어보면,
첫째, 같은 클래스 내에 동일한 함수명으로 정의한 경우
[code php;gutter:false] <?php

class test {
//
// 멤버함수 a() case #1
//
function a() {
echo("class test:a() case #1\n");
}

//
// 멤버함수 a() case #2
//
function a($k) {
echo("class test:a($k) case #2\n");
}
}

$obj = new test;
$obj->a("파라미터");

?> [/code]
두 개의 멤버함수 a($k)와 a() 중 a($k)만 유효합니다. 즉 나중에 정의된 것만 호출할 수 있습니다. 따라서 객체를 생성할 때와 멤버함수를 호출할 때 위의 예와 같이 $obj->a("파라미터"); 라고 기술해야지 $obj->a();와 같이 기술하면 에러가 발생합니다. 위 예제의 실행결과는 아래와 같습니다.
class test:a(파라미터) case #2
위에서 정의한 것은 함수의 파라미터수가 다르기 때문에 C++과 같은 객체지향언어에서는 함수 오버로딩(overloading;중복정의)에 해당됩니다. 즉, a($k)와 a() 함수 둘 다 유효해야 하나, PHP에서는 마지막 정의 함수만 유효하게 됩니다. 마치 오버라이딩(재정의)된 것처럼...
둘째, 상속관계에 있는 부모와 파생클래스에 각각 동일한 함수명으로 정의한 경우
[code php;gutter:false] <?php

class test {
//
// 멤버함수 a() case #1
//
function a($k) {
echo("class test:a($k) case #1\n");
}
}

class test2 extends test {
//
// 멤버함수 a() case #2
//
function a($k) {
echo("class test2:a($k) case #2\n");
}
}

$obj = new test2;
$obj->a("파라미터");

?> [/code]
위 예제의 실행결과는 아래와 같습니다.
class test2:a(파라미터) case #2
즉, 동일한 이름으로 정의된 함수가 부모클래스와 파생클래스에 각각 정의하게 되면 나중에 나타나는 파생클래스에서 정의된 함수만 유효합니다.
PHP3에서의 함수 오버라이딩(재정의) 구현
PHP 에서는 파라미터 수 관계없이 함수명만 같으면 몇 개를 정의하더라도 마지막에 정의된 것만 유효하므로 특별히 함수 오버라이딩을 구현할 필요가 없습니다. 프로그래머가 알아서 파라미터 수를 같게 해서 정의하고 사용할 때 데이터형을 정확하게 맞춰주면 그것이 오버라이딩과 같은 효과를 얻을 수 있습니다. 문제는 오히려 함수 중복정의(오버로딩)가 안 된다는데 있습니다.
PHP4에서의 함수 재정의
PHP4에서는 재정의(?)되기 이전의 원래 메소드에 접근하기 위한 범위연산자가 제공되고 있습니다. 자세한 것은 "클래스사용법"의 범위연산자를 참조하세요.

Posted by 방글24