Overloading vs Overriding


Overrloading 은 두 메서드가 같은 이름을 갖고 있으나, 인자의 수나 자료형이 다른 경우를 지칭한다.

public double computeArea(Circle c) { ... }
public double computeArea(Square s) { ... }

Overriding 은 상위 클래스의 메서드와 이름과 용례(signature)가 같은 함수를 하위 클래스에 재정의하는 것을 의미한다.

public abstract class Shape {
  public void printMe() {
    System.out.println("I am a shape.");
  }
  public abstract double computeArea();
}

public class Circle extends Shape {
  private double radious = 5;
  public void printMe() {
    System.out.println("I am a circle.");
  }

  public double computeArea() {
    return radious * radious * 3.15;
  }
}

public class Ambiguous extends Shape {
  private double area = 10;
  public double computeArea() {
    return area;
  }
}

public class IntroductionOverriding {
  public static void main (String[] args) {
    Shape[] shapes = new Shape[2];
    Circle circle = new Circle();
    Ambiguous ambiguous = new Ambiguous();

    shapes[0] = circle;
    shapes[1] = ambiguous;

    for (Shape s : shapes) {
      s.printMe();
      System.out.println(s.computeArea());
    }
  }
}

위 코드를 실행한 출력 결과는 다음과 같다.

I am a circle.  // Ambiguous는 printMe 메소드를 재정의(Overriding)
78.75
I am a shape.   // Ambiguous는 printMe 메소드를 그대로 둠
10.0