static과 final에 대해 정리해보겠습니다.
1) static
변수와 메소드 선언 시 사용할 수 있습니다.
static으로 선언된 변수와 메소드는 정적변수/정적메소드 라고 칭하며, [ new 클래스 ] 같이 인스턴스 생성을 위한 코드를 작성할 필요가 없이 바로 접근 혹은 호출이 가능합니다.
static을 변수 선언에 사용할 경우 해당 변수는 클래스 내부에서 공유됩니다. 클래스 내부에서 객체를 생성할 필요 없이 바로 사용할 수 있습니다.
static을 메소드 선언에 사용할 경우 핻아 메소드 역시 클래스 내부에서 공유됩니다. 마찬가지로 객체를 생성할 필요 없이 '클래스::메소드()'로 사용할 수 있습니다.
static을 이용한 변수와 메소드 선언은 클래스 내부에서 객체간의 공유가 필요할 때 이루어지며, static을 통해 메모리상에 생성된 객체는 프로그램이 종료될 때까지 리소스를 잡아먹기 때문에 꼭 필요한 경우에만 사용해야 합니다.
<?php
class StaticTest{
public static $a = "static으로 생성한 프로퍼티 <br/>";
public static function function1(){
$a = "static으로 생성한 메소드";
echo "$a";
}
}
echo StaticTest::$a;
StaticTest::function1();
?>
StaticTest 클래스에서 static 형식으로 a라는 프로퍼티(변수)를 선언하고 값을 할당했습니다.
StaticTest 클래스에서 static 형식으로 function1 메소드를 생성했고 a라는 프로퍼티를 선언하여 echo로 출력합니다.
클래스에서 static으로 선언된 프로퍼티는 객체생성이 필요 없이 바로 참조 가능합니다.
마찬가지로 static으로 선언된 메소드는 객체생성이 필요없이 호출 가능합니다.
2) final
경우에 따라서는 메소드나 클래스에 대해 상속을 못하도록 금지해야 하는 경우가 있습니다.
이 경우 final을 사용합니다.
클래스 : 하위 클래스에 대한 상속을 허용하지 않는다.
메소드 : 하위 클래스에서 static으로 선언한 메소드를 오버라이드 할 수 없다.
<?php
final class A{
public $a = "final로 선언한 클래스의 static 프로퍼티 <br/>";
final public function function1(){
echo "final로 선언한 클래스의 메소드";
}
}
//class B extends A{};
$instance1 = new A();
echo "$instance1->a";
$instance1->function1();
?>
final 로 A 라는 클래스를 생성했습니다.
A 클래스를 상속받는 B 클래스 생성에 대한 코드는 주석처리 해 놓았으며, 위 코드를 실행시켜보면
잘 접근되는 것을 확인할 수 있습니다.
<?php
final class A{
public $a = "final로 선언한 클래스의 static 프로퍼티 <br/>";
final public function function1(){
echo "final로 선언한 클래스의 메소드";
}
}
class B extends A{};
$instance1 = new A();
echo "$instance1->a";
$instance1->function1();
?>
위 코드에서 주석처리 해놓았던 상속된 클래스 생성을 해보면
에러가 발생하는 것을 볼 수 있습니다.
'php' 카테고리의 다른 글
[php 내장함수] 숫자 관련 함수 (0) | 2021.08.21 |
---|---|
클래스 및 객체(8) (0) | 2021.08.20 |
클래스 및 객체(6) (0) | 2021.08.18 |
클래스 및 객체(5) (0) | 2021.08.17 |
클래스 및 객체(4) - $this-> 의 이해 (0) | 2021.08.05 |