ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Class .. Static
    php 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을 활용하려면, 메모리를 계산해서 프로그램에 올려놓고 인스턴스 요소를 활용하지 안고 이용할 수 있도록 제작하자.

    'php' 카테고리의 다른 글

    http 헤더 추가하기  (0) 2023.09.08
    MATCH 문  (0) 2023.09.07
    Class  (0) 2023.09.06
    지정인수  (0) 2023.09.06
    엄격한 타입 활성화  (0) 2023.09.04
Designed by Tistory.