X

객체지향 모델의 다형성 (Polymorphism)

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
도리: