JAVA

[java] 다형성 Polymorphism

닉의네임 2025. 5. 14. 06:53
반응형

**다형성(Polymorphism)**은 객체 지향 프로그래밍(OOP)의 핵심 원칙 중 하나로, "하나의 인터페이스로 여러 가지 형태를 취할 수 있는 능력"을 의미합니다. 즉, 같은 타입의 객체라도 그 구현이 다르게 동작할 수 있게 해주는 특징입니다. 다형성은 주로 메소드 오버로딩(Method Overloading)과 메소드 오버라이딩(Method Overriding)을 통해 구현됩니다.

 

 

다형성의 종류

  1. 컴파일 시간 다형성 (정적 다형성) - 메소드 오버로딩연산자 오버로딩을 통해 구현됩니다.
  2. 런타임 다형성 (동적 다형성) - 메소드 오버라이딩을 통해 구현됩니다.

 

1. 메소드 오버로딩 (Method Overloading) - 컴파일 시간 다형성

메소드 오버로딩은 같은 이름의 메소드가 여러 가지 다른 파라미터 타입이나 개수를 받아서 동작할 수 있게 하는 것입니다. 메소드 오버로딩은 컴파일 시간에 어떤 메소드가 호출될지 결정됩니다.

예시:

class Calculator {
    // 오버로딩된 add 메소드
    public int add(int a, int b) {
        return a + b;
    }

    public 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, 3));      // int 타입, 8 출력
        System.out.println(calc.add(5.5, 3.2));  // double 타입, 8.7 출력
    }
}
  • add(int a, int b)와 add(double a, double b)는 같은 이름을 가지지만 파라미터의 타입이 다르므로 오버로딩된 메소드입니다.

2. 메소드 오버라이딩 (Method Overriding) - 런타임 다형성

메소드 오버라이딩은 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 동적으로 동작을 다르게 만드는 것입니다. 오버라이딩은 런타임에 어떤 메소드가 호출될지 결정됩니다.

예시:

class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Cat meows");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        animal1.makeSound();  // "Dog barks"
        animal2.makeSound();  // "Cat meows"
    }
}
  • Dog와 Cat 클래스는 Animal 클래스의 makeSound() 메소드를 오버라이딩하여 각각 다른 동작을 수행합니다.
  • Animal 타입의 변수에 Dog 또는 Cat 객체를 할당하고, 실제로 호출되는 메소드는 객체의 실제 타입에 따라 다르게 결정됩니다. 이처럼 메소드 호출 시 어떤 메소드가 호출될지 런타임에 결정되므로 런타임 다형성이라고 합니다.

다형성의 장점

  1. 유연성 증가: 다형성 덕분에 같은 코드로 다양한 형태의 객체를 처리할 수 있습니다. 예를 들어, Animal 타입의 변수로 Dog나 Cat 객체를 처리할 수 있습니다.
  2. 코드 재사용성 증가: 같은 메소드 이름을 사용하여 다양한 기능을 구현할 수 있어 코드의 중복을 줄이고, 재사용할 수 있습니다.
  3. 확장성: 새로운 클래스가 추가되더라도 기존 코드를 변경하지 않고도 새로운 기능을 확장할 수 있습니다. 예를 들어, 새로운 동물 클래스(Bird 등)를 추가하더라도 기존 코드는 변경할 필요 없이 동작합니다.
  4. 유지보수 용이: 다형성으로 인해 코드가 간결해지고, 추후 유지보수나 확장 시에 기존 코드와의 호환성 문제를 최소화할 수 있습니다.

결론

다형성은 동일한 인터페이스로 여러 가지 구현을 가능하게 하여 코드의 유연성확장성을 높여주는 중요한 개념입니다. 컴파일 시간 다형성과 런타임 다형성을 적절히 활용하면 더 효율적이고 유지보수가 용이한 시스템을 만들 수 있습니다.

반응형