본문 바로가기

객체지향 프로그래밍에서의 다형성의 의미

면강 2023. 4. 26.

객체지향 프로그래밍에서 다형성(Polymorphism)은 객체들이 동일한 메시지에 대해 서로 다른 방식으로 응답할 수 있는 능력을 의미합니다. 다시 말해, 다형성은 하나의 인터페이스나 추상 클래스를 여러 개의 구현 클래스가 상속받아 각자의 방식으로 구현하여 동일한 메소드를 다르게 동작시키는 기능입니다. 이러한 다형성은 코드의 재사용성과 유지보수성을 높여줄 수 있습니다.

 

예를 들어, 도형(Shape) 클래스가 있고, 이 클래스를 상속받은 삼각형(Triangle), 사각형(Rectangle), 원(Circle) 클래스가 있다고 가정해 봅시다. 도형 클래스에는 getArea() 메소드가 정의되어 있고, 각 도형 클래스에서는 이 메소드를 오버라이딩하여 해당 도형의 면적을 계산하는 방식으로 구현할 수 있습니다.

 

interface Shape {
    double getArea();
}

class Triangle implements Shape {
    private double base;
    private double height;

    public Triangle(double base, double height) {
        this.base = base;
        this.height = height;
    }

    public double getArea() {
        return 0.5 * base * height;
    }
}

class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    public double getArea() {
        return width * height;
    }
}

class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return Math.PI * radius * radius;
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Shape s1 = new Triangle(10, 20);
        Shape s2 = new Rectangle(10, 20);
        Shape s3 = new Circle(10);

        double area1 = s1.getArea();
        double area2 = s2.getArea();
        double area3 = s3.getArea();

        System.out.println("Triangle area: " + area1);
        System.out.println("Rectangle area: " + area2);
        System.out.println("Circle area: " + area3);
    }
}

 

위 코드에서 Shape 인터페이스를 구현한 Triangle, Rectangle, Circle 클래스가 있습니다. 이들 클래스는 각각 다르게 구현된 getArea() 메소드를 가지고 있습니다.

 

main() 메소드에서는 Shape 인터페이스를 구현한 객체들을 생성하여, 각 객체의 getArea() 메소드를 호출합니다. 이렇게 하면, Shape 타입의 변수 s1, s2, s3가 각기 다른 객체를 참조하면서도 동일한 메소드를 호출할 수 있습니다. 이것이 바로 다형성의 예시입니다.

 

또한, 다형성은 상속을 이용한 코드의 재사용성을 높여줍니다. 하나의 추상 클래스나 인터페이스를 정의해두면, 이를 상속받아 새로운 클래스를 만들 때 중복 코드를 최소화할 수 있습니다.

 

객체지향 프로그래밍에서 다형성은 상속, 추상화, 인터페이스 등의 개념과 함께 사용되어 유용하게 쓰입니다.