[java] 클래스와 객체의 다형성에 대해 설명해주세요.

클래스와 객체의 다형성(Polymorphism)이란 무엇인가요?

다형성은 객체지향 프로그래밍에서 매우 중요한 개념입니다. 클래스와 객체의 다형성은 같은 타입이지만 서로 다른 동작을 수행할 수 있는 능력을 의미합니다. 이는 코드의 재사용성과 유연성을 높이는데 도움을 줍니다.

클래스와 객체의 차이점

클래스는 설계도이며, 객체는 클래스를 기반으로 메모리에 생성된 실체입니다. 객체는 클래스의 인스턴스라고도 할 수 있습니다. 하나의 클래스로 여러 개의 객체를 생성할 수 있으며, 객체마다 고유한 상태(필드)와 동작(메서드)을 가지고 있습니다.

다형성의 종류

  1. 오버로딩(Overloading): 같은 이름의 메서드를 여러 개 정의하고, 매개변수의 개수나 타입을 다르게 함으로써 다양한 형태로 호출할 수 있는 기능입니다. 컴파일러는 메서드를 호출할 때 전달되는 인자의 타입과 개수에 맞는 메서드를 선택합니다.

  2. 오버라이딩(Overriding): 상속 관계에 있는 클래스에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것을 의미합니다. 이를 통해 부모 클래스의 동작을 자식 클래스에서 변경하거나 확장할 수 있습니다. 동일한 메서드 이름과 인자를 가지고 있지만, 자식 객체에서 호출될 때는 자식 클래스의 메서드가 실행됩니다.

다형성의 장점

  1. 코드의 재사용: 다형성을 사용하면 공통된 코드를 재사용할 수 있습니다. 각 클래스의 차이를 추상화하여 유사한 동작을 수행하는 객체를 일관된 방식으로 처리할 수 있습니다.

  2. 유연성: 다형성은 코드의 유연성을 높여줍니다. 객체의 타입을 알 필요 없이 동일한 방식으로 다양한 타입의 객체를 다룰 수 있습니다. 이는 프로그램의 확장성과 유지보수성을 향상시킵니다.

다형성의 예시

class Animal {
    public void sound() {
        System.out.println("동물 소리");
    }
}

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

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        
        animal1.sound(); // 멍멍
        animal2.sound(); // 야옹
    }
}

위의 예시에서 Animal 클래스는 추상적인 동물을 나타내는 클래스입니다. DogCat 클래스는 각각 개와 고양이를 나타내며, sound 메서드를 오버라이딩하여 개와 고양이의 울음소리를 출력합니다. PolymorphismExample 클래스에서 Animal 객체는 다양한 동물 객체를 참조할 수 있습니다. 이를 통해 동물 객체의 다형성을 구현하고 재사용성과 유연성을 높일 수 있습니다.

참고 자료