composition vs inheritance
Composition(합성)과 Inheritance(상속)은 객체지향 프로그래밍(OOP)에서 두 가지 서로 다른 클래스 간의 관계를 설명하는 개념입니다. 각각의 개념은 클래스 간의 관계를 구성하는 방식이 다르며, 상황에 따라 적절한 방법을 선택해야 합니다.
**Composition (합성):**
- 합성은 클래스 간의 관계를 설명할 때, 한 클래스가 다른 클래스를 포함하는 형태를 나타냅니다.
- "has-a" 관계라고도 합니다. 예를 들어, "사람은 하나의 머리를 가지고 있다"라는 관계에서 "머리"는 "사람"의 일부분입니다.
- 복잡한 객체를 간단한 객체로 조합하거나, 더 작은 기능 단위의 클래스를 조합하여 보다 복잡한 기능을 구현할 때 사용됩니다.
- 코드 재사용성을 높이고 클래스 간의 결합도를 낮출 수 있습니다.
- 변경이 용이하며 유지 보수가 간편합니다.
**Inheritance (상속):**
- 상속은 클래스 간의 관계를 설명할 때, 부모 클래스(상위 클래스)의 특성과 동작을 자식 클래스(하위 클래스)가 물려받는 형태를 나타냅니다.
- "is-a" 관계라고도 합니다. 예를 들어, "직사각형은 도형이다"라는 관계에서 "직사각형"은 "도형"이며, "도형"의 특성과 동작을 상속합니다.
- 코드 중복을 줄이고, 공통된 기능을 부모 클래스에서 정의하여 하위 클래스에서 확장하거나 수정할 수 있습니다.
- 상속 체인이 복잡해질 수 있고, 변경이 상위 클래스에서 하위 클래스까지 전파될 수 있어 유의해야 합니다.
PHP를 사용한 Composition(합성)과 Inheritance(상속)의 비교를 살펴보겠습니다.
**Composition (합성) 예시:**
```php
class Engine {
public function start() {
echo "Engine started\n";
}
}
class Car {
private $engine;
public function __construct() {
$this->engine = new Engine();
}
public function start() {
echo "Car is starting\n";
$this->engine->start();
}
}
$myCar = new Car();
$myCar->start(); // 출력: "Car is starting", "Engine started"
```
**Inheritance (상속) 예시:**
```php
class Animal {
public function speak() {
// Placeholder
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
$myDog = new Dog();
$myCat = new Cat();
echo $myDog->speak(); // 출력: "Woof!"
echo $myCat->speak(); // 출력: "Meow!"
```
위 예시에서, Composition은 "Car has an Engine" 관계를 나타내고, Inheritance는 "Dog is an Animal" 관계를 나타냅니다. 두 개념 모두 코드를 구성하는 방식과 관계를 표현하는 방식이 다르며, 선택은 문제에 맞게 결정되어야 합니다.
Composition은 객체 간의 느슨한 결합을 유지하고, 변경이 상대적으로 쉽고 코드의 재사용성이 높습니다. Inheritance는 부모 클래스의 특성을 하위 클래스에 물려주므로 코드 중복을 줄이고 공통된 동작을 정의하기에 편리하지만, 복잡한 상속 체인과 변경 전파에 주의해야 합니다.
| Number | Title | Author | Date | Votes | Views |
| 15 |
http request form method GET POST
siwon
|
2023.08.17
|
Votes 0
|
Views 1414
|
siwon | 2023.08.17 | 0 | 1414 |
| 14 |
printf()
siwon
|
2023.08.17
|
Votes 0
|
Views 1071
|
siwon | 2023.08.17 | 0 | 1071 |
| 13 |
heredoc 또는 nowdoc 구문
siwon
|
2023.08.17
|
Votes 0
|
Views 1069
|
siwon | 2023.08.17 | 0 | 1069 |
| 12 |
single vs double quotes
siwon
|
2023.08.17
|
Votes 0
|
Views 904
|
siwon | 2023.08.17 | 0 | 904 |
| 11 |
string functions
siwon
|
2023.08.17
|
Votes 0
|
Views 1050
|
siwon | 2023.08.17 | 0 | 1050 |
| 10 |
return types
siwon
|
2023.08.17
|
Votes 0
|
Views 1225
|
siwon | 2023.08.17 | 0 | 1225 |
| 9 |
date(), time() funtions
siwon
|
2023.08.17
|
Votes 0
|
Views 1187
|
siwon | 2023.08.17 | 0 | 1187 |
| 8 |
Superglobals
siwon
|
2023.08.17
|
Votes 0
|
Views 813
|
siwon | 2023.08.17 | 0 | 813 |
| 7 |
scalar types
siwon
|
2023.08.17
|
Votes 0
|
Views 916
|
siwon | 2023.08.17 | 0 | 916 |
| 6 |
constructor
siwon
|
2023.08.16
|
Votes 0
|
Views 990
|
siwon | 2023.08.16 | 0 | 990 |
| 5 |
composition vs inheritance
siwon
|
2023.08.16
|
Votes -1
|
Views 1193
|
siwon | 2023.08.16 | -1 | 1193 |
| 4 |
polymorphism = method overriding => abstract(추상화)와 관련있음
siwon
|
2023.08.16
|
Votes 0
|
Views 1154
|
siwon | 2023.08.16 | 0 | 1154 |
|
siwon
|
2023.08.29
|
Votes 0
|
Views 1209
|
siwon | 2023.08.29 | 0 | 1209 | |
| 3 |
encapsulation
siwon
|
2023.08.16
|
Votes -1
|
Views 918
|
siwon | 2023.08.16 | -1 | 918 |
|
siwon
|
2023.08.30
|
Votes 0
|
Views 1072
|
siwon | 2023.08.30 | 0 | 1072 | |
| 2 |
inheritance
siwon
|
2023.08.16
|
Votes 0
|
Views 853
|
siwon | 2023.08.16 | 0 | 853 |
| 1 |
object와 class의 차이점
siwon
|
2023.08.16
|
Votes 0
|
Views 1145
|
siwon | 2023.08.16 | 0 | 1145 |