Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 정적(Static) 메서드와 인스턴스(Instance) 메서드, 차이점과 활용법 완벽 정리

PHP에서는 일반적으로 인스턴스 메서드(instance method)가 정적 메서드(static method)보다 권장되는 방식입니다. 하지만 이것이 정적 메서드가 쓸모없다는 의미는 결코 아닙니다. 정적 메서드 역시 명확하고 고유한 용도를 지니고 있으며, 상황에 따라 매우 유용하게 활용될 수 있습니다.

두 메서드의 가장 근본적인 차이는 다음과 같습니다. 인스턴스 메서드는 항상 클래스의 객체(object)에 연결되어 호출되는 반면, 정적 메서드는 객체 생성 없이 클래스 자체에 연결되어 호출됩니다.

PHP에서의 정적(Static) 메서드란?

정적 메서드는 다른 객체지향 프로그래밍 언어(OOP)의 개념과 동일합니다. 정적 메서드를 사용해야 하는 대표적인 경우는 다음과 같습니다.

  • 특정 데이터가 클래스 전체에서 변하지 않고 동일하게 유지될 때
  • 객체를 생성하지 않은 채로 클래스 이름만으로 바로 메서드에 접근하고 싶을 때

정적 메서드 예제

<?php
    class Car {
        static function getColor() {
            return "blue";
        }
    }
    echo Car::getColor();
?>

실행 결과:

blue

코드 설명

위 예제에서 자동차 정보를 다루는 프로그램을 작성한다고 가정해 보겠습니다. Car 클래스 안에 자동차 색상을 반환하는 getColor() 함수가 있는데, 만약 모든 자동차 객체가 동일한 색상 값을 반환해야 한다면 어떨까요?

이 경우 각 객체마다 별도로 함수를 호출할 필요가 없으므로, getColor()정적 메서드로 선언하는 것이 적합합니다. Car::getColor()처럼 클래스 이름과 범위 해석 연산자(::)만으로 객체 생성 없이 곧바로 호출할 수 있습니다.

PHP에서의 인스턴스(Instance) 메서드란?

인스턴스 메서드는 다음과 같은 상황에서 반드시 사용해야 합니다.

  • 메서드를 호출하기 위해 반드시 객체를 생성해야 하는 경우
  • 메서드가 실행될 때마다 클래스의 프로퍼티(property)와 상호작용해야 하는 경우

즉, 객체마다 서로 다른 상태(데이터)를 가져야 한다면 인스턴스 메서드를 사용해야 합니다.

인스턴스 메서드 예제

<?php
    class Employee {
        private $empname;

        function setEmpname($empname) {
            $this->empname = $empname;
        }

        function getEmpname() {
            return $this->empname;
        }
    }

    $obj = new Employee();
    $obj->setEmpname("Alex");
    echo $obj->getEmpname();
?>

실행 결과:

Alex

코드 설명

위 예제의 Employee 클래스에는 직원 이름을 저장하는 setEmpname() 메서드와 저장된 이름을 반환하는 getEmpname() 메서드가 있습니다.

여기서 중요한 점은 직원마다 이름이 모두 다르다는 것입니다. 따라서 이 두 메서드는 호출될 때마다 객체 내부의 프로퍼티인 $empname 변수와 상호작용하므로, 절대 정적 메서드로 선언해서는 안 됩니다. 각 객체가 고유한 데이터를 유지해야 하기 때문입니다.

정리: 정적 메서드 vs 인스턴스 메서드

구분정적 메서드인스턴스 메서드
호출 방식클래스명::메서드()$obj->메서드()
객체 생성불필요필수
데이터 성격모든 객체가 공유하는 고정 값객체마다 고유한 값
프로퍼티 접근일반적으로 불가($this 사용 불가)$this를 통해 자유롭게 접근 가능

결론적으로, 값이 클래스 전체에서 일정하고 객체 없이 접근해야 한다면 정적 메서드를, 객체별로 다른 데이터를 다뤄야 한다면 인스턴스 메서드를 선택하는 것이 올바른 설계 방식입니다. 이 구분을 명확히 이해하면 더 깔끔하고 유지보수하기 좋은 PHP 코드를 작성할 수 있습니다.