Files
python-examples/doc/10_05_method_overriding.md
2025-01-20 02:26:20 +09:00

77 lines
4.1 KiB
Markdown

# 메소드 오버로딩(Method Overloading)과 오버라이딩(Method Overriding)
* 메소드 오버라이딩: 부모 클래스의 메소드를 자식 클래스에서 재정의하는 것을 의미합니다. 상속 관계에서 사용됩니다.
* 메소드 오버로딩: 동일한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것을 의미합니다. 메소드 오버로딩의 핵심은 매개변수의 차이입니다. 매개변수의 개수, 타입, 순서가 달라야 합니다.
## 메소드 오버로딩
메소드 오버로딩은 동일한 이름의 메소드를 여러 개 정의하여, 전달되는 매개변수의 개수나 타입에 따라 다른 동작을 수행하도록 하는 것을 의미합니다. 즉, 같은 이름의 메소드지만 매개변수의 조합이 다르면 다른 기능을 수행할 수 있도록 하는 것입니다.
* 코드 가독성 향상: 동일한 작업을 수행하는 메소드라도 입력값에 따라 다른 방식으로 처리해야 할 때, 메소드 오버로딩을 사용하면 코드가 더 직관적이고 이해하기 쉽습니다.
* 유연성 증가: 다양한 입력값에 대해 동일한 메소드 이름을 사용하여 코드를 간결하게 작성할 수 있습니다.
* 코드 재사용: 기존 메소드를 확장하여 새로운 기능을 추가할 수 있습니다.
* 같은 이름: 오버로딩되는 메소드는 반드시 같은 이름을 가져야 합니다.
* 다른 매개변수: 매개변수의 개수, 타입, 순서가 달라야 합니다.
* 반환값: 반환값의 타입은 달라도 상관없습니다.
아래 예시에서 add 메소드는 매개변수의 개수와 타입에 따라 다른 동작을 수행합니다.
```python
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
```
## 메소드 오버라이딩
메소드 오버라이딩은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것을 의미합니다. 즉, 부모 클래스의 메서드와 동일한 이름을 가진 메서드를 자식 클래스에서 다시 작성하여, 자식 클래스에 맞는 기능을 수행하도록 하는 것입니다.
* 다형성 구현: 같은 메시지에 대해 서로 다른 객체가 다르게 반응하도록 만들 수 있습니다.
* 상속 관계에서 특정 기능 재정의: 부모 클래스의 기능을 유지하면서 자식 클래스에 맞게 기능을 확장하거나 변경할 수 있습니다.
* 코드 재사용: 부모 클래스에서 공통적인 기능을 구현하고, 자식 클래스에서 필요한 부분만 재정의하여 코드 재사용성을 높일 수 있습니다.
* 상속 관계: 메서드 오버라이딩은 상속 관계에서만 가능합니다.
* 같은 메서드 이름: 부모 클래스와 자식 클래스에서 메서드 이름이 같아야 합니다.
* 메서드 서명 일치: 오버라이딩하는 메서드의 매개변수 개수와 타입이 부모 클래스의 메서드와 일치해야 합니다.
* return 값: 오버라이딩된 메서드의 반환 값의 타입이 부모 클래스의 메서드와 일치하거나 호환되어야 합니다.
* 다른 기능: 메서드의 내용이 달라져야 합니다.
```python
class Animal:
def sound(self):
print("동물의 소리")
class Dog(Animal):
def sound(self):
print("멍멍")
class Cat(Animal):
def sound(self):
print("야옹")
dog = Dog()
cat = Cat()
dog.sound() # 멍멍
cat.sound() # 야옹
```
위 예시에서 Animal 클래스는 sound 메서드를 가지고 있고, Dog 클래스와 Cat 클래스는 이 메서드를 오버라이딩하여 각각 다른 소리를 내도록 구현했습니다.
## super()
자식 클래스에서 부모 클래스의 메서드를 호출하고 싶을 때 super() 함수를 사용합니다.
```python
class ChildClass(ParentClass):
def some_method(self, arg):
super().some_method(arg) # 부모 클래스의 some_method 호출
# 추가적인 작업
```