polymorphism = method overriding => abstract(추상화)와 관련있음
다형성(Polymorphism)은 객체지향 프로그래밍(OOP)에서 중요한 개념 중 하나로, 서로 다른 클래스가 동일한 인터페이스를 사용하여 공통된 동작을 수행할 수 있는 능력을 의미합니다. 이로 인해 코드의 유연성과 재사용성이 향상되며, 클래스 간의 관계를 더 추상적으로 다룰 수 있게 됩니다.
다형성을 통해 여러 다른 클래스의 객체를 동일한 방식으로 다룰 수 있습니다. 이를 통해 코드의 일부를 더 일반화하여, 코드 중복을 줄이고 확장성을 높일 수 있습니다.
다형성은 크게 두 가지 주요 형태로 나눌 수 있습니다:
1. **정적 다형성(Static Polymorphism):**
- 함수 오버로딩(function overloading)이나 연산자 오버로딩(operator overloading)과 관련이 있습니다.
- 같은 이름의 함수나 연산자를 다른 매개변수나 피연산자에 대해 사용할 수 있도록 하는 기능입니다.
- 언어에 따라 지원 정도가 다를 수 있습니다.
2. **동적 다형성(Dynamic Polymorphism):**
- 상속과 인터페이스를 기반으로한 다형성으로, 주로 메서드 오버라이딩(method overriding)을 의미합니다.
- 부모 클래스와 그를 상속하는 하위 클래스에서 동일한 메서드를 사용하여, 각 클래스의 특성에 맞게 재정의할 수 있습니다.
- 다양한 객체를 동일한 메서드로 호출할 수 있어 코드의 일관성을 유지하면서 유연한 동작을 구현할 수 있습니다.
다형성을 보다 명확하게 이해하기 위해 예시를 살펴보겠습니다:
```php
class Shape {
public function calculateArea() {
return 0; // 기본적으로 넓이를 0으로 반환
}
}
class Circle extends Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function calculateArea() {
return 3.14 * $this->radius * $this->radius;
}
}
class Square extends Shape {
private $side;
public function __construct($side) {
$this->side = $side;
}
public function calculateArea() {
return $this->side * $this->side;
}
}
$shapes = [new Circle(5), new Square(4)];
foreach ($shapes as $shape) {
echo "Area: " . $shape->calculateArea() . "
";
}
```
이 예제에서 `Shape` 클래스는 도형의 기본 클래스이며, `Circle`과 `Square` 클래스는 이를 상속합니다. 각 클래스는 `calculateArea` 메서드를 재정의하여 해당 도형의 넓이를 계산하도록 구현했습니다. 이로 인해 `Shape` 타입의 배열을 사용하면, 다양한 도형 객체를 모두 동일한 방식으로 다룰 수 있습니다. 이것이 다형성의 한 예시입니다.
함수 오버로딩(Function Overloading)과 연산자 오버로딩(Operator Overloading)은 다형성의 일부로 사용되는 개념입니다. 이 두 가지 개념은 서로 다른 매개변수나 피연산자에 대해 동일한 함수 또는 연산자를 다르게 동작하도록 구현하는 것을 의미합니다. 다만, 이에 관한 지원은 언어마다 다를 수 있습니다.
1. **함수 오버로딩 (Function Overloading):**
- 하나의 함수 이름을 가지고 다양한 매개변수를 받아 처리할 수 있도록 하는 개념입니다.
- 동일한 함수 이름을 사용하여 여러 버전의 함수를 정의할 수 있으며, 호출 시 전달된 인자에 따라 적절한 함수가 선택되어 실행됩니다.
- 몇몇 프로그래밍 언어에서는 함수 오버로딩을 지원하지만, PHP에서는 함수 오버로딩을 기본적으로 지원하지 않습니다.
2. **연산자 오버로딩 (Operator Overloading):**
- 클래스에 정의된 연산자의 동작을 클래스 객체에 대해 사용할 때 다르게 정의할 수 있는 개념입니다.
- 연산자 오버로딩을 통해 사용자 정의 객체에 기존 연산자를 사용하여 원하는 동작을 구현할 수 있습니다.
- PHP에서는 연산자 오버로딩을 지원하지 않습니다.
다른 몇몇 언어에서는 함수 오버로딩과 연산자 오버로딩을 지원하며, 이를 통해 코드를 보다 간결하고 읽기 쉽게 만들 수 있습니다. 그러나 언어마다 지원 정도와 사용 방법이 다르므로 주의가 필요합니다.
예를 들어, Python에서는 연산자 오버로딩을 지원하며, 사용자 정의 클래스에서 특정 연산자의 동작을 재정의할 수 있습니다:
```python
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __add__(self, other):
return ComplexNumber(self.real + other.real, self.imag + other.imag)
def __str__(self):
return f"{self.real} + {self.imag}i"
c1 = ComplexNumber(2, 3)
c2 = ComplexNumber(4, 5)
c3 = c1 + c2 # '+' 연산자를 사용하여 ComplexNumber 클래스에서 정의한 동작을 수행
print(c3) # 출력: 6 + 8i
```
위 예제에서 `ComplexNumber` 클래스는 `__add__` 메서드를 오버로딩하여 `+` 연산자를 사용하여 두 복소수를 더하는 동작을 재정의하였습니다. 이로써 `c1 + c2`와 같은 연산이 커스텀한 방식으로 동작하게 됩니다.
| 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 1155
|
siwon | 2023.08.16 | 0 | 1155 |
|
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 |