java 오버로딩과 오버라이딩의 차이에 대해 이해한다.
Goal
- 오버로딩(Overloading)에 대해 이해할 수 있다.
- 오버라이딩(Overriding)에 대해 이해할 수 있다.
오버로딩(Overloading)
오버로딩이란
두 메서드가 같은 이름을 갖고 있으나 인자의 수나 자료형이 다른 경우를 말한다.
오버로딩 예시
public double computeArea(Circle c) { ... }
public double computeArea(Circle c1, Circle c2) { ... }
public double computeArea(Square c) { ... }
오버라이딩(Overriding)
오버라이딩이란
상위 클래스의 메서드와 이름과 용례(signature)가 같은 함수를 하위 클래스에 재정의하는 것을 말한다.
- 즉, 상속 관계에 있는 클래스 간에 같은 이름의 메서드를 정의하는 것을 말한다.
오버라이딩 예시
public abstract class Shape {
public void printMe() { System.out.println("Shape"); }
public abstract double computeArea();
}
public class Circle extends Shape {
private double rad = 5;
@Override // 개발자의 실수를 방지하기 위해 @Override(annotation) 쓰는 것을 권장
public void printMe() { System.out.println("Circle"); }
public double computeArea() { return rad * rad * 3.15; }
}
public class Ambiguous extends Shape {
private double area = 10;
public double computeArea() { return area; }
}
public class Main {
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());
}
}
}
출력 결과
Circle
78.75
Shape
10
- Circle에서 printMe() 메서드를 재정의한다.
- 오버라이딩을 할 때 개발자의 실수를 방지하기 위해 메서드 위에 @Override 를 관례적으로 적는다.