php 입문 | 구조와 객체 지향 | 클래스 메소드와 클래스 필드


지금까지는 “클래스는 인스턴스를 만들고 조작한다"것이 기본이라고 설명했었다. 그러나 실은 꼭 그래야만 하는 것인 아니다. 클래스를 클래스 그대로 사용할 수도 있다. 다만, 그러기 위해서는 메소드나 필드를 다른 형태로 작성을 해야 한다.

인스턴스가 아닌 클래스에서 직접 사용할 수 있는 메소드나 필드는 “클래스 메소드”, “클래스 필드 ‘라고 한다. 클래스를 단순한 설계도라고 생각하면, 어떻게 클래스 안에 값을 저장하거나 메소드를 실행하거나 할 수 있는지 조금 이상한 느낌이 있지만, “클래스도 객체에서 클래스라는 객체를 바탕으로 인스턴스라는 객체를 만들고 있다"고 상상하면 좋을 것이다.

클래스에서 제공하는 메소드나 필드는 앞에 “static"라는 키워드를 붙인다. 이는 ‘정적’이라는 의미로, 클래스 메소드나 클래스 필드는 “static 메소드”, “static 필드"라고도 한다.

그럼 이러한 기본적인 사용법을 간단하게 정리해 보자. 우선 이러한 정의는

static $변수;
static function 메소드(가인수) {...}

이렇게 앞에 static을 넣기 만하면 된다. 액세스 키워드를 넣는 경우는 static 후에 “static private $hoge;“와 같은 식으로 쓴다. 이러한 필드나 메소드의 호출은

클래스::$변수;
클래스::메소드(인수);

이와 같이 작성한다. 클래스명 후에는 ::라는 기호를 붙이고 작성한다. 주의할 점은 필드이다. 인스턴스 필드는 “클래스->변수"과 같이 작성하지만, 클래스 필드의 경우 “클래스::$변수"과 같이, $를 붙여 작성한다.

그럼 이도 실제 예제를 보도록 하자.

<?php
class TextModify {
    static private $header = "<b>";
    static private $footer = "</b>";
    static private $find = "PHP";
     
    static function setTagData($h,$f) {
        self::$header = $h;
        self::$footer = $f;
    }
     
    static function setFind($f) {
        self::$find = $f;
    }
     
    static function writeRenderText($s) {
        $res = str_replace(self::$find, self::$header . self::$find . self::$footer, $s);
        echo $res;
    }
}
     
// 클래스 준비
TextModify::setTagData('<span style="font-size:200%;">', '</span>');
TextModify::setFInd('PHP');
 
if ($_POST != null){
    $str = $_POST['text1'];
}
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>
        <?php
        TextModify::writeRenderText('Hello PHP!');
        ?>
        </h1>
        <p><?php TextModify::writeRenderText('여기에 PHP라는 문자를 포함한 문장을 써주세요.'); ?></p>
        <hr>
        <p><?php TextModify::writeRenderText($str); ?></p>
        <form method="post" action="./index.php">
            <textarea name="text1" cols="40" rows="5"><?php echo $str; ?></textarea>
            <br><input type="submit">
        </form>
        <hr>
    </body>
</html>

위 예제는 먼저번 예제인 TextModify 클래스를 클래스 메소드와 클래스 필드를 이용하는 형태로 다시 작성한 것이다. 여기에서는 PHP라는 텍스트를 2배의 글꼴 크기로 표시하고 있다.

이 예에서는 setTagData에 끼워 넣는 전후의 태그를 설정하고, setFind으로 검색 문자를 설정한다.

TextModify::setTagData('<span style="font-size:200%;">', '</span>');
TextModify::setFInd('PHP');

new로 인스턴스를 만들지도 않고, 바로 클래스에 값을 설정하고 있다. 그리고 텍스트를 출력할 때,

TextModify::writeRenderText('Hello PHP!');

이런 식으로 그냥 메소드를 호출할 뿐이다. 매우 간단하게 사용하고 있다.

클래스 메소드와 클래스 필드를 사용하면, 인스턴스를 만들지 않고도 이처럼 매우 간단하게 기능을 호출 할 수 있다. 반면 다양한 데이터를 보유하고 그것에 따라 동작하는 경우는 사용할 때마다 많은 데이터를 다시 설정해야 않기 때문에 매우 복잡하다.

많은 데이터를 보유하고 그에 따라 처리를 실시하는 것은 인스턴스를 만들어 사용하는 것이 훨씬 편리 하다. 클래스 메소드는 변경하는 일이 거의 없는 데이터 밖에 없는 경우, 단순히 정해진 기능을 호출만 하는 경우에 사용하면 좋다.

예를 들어, 수치 계산(인수로 숫자를 전달해서 결과를 반환 받는 일) 등을 클래스로 정리해서 사용하는 경우에는 일일이 인스턴스를 만드는 것보다, 클래스 메소드로 손쉽게 호출하는 것이 편리하다. 용도에 따라 구분하여 사용하는 것이 좋다.