본문 바로가기

프로그래밍/객체지향

[객체지향] 다형성이란?

반응형

다형성

생물학적으로 다형성이란 같은 종의 생물이 유전적, 환경적인 요인으로 형태와 형질에 대해 다양성을 나타난다는 뜻

여기서 객체지향 특징 중 하나인 다형성이란 어떤 객체나 메서드가 상황에 따라 여러가지 속성과 기능의 형태를 가진다는 뜻이 된다. => 하나의 무언가가 여러가지 형태 다양성을 가진다

 

하나의 객체의 참조 변수 타입이 여러 타입의 객체를 참조 가능

abstract class Shape {
  protected BigDecimal width;
  protected BigDecimal height;
}

class Triangle extends Shape {...}

class Square extends Shape {...}
Shape shape1 = new Triangle();
Shape shape2 = new Square();

하나의 참조변수 타입(Shape)이 여러타입의 객체(Triangle, Square)를 참조할 수 있다.

(이때, 여러 타입은 참조 변수 타입의 하위 클래스여야함 => 상속)

 

예시로 도형을 매개변수로 받아 너비를 구하는 메서드가 있다고 했을때,

public static BigDecimal getWidthFromShape(Shape shape) {
  return shape.getWidth();
}
Shape shape1 = new Triangle();
Shape shape2 = new Square();

getWidthFromShape(shape1);
getWidthFromShape(shape2);

매개변수로 Shape 타입을 받는 메서드이지만 하위 타입 객체들인 shape1, shape2 들을 매개변수로 넣을 수 있게 된다.

개발자는 Shape를 상속받는 다른 클래스를 작성하여 이 메서드를 사용할 수 있다.

 

같은 이름의 메서드가 다양한 역할을 수행 (오버라이딩)

메서드 오버라이딩을 통해 같은 형태의 메서드가 다른 역할을 수행하게 할 수 있다.

 

abstract class Shape {
  protected BigDecimal width;
  protected BigDecimal height;

  abstract BigDecimal getArea();
}

class Triangle extends Shape {
  @Override
  BigDecimal getArea() {
    return width.multiply(height);
  }
}

class Square extends Shape {
  @Override
  BigDecimal getArea() {
    BigDecimal half = BigDecimal.valueOf(0.5);
    return width.multiply(height).multiply(half);
  }
}

Shape 클래스의 넓이를 구하는 getArea 메서드를 각 하위 클래스들이 각자의 넓이를 구하는 메서드로 재정의 하였다.

도형의 넓이를 이용해 수행되는 로직이 있다고 했을 때,

public void shapeLogic(Shape shape) {
  BigDecimal area = shape.getArea();
  ...
}

해당 메서드에서 shape 객체의 타입에 따라 사각형 넓이, 삼각형 넓이를 구하는 메서드를 실행

 

다형성의 목적은 하나의 타입에 여러 객체 타입을 참조할 수 있다는 점, 즉 위의 메서드처럼 직접적인 참조가 아닌 상위 클래스를 참조하여 클래스 끼리의 결합성을 낮춤으로써 유연하게 프로그래밍 할 수 있다는 점이다.

반응형