# 상속 (inheritance)
상속은 객체지향 프로그래밍을 했을 때 얻을 수 있는 생산성을 향상시킬 수 있는 중요한 기능 중 하나이다.
객체지향 이전에 함수로 코드를 구성하였을 때에는 하나의 프로그램 안에 수많은 함수들이 존재하였을 것이다. 그렇게 함수를 정의하여 프로그램을 구성하다 보면, 기능이 비슷한 함수들이 선언될 것이고, 가독성 및 유지보수의 향상을 위하여 그 함수들을 이름별 혹은 비슷한 위치에 놓아서 관리하여왔다.
그러나 객체지향 프로그래밍이 패러다임이 되면서, 비슷한 함수들을 하나의 객체(object)로 묶어 관리하고, 프로그램을 구성한다면, 프로그램의 가독성이 상승하고, 프로그램을 구성하는데 있어 생산성도 상승하며, 유지/보수 측면에서 역시 효율성이 극대화될 수 있게 되었다.
이렇게 객체지향 프로그래밍을 하게되면 내가만든 혹은 내제되어있는 혹은 남이 만든 객체를 가져다가 사용하는 것마저 가능하게 되는데, 이 때 본인이 구성하고자 하는 프로그램에 가져온 객체의 기능이 모자라거나 수정을 해야하거나 삭제를 해야하거나 하는 등의 필요가 자연적으로 발생할 것이다.
가령, 불러온(혹은 생성한) 객체에 메소드를 하나 추가해야하는 상황이 발생하였을 때 이것을 처리하는 방법이 바로 상속(inheritance)가 되는 것이다.
이 때 상속을 하게 되면 본인을 기준으로 수정하고자 하는 원본 객체는 부모객체(Parent Object)가 되고, 부모 객체의 것을 상속(inheritance)받아서 수정하여 만들고자 하는 객체를 자식객체(Child Object)라고 일컫는다.
상기와 같이 그저 모든 내용을 그대로 물려받은(상속) 객체는 부모객체의 복제판에 불과하지만, 이 때 자식객체에다가 본인이 필요한 메소드 혹은 다른 것들을 추가하게 된다면, 부모객체의 기능은 그대로 유지되면서, 수정되거나 추가된 기능을 사용할 수 있는 새로운 객체를 생성하여 활용할 수 있게 되는 것이다.
상속의 기본적인 예제는 PHP에서 제공하는 기본 라이브러리인 SPL에서 찾아볼 수 있는데, SPL 에서 파일을 제어할 수 있는 기능을 가진 객체들을 보면 된다.
FILE HANDLING 이라는 카테고리에 SplFileInfo, SplFileObject, SplTempFileObject가 존재한다. FILE HANDLING ㅇ에서, SplFileInfo가 가장 상위, 그리고 그것을 상속받아 새로운 메소드(기능)가 추가된 객체가 SplFileObject, 그리고 SplFileObject를 상속받아 새로운 메소드(기능)을 추가한 것이 바로 SplTempFileObject이다.
다음은 상속과 관련된 예제이다.
<?php
# Animal 클래스 생성
class Animal {
# Animal 클래스는 달리는 기능을 갖고있음.
function run() {
print(running....);
}
# Aniaml 클래스는 먹는 기능을 갖고있음.
function eat() {
print (eating....);
}
}
# Human 클래스를 생성
# Human은 Animal이 하는 기능을 다 할줄 알고 새롭게 생각과 말도할 수 있다.
# 그럴때 Animal안에 함수를 그대로 복사해서 붙여넣어도 상관 없지만,
# 원래 구현된 기능을 굳이 가져다가 반복한다면 효율성이 떨어지게된다.
# 따라서 상속(inheritance)를 시키면 되는데 다음과 같다.
class Human extends Animal {
# Human 클래스는 Animal 클래스를 extends(확장(상속))하였음
# Human 클래스는 생각할 수 있는 기능이 있음
function think() {
print(thinking....);
}
# Human 클래스는 말할 수 있는 기능이 있음
function talk() {
print(talking....);
}
}
# sam 이라는 변수에 Human클래스를 이용하여 객체를 생성하고 할당함
$sam = new Human();
$sam->run(); #running....
$sam->think(); #thinking...
# 위와같이 Human클래스에는 달리는 기능은 없지만 부모클래스(Parent class)를 상속받은 클래스이기 때문에
# 부모클래스에 존재하는 run 메소드를 그대로 받아와서 실행하는것이 가능하다
# 이것이 바로 상속의 기본이다.
# 클래스 멤버 생성(Static)
클래스 멤버란, 인스턴스에 소속된 속성(변수)과 메소드를 의미한다. 본 장에서는 클래스의 멤버를 생성하는 법에 대하여 학습하였다.
멤버란, 클래스 내부에 있는 변수와 함수들을 통칭하는 것이다. 만일, Person이라는 클래스가 있고, 이 클래스로 여러가지 객체를 생성하였는데, 각각의 객체들이 공유하는 값을 만들고자 한다면 Static이라는 것을 사용하면 된다.
상황과 예제는 다음과 같다.
<?php
class Human {
private $name;
function __construct($name) {
$this -> name = $name
}
function enter() {
echo $this->name." entered this room ";
}
}
####
$person1 = new Human('bob');
$person1->enter(); # bob entered this room.
$person2 = new Human('sam');
$person2->enter(); # sam entered this room.
$person2 = new Human('tom');
$person2->enter(); # tom entered this room.
상기와 같은 상황일 때 각각의 객체는 독립적으로 name이라는 변수를 갖게된다. 따라서 개별 객체는 각각의 객체의 name값에 간섭을 받지 못하는 상황이된 것이다.
이러한 상황일 때, 객체 bob, sam, tom 이 각각 몇번째로 입장했는지 알려면 어떻게 해야하는가?
이 때는 객체들간 간섭을 할 수 있는 변수와 메소드를 생성해서 부여하면 해결될 것이다. 이 때 사용하는 것이 static이다. 반대되는 개념인 dynamic은 name처럼 동적으로 생성/선언되는 변수와 메소드(각각의 객체에 영향을 끼치지 못함)이고, static은 같은 클래스에서 나온 개개의 객체에게 영향을 미칠 수 있도록 기능을 부여하는 것이다.
예제는 다음과 같다.
<?php
class Human {
# 몇 번째 입장인지 확인하기 위하여 수를 세는 변수를 선언
# static을 사용하면 해당 변수는 각각의 인스턴스(객체)의 소속이 아니라
# 그것을 만드는 설계도인 Class의 소속 변수가 되어 값을 공유하게 된다.
private static $count = 0;
private $name;
function __construct($name) {
$this -> name = $name
# this는 인스턴스에서 자기자신을 뜻하는 의미였고 ( this(이 인스턴스에서 name은...) )
self :: $count = self::$count+1;
# self는 클래스에 소속된 변수를 호출할 때 사용한다.
# 클래스에 소속된 $count변수(self:: $count)에,
# 1을 더해준다. (self::$count+1)
# 생성자(construct)는 객체가 생성이 될 때 마다 한번씩 실행되어 객체를 생성하기 때문에
# 본 클래스를 이용하여 객체를 생성할 때마다 클래스에 소속되어있는 count변수는
# 1이 누적되어 더해진 값을 갖고있게된다.
}
function enter() {
echo $this->name." entered this room "."this is ".self::$count."th entered people";
# 각각의 메소드에도 이와같이 self로 값을 호출할 수 있다.
}
# 변수와 마찬가지로 메소드 역시 static을 붙이게되면
# 클래스의 소속된 메소드가 된다.
# 따라서 self::변수 값을 리턴할 수 있게 된다.
static function getCount() {
return self::$count;
}
}
####
$person1 = new Human('bob');
$person1->enter(); # bob entered this room. this is 1th entered people.
$person2 = new Human('sam');
$person2->enter(); # sam entered this room. this is 2th entered people.
$person2 = new Human('tom');
$person2->enter(); # tom entered this room. this is 3th entered people.
'Language > PHP' 카테고리의 다른 글
공부 내용 정리 PHP :: 초급 VI (0) | 2021.06.02 |
---|---|
공부 내용 정리 PHP :: 초급 IV (0) | 2021.06.01 |
공부 내용 정리 PHP :: 초급 III (0) | 2021.06.01 |
공부 내용 정리 PHP :: 초급 II (0) | 2021.05.31 |
공부 내용 정리 PHP :: 초급 I (0) | 2021.05.26 |