php

Class .. Static

hojomu 2023. 9. 6. 16:13

1. Static 으로 선언할 경우.

Class 내부에서 Static으로 선언된 변수 / 메서드의 경우.

객체에 소속되는 것이 아니라 클래스에 고정되어 있다.

-> Static이 선언된 요소는 클래스를 가져오기만 해도 메모리에 고정적으로 할당된다.

따라서, 인스턴스를 통해 객체를 생성하지 않아도 이용이 가능하다.

클래스를 불러오는 프로그램이 실행되면 자동으로 메모리에 static이 적재되고, 프로그램이 종료될 때 해제된다.

** 결국 Static은 사용자가 객체를 인스턴스하기 전 부터 올라가 있기 때문에, Static 요소 내부에서는 인스턴스 변수를 활용할 수 없다.

** 일반적인 요소의 경우, 객체를 생성하면 메모리의 Heap 영역에 올라간다. Heap 영역에 올라간 요소들은 Garbage Collector에 의해 자동으로 관리된다. ( 사용하지 않으면 삭제해서 메모리를 관리함 )

Static 요소들은 Static 영역에 존재하기 때문에 Garbage Collector의 관리를 받지 못한다. 따라서 프로그램이 꺼지기 전 까지 메모리를 차지하기 때문에, 어떤 요소를 Static으로 활용할지 선택을 잘 해야한다.

 

2. 예제

 직접 클래스를 만들고 불러와보자.

 

StaticEx.php

<?php

namespace App\DailyReportCrawler;

class StaticEx
{
    private $name = 1;
    private static $address = 0;

    public function __construct
    (
        public int $a,
        public int $b
    )
    {
        $this->name = $this->name + $a + $b;
        self::$address = self::$address + 1;
    }

    public function plus(int $c , int $d){
        return $this->name + $c + $d;
    }

    public static function minus(int $f, int$g){
        return self::$address + $f - $g;
    }
}

?>

namespace를 지정해서 autoload로 경로가 이어져 있는 곳에서 쉽게 불러올 수 있도록 class를 제작했다.

 - 변수를 선언하는 부분에서 public을 사용하는 것과 하지않는 것에는 차이가 있다.

public이 선언되어있지 않다면, __construct가 실행되기 전 까지 $name은 초기화되지 않고 비어있을 것이다.
하지만 public이 선언되어 있다면, StaticEx를 불러오는 것과 동시에 $address가 초기화 될것이다.

 - 일반 변수, 메서드는 $this-> 로 접근할 수 있고, static이 선언된 변수, 메서드에는 self::$ 로 접근할 수 있다.

 

StaticExDo.php 에서 활용하기

require_once로 autoload가 설정되어있는 bootstrap을 불러온 후 StaticEx를 가져왔다.

객체를 인스턴스 하지 않고도 static으로 선언된 변수를 echo 할 수 있었다.

 

$staticEx 객체를 생성한 이후에는 $name의 값도 꺼내올 수 있었다.

__construct 의 결과로 name과 address의 값이 알맞게 변환되었다.

객체 2개 생성했다.

$address의 경우, 프로그램의 영역에 메모리가 올라가 있기 때문에 인스턴스를 2번 실행하자,
데이터가 누적되어 2가 되었다.

$name의 경우, 인스턴스 할 때 마다 새롭게 초기화 되었다.

 

메서드도 static은 인스 턴스 없이 사용이 가능하다.

 

Static을 활용하려면, 메모리를 계산해서 프로그램에 올려놓고 인스턴스 요소를 활용하지 안고 이용할 수 있도록 제작하자.