객체지향언어로서의 PHP – 5.정적 멤버함수

정적 멤버함수(static member function)

  • 정적 멤버함수(C++) = 클래스 메소드(자바)

일반 멤버함수는 클래스만 선언한다고 해서 호출할 수 있는 것이 아니라 반드시 객체를 생성한 후에 객체를 통하여 호출되어야 합니다. 멤버 함수가 하는 일이 객체를 대상으로 수행되는 것이기 때문에 반드시 객체가 있어야 합니다. 반면 정적 멤버함수는 객체가 없어도 호출할 수 있습니다. 정적 멤버함수는 특정 객체를 대상으로 수행되는 것이 아니고 주로 정적 데이터멤버(PHP에서는 정적 데이터멤버가 아직 지원되지 않고 있음)를 대상으로 수행하기 때문에 객체없이도 호출이 가능합니다.

정적 멤버함수는 그 클래스 자체에 전역적(클래스 스코프)이며 다른 클래스나 객체에 서로 사용될 수 있습니다. 그래서 정적 멤버함수는 그 클래스의 인스턴스가 있든 없든 상관없이 어느 곳에서나 사용될 수 있는 것입니다. 이러한 경우에는 정적 멤버함수를 정의하고 있는 클래스의 이름을 범위연산자 “::”와 연결되어 사용되어야 합니다.

  • 클래스명::멤버함수

정적 멤버함수의 용도

객체를 통해서만 호출할 수 있는 일반 멤버함수와 달리 정적 멤버함수는 객체없이도 호출될 수 있습니다. 따라서 프로그램에서 객체를 생성하기 전에 반드시 실행하여야 하는 작업 또는 인스턴스를 모두 삭제한 다음에 반드시 실행하여야 하는 작업 등이 정적 멤버함수로 정의되는 것이 바람직합니다.

PHP에서의 정적 멤버함수의 한계

정적 멤버함수가 다루어야 할 가장 기본적인 요소(멤버)는 정적 데이터멤버입니다. 정적 데이터멤버 역시 정적 멤버함수와 마찬가지로 객체와 관계없이 클래스 스코프(사용범위)를 가지고 있기 때문에 정적 멤버함수에서 다룰 수 있는 유일한 데이터멤버입니다. 그러나 PHP에서는 아직 정적 데이터멤버에 대하여 제공하고 있지 않으므로 정적 멤버함수에서는 단지 전역변수와 지역변수만 다룰 수 있습니다. 클래스 내에서 전역변수를 사용한다는 것은 객체지향언어의 캡슐화하고는 거리가 멀고 지역변수는 특정 멤버함수만 사용할 수 있으니 모든 멤버함수가 공유하기는 어렵기 때문에 사용상 한계를 가지고 있습니다.

PHP4로 업그레이드하면서 정적 멤버함수를 지원하면서 왜 정적 데이터멤버를 빼버렸는지는 모르겠으나 그것은 개발자 맘(?)이고, 우리는 주어진 기능을 최대한 이용하여야 겠지요.

답글 남기기