Skip to content

PHP

polymorphism = method overriding => abstract(추상화)와 관련있음

Author
siwon
Date
2023-08-16 17:30
Views
1155

다형성(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`와 같은 연산이 커스텀한 방식으로 동작하게 됩니다.

Total 0

Total 45
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
자식 class가 부모와 같은 method를 가질경우 자식 class의 메소드가 우선한다는 원칙
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
private, protected등 access modifier를 사용하여 property나 method의 접근을 제한 하는 oop 원칙
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