본문 바로가기

PHP

클래스와 객체-클래스 상속과 final 객체키워드

php문에서 각 클래스는 부모 자손 관계를 취하여

자손클래스는 extends라는 키워드를 통해 부모클래스의 메서드를 상속받을 수 있다.

 

설명만으로는 감이 잡히지 않을 것 같아 간단한 예시구문을 들어보겠다.

 

<?php
   class User{
       private $name = "이유림"; 
       
       public function print_hello(){
           echo $this->name;
           echo "님, 안녕하세요!<br>";
       }
   }
   
   $user01 = new User();
   $user01->print_hello();     // 이유림님 안녕하세요 출력
   
   
   class Guest extends User{ /
       private $name = "남주혁"; 
   }
   
   $guest = new Guest();
   $guest->print_hello();      // 이유림님 안녕하세요 출력
   
?>

 

 

 

User와 Guest라는 클래스 2개를 생성하였다

위 코드를 보면 User 클래스 안에 $name님 안녕하세요 라고 출력이 되는 함수를 넣었기 때문에

실행을 해보면 "이유림님 안녕하세요" 라는 문구가 출력이 될것이다

 

하지만 Guest안에는 함수를 넣지 않았음에도 "이유림님 안녕하세요"가 출력이 된다. 이는 Guest가 User를 상속받았기 때문에 Guset클래스 안에서도 User의 함수가 동작할 수 있는것이다.

하지만 Guset의 name인 "남주혁"이 아닌 "이유림"이 나올것이다

 

이때 Guest의 print_hello를 "남주혁"으로 바꾸어주는 방법이 있는데

 

class User{
       private $name = "이유림"; 
       
       public function print_hello(){
           echo $this->name;
           echo "님, 안녕하세요!<br>";
       }
   }

class Guest extends User{ //Guest라는 클래스는 User를 상속 - extends키워드를 통해 상속
     private $name = "게스트";  
     
     public function print_hello(){ 
         echo $this->name;
         echo "님, 안녕하세요!<br>";
     }
 }
 
$guest = new Guest();
$guest->print_hello();

 

 

이렇게 클래스 내부에 print_hello( )함수를 다시 선언해주면 된다.

이것을 오버라이드(자손이 브모 클래스를 재정의하는것) 라고 한다

 

이렇게 되면 결과값은

"남주혁님 안녕하세요"가 출력되게된다

 

 

 

 

마지막으로 자손이 오버라이드를 할수 없게 만드는 키워드는 final이다

 

class User{
       private $name = "이유림"; 
       
       final public function print_hello(){
           echo $this->name;
           echo "님, 안녕하세요!<br>";
       }
   }

class Guest extends User{ //Guest라는 클래스는 User를 상속 - extends키워드를 통해 상속
     private $name = "게스트";  
     
     public function print_hello(){ 
         echo $this->name;
         echo "님, 안녕하세요!<br>";
     }
 }
 
$guest = new Guest();
$guest->print_hello();

 

 

 

위의 코드처럼 부모 클래스인 User 클래스 내부에 final 키워드를 넣어주면 더이상 그 함수는 자손이 오버라이딩을 할 수 없게된다

따라서 위의 코드는

"이유림님 안녕하세요"가 출력이 된 후 에러메시지가 뜨게 될 것이다

 

 

 

+개인적으로 $name의 접근 키워드가 private에도 불구하고 조회가 가능한것에 이유가 궁금했는데

이거는 이 $name을 포함한 명령을 실행시키는 함수의  접근키워드가 public이기 때문이다

이 때 변수를 직접 실행시키면 당연히 에러메시지가 뜨게된다