Software/Java

[Java] 폴리모피즘(Polymorphism) 이해하기

TGnCo 2025. 1. 23. 11:21

Java

 

 

 

자바의 폴리모피즘(Polymorphism) 이해하기

 

자바는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)을 지원하는 언어로, 객체 지향의 주요 특징 중 하나인 폴리모피즘(Polymorphism)을 잘 활용할 수 있는 기능을 제공합니다. 폴리모피즘(Polymorphism)은 "다형성"이라고도 불리며, 그 의미는 "하나의 인터페이스가 여러 형태를 가질 수 있다"입니다. 간단히 말해, 같은 메시지(메서드 호출)가 다양한 방식으로 처리될 수 있다는 것입니다.


 

폴리모피즘(Polymorphism)의 주요 개념

  • 오버라이딩(Overriding)
    부모 클래스에 정의된 메서드를 자식 클래스에서 재정의(override)하여, 자식 클래스가 부모 클래스의 메서드를 대체할 수 있게 만드는 기능입니다. 오버라이딩을 통해 자식 클래스는 부모 클래스의 메서드를 수정하여, 자신만의 방식으로 동작을 정의할 수 있습니다.
  • 오버로딩(Overloading)
    같은 이름의 메서드를 여러 개 정의하되, 매개변수의 타입이나 개수, 순서가 다르게 만들어 다양한 방식으로 호출할 수 있게 합니다. 오버로딩은 하나의 메서드 이름을 여러 방식으로 활용할 수 있도록 도와줍니다.

 

폴리모피즘(Polymorphism)의 예시

 

자, 이제 코드로 폴리모피즘(Polymorphism)을 어떻게 활용하는지 살펴보겠습니다.

 

1. 오버라이딩(Overriding) 예시

    // 부모 클래스
    class Animal {
        public void sound() {
            System.out.println("동물이 소리를 냅니다.");
        }
    }

    // 자식 클래스
    class Dog extends Animal {
        @Override
        public void sound() {
            System.out.println("멍멍!");
        }
    }

    public class Main {
        public static void main(String[] args) {
            Animal myDog = new Dog();  // Animal 타입으로 Dog 객체 생성
            myDog.sound();  // Dog 클래스의 sound() 메서드 호출
        }
    }

위의 예시에서, Dog 클래스는 Animal 클래스를 상속받고, sound() 메서드를 오버라이딩하여 자신만의 방식으로 소리를 냅니다. Animal 타입의 참조 변수로 Dog 객체를 생성했지만, 실행 시 Dog 클래스의 sound() 메서드가 호출되는 것이 폴리모피즘(Polymorphism)의 핵심입니다.

 

2. 오버로딩(Overloading) 예시

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public String add(String a, String b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        
        System.out.println(calc.add(5, 10));      // int형 덧셈
        System.out.println(calc.add(3.5, 7.2));   // double형 덧셈
        System.out.println(calc.add("Hello", " World"));  // String형 덧셈
    }
}

위의 예시에서 Calculator 클래스는 add라는 동일한 이름의 메서드를 오버로딩하여, 정수, 실수, 문자열 덧셈을 처리할 수 있습니다. 이처럼 매개변수의 타입에 따라 다르게 동작하는 메서드를 정의할 수 있는 것이 오버로딩의 특징입니다.


폴리모피즘(Polymorphism)의 장점

  • 코드의 유연성 증가
    하나의 인터페이스(메서드)를 통해 다양한 형태의 동작을 정의할 수 있으므로, 코드의 유연성과 확장성이 증가합니다. 새로 클래스를 추가하거나 기능을 확장할 때 기존 코드를 수정할 필요가 없습니다.
  • 코드 재사용성 증가
    상속을 통해 부모 클래스의 코드를 재사용하면서, 자식 클래스에서 필요한 부분만 수정할 수 있어 중복 코드를 줄일 수 있습니다.
  • 유지보수 용이
    각 클래스의 책임이 명확해지기 때문에 유지보수가 쉬워집니다. 변경 사항이 있을 때, 특정 메서드만 수정하면 되므로 다른 부분에 미치는 영향을 최소화할 수 있습니다.

폴리모피즘(Polymorphism) 활용법

  • 인터페이스 활용: 인터페이스를 사용하면 다양한 클래스들이 동일한 메서드를 구현하게 되어, 코드가 일관되게 처리됩니다.
  • 상속 활용: 부모 클래스에서 공통적인 기능을 정의하고, 자식 클래스에서 이를 확장하거나 재정의하여 다형성을 실현합니다.
  • 컬렉션 프레임워크 활용: 자바의 컬렉션 프레임워크(List, Set, Map 등)에서 객체의 다형성을 활용하여 다양한 자료형을 처리할 수 있습니다.

결론

 

폴리모피즘(Polymorphism)은 자바에서 객체 지향 프로그래밍의 핵심 원칙 중 하나로, 코드의 재사용성과 유지보수성을 크게 향상시킵니다. 오버라이딩과 오버로딩을 적절히 활용하여 유연하고 확장 가능한 코드를 작성할 수 있습니다. 이를 통해 더 효율적이고 깔끔한 소프트웨어 개발이 가능해집니다.