1. 코드 유연성 극대화, 객체지향 모델의 다형성의 개념/특징
(1) 다형성 (Polymorphism)의 개념
| 개념도 | 개념 |
|---|---|
| 같은 메시지(메서드 호출)에 대해 객체의 타입에 따라 다른 동작을 수행하는 객체지향 모델의 특성 |
(2) 다형성의 특징
| 동적바인딩 | – 프로그램이 실행되는 시점에 호출할 번지나 함수 연결 |
| 확장성 지원 | – 수평적 확장성인 Overloading과 수직적 확장성인 Overriding 지원 |
| 재사용성 지원 | – 기존에 구현된 부분은 동일하게 사용하고 필요한 부분만 수정하여 활용 가능 |
- 다형성은 오버로딩(Overloading)과 오버라이딩(Overriding)을 통해 재사용성 및 수평/수직적 확장성 향상
2. 다형성의 유형, 오버로딩과 오버라이딩
(1) 오버로딩(Overloading, 중첩)의 개념/사례
- 클래스(객체) 내부에서 반환 값이 같은 동일 이름의 메서드를 파라미터의 개수와 각 파라미터의 타입을 다르게 하여 정의하는 기법
- 오버로딩의 코드 사례
class Calculator {
// ① int형 2개 더하기
int add(int a, int b) {
return a + b;
}
// ② 중첩: int형 3개 더하기
int add(int a, int b, int c) {
return a + b + c;
}
// ③ 중첩: double형 2개 더하기
double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(5, 10)); // ① 메서드 호출
System.out.println(calc.add(5, 10, 15)); // ② 메서드 호출
System.out.println(calc.add(5.5, 10.5)); // ③ 메서드 호출
}
}
- 오버로딩은 같은 클래스 내에서 적용되고, 컴파일 하는 시간에 결정되는 정적 바인딩 적용
(2) 오버라이딩(Overriding, 재정의)의 개념/사례
- 상속 관계의 클래스에서 상위 클래스의 메서드를 하위 클래스에서 재정의하여 객체에 따라 같은 이름의 다른 기능을 정의하는 기법
- 오버라이딩 코드 사례
class Animal {
void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("The dog says: Bark!");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("The cat says: Meow!");
}
}
public class Main {
public static void main(String[] args) {
// Animal Class를 참조하지만 객체는 자식 클래스
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // Dog Class의 makeSound 메서드 호출
myCat.makeSound(); // Cat Class의 makeSound 메서드 호출
}
}
- 어노테이션 @Override 는 명시적으로 사용할 수 있으나, 컴파일러가 체크하기 때문에 생략 가능
- 오버로딩과 오버라이딩은 다형성을 제공하기 위한 기법으로 활용되나 목적과 방법에서 차이 존재
3. 다형성 유형인 오버로딩과 오버라이딩 비교
| 구분 | 오버로딩(Overloading) | 오버라이딩(Overriding) |
|---|---|---|
| 개념 | 같은 이름의 Method 여러 개 사용 | 상위 클래스의 Method 재정의 |
| 사용 방법 | 동일 Class 내 메서드 중첩 | 하위 Class에서 메서드 재정의 |
| 메서드 이름 | 동일 | 동일 |
| 매개변수 | 개수가 동일한 경우, 타입 상이 | 동일 |
| 리턴 타입 | 무관 | 동일 |
| 어노테이션 | 미사용 | @Overriding |
| 확장성 | 수평적 확장 | 수직적 확장 |
- 다형성을 통해 단일 인터페이스를 통한 기능의 확장이 편리해지며, 메소드의 규격화가 가능해지므로 캡슐화와 연결되어 다양한 역할과 기능 수행
- 오버로딩, 오버라이딩 외 캐스팅을 통해 상속받은 객체의 형변환 수행도 가능
[참고]
- 리프레임, 최은만, 객체지향 설계와 패턴 워크북, 2024.2