예를 들어 기존의 생성한 클래스가 하나 있습니다. 그리고 기존과 기능이 비슷하지만 몇 개의 기능이 추가된 또 다른 클래스 하나 더 만들려고 합니다.
이렇게 기존에 만들어 놓은 클래스 소스를 같이 사용을 하면서, 새로운 추가 클래스를 만들 수 있는 방법은 없을까? 개발자라면 이런 고민을 해본 적이 있을 것입니다. 기존 클래스 코드를 유지하면서 새로운 클래스를 적용할 수 있는 방법이 상속입니다.
상속은 말 그대로 부모의 클래스 자산을 이어받는 것입니다. 우리는 부모의 유전자를 기반으로 새로운 생명이 만들어졌고, 그 부모 또한 그렇습니다. 이처럼 상속은 기존의 것을 유지하면서 새로운 것을 만들 때 매우 유용합니다.
상속을 받으면 부모의 기능들은 사용할 수도 있고 자신만의 새로운 기능들도 추가할 수 있습니다. 일거양득으로 소스의 코드들을 향상시킬 수 있습니다.
클래스를 상속하여 사용하는 것은 매우 간단합니다. 상속을 하고자 하는 클래스를 클래스 선언부 뒤쪽에 extends 키워드를 추가하여 상속하고자 하는 부모 클래스명을 적으면 됩니다.
클래스 상속 문법
class 기존 클래스
{
}
class 추가 클래스 extends 기존 클래스 {
}
class 추가 클래스2 extends 추가 클래스 {
}
위의 사용 문법을 보면 기존 클래스 하나가 선언되어 있습니다. 추가 클래스는 extends 키워드를 통하여 기존클래스를 상속한 새로운 클래스가 하나 더 생성을 했습니다.
처음에 만든 기존 클래스는 상속받은 추가클래스의 또 다른 클래스 상속의 부모로 사용할 수 있습니다. 추가 클래스2는 추가클래스를 상속받은 새로운 객체 입니다.
예제 파일 extends-01.php
<?php
// 기본 클래스 a를 생성합니다.
class a
{
public function hello($string)
{
echo "Hello = " . $string . "<br>";
}
}
// 기본 클래스 a를 상속하는 b 클래스를 생성합니다.
class b extends a
{
public function whatIs($string)
{
echo "myName is: " . $string . "<br>";
}
}
// 상속받은 b 클래스 인스턴스를 생성합니다.
$obj = new b();
// 상속받은 부모의 메서드 함수를 사용할 수 있습니다.
$obj->hello("jiny");
// 새롭게 추가한 메서드 함수를 사용할 수 있습니다.
$obj->whatIs("hojinLee");
?>
결과
Hello = jiny
myName is: hojinLee
위의 예는 클래스 상속의 예입니다. 클래스 a와 a를 상속한 새로운 클래스 b 두 개를 생성합니다. 상속은 extends 키워드를 이용하면 됩니다. $obj 클래스 객체는 상속받은 클래스 a의 매서드를 호출하여 사용할 수 있습니다.
클래스 상속의 또 다른 의미는 무엇일까요? 바로 클래스가 계층화 된다는 것입니다. 조상의 역사를 기록한 족보처럼 클래스도 계속 상속을 하게 되면 족보처럼 단계별로 계층화됩니다.
클래스 상속이 계속 되면서 개발자가 추가한 새로운 메서드와 프로퍼티가 추가되고 기능이 하나씩 늘어가는 것입니다. 이렇게 계층화되면서 코드는 더욱 더 고도화되고 커져 갑니다.
또한 계층화된 구조를 쉽게 파악하기 위해서 별도의 계층도 같은 그림을 그려서 관리하기도 합니다.
이러한 계층적 작업은 여러 사람들이 같이 코드를 작성하고 기능을 추가하는 데 매우 유연한 환경을 제공합니다. 내가 만들어 놓은 클래스를 응용하여 새로운 클래스를 다른 사람들이 만들어 사용할 수도 있을 것입니다. 클래스의 상속과 계층화는 마치 부품을 하나씩 조립하면서 또 다른 큰 부품을 만들고, 그 부품들을 조립하여 최종적인 결과물을 만들어내는 것과 유사합니다.
extends로 상속받는 이전의 클래스를 부모 클래스라고 합니다.
클래스 상속 시 부모의 메서드 및 프로퍼티를 별도의 특별한 표기 없이 쉽게 사용을할 수 있습니다. 하지만 부모 클래스의 프로퍼티와 메서드 기능을 꼭 선택해서 호출하고 싶을 때는 parent:: 키워드를 이용하여 부모 클래스를 호출할 수 있습니다.
예제 파일 extends-02.php
<?php
// 기본 클래스 a를 생성합니다.
class a
{
public function isAdult($age)
{
if($age>=18) return true; else return false;
}
}
// 기본 클래스 a를 상속하는 b 클래스를 생성합니다.
class b extends a
{
public function whatIs($string,$age)
{
echo "myName is: " . $string . "<br>";
if (parent::isAdult($age)){
echo "성인입니다.<br>";
} else {
echo "미성년입니다.<br>";
}
}
}
// 상속받은 b 클래스 인스턴스를 생성합니다.
$obj = new b();
// 새롭게 추가한 메서드 함수를 사용할 수 있습니다.
$obj->whatIs("hojinLee",18);
$obj->whatIs("jiny",17);
?>
결과
myName is: hojinLee
성인입니다.
myName is: jiny
미성년입니다.
위의 예는 클래스 상속의 예입니다. 클래스 b는 클래스 a를 상속받은 클래스입니다. Parent:: 키워드를 이용하여 클래스 a의 메서드를 호출할 수 있습니다.
자식 클래스는 부모 클래스의 반대말입니다.
부모 클래스를 상속받아 새롭게 생성되는 클래스를 자식 클래스라고 합니다.