오버로딩은 두 메서드가 같은 이름을 갖고 있으나 인자의 수나 자료형이 다른 경우를 지칭한다
public double computeArea(Circle c){..}
public double computeArea(Square c){..}
오버라이딩은 상위 클래스의 메서드와 이름과 용례(signature)가 같은 함수를 하위 클래스에 재정의하는 것을 말한다.
public abstract class Shape {
public void printMe(){
System.out.println("ImS");
}
public abstract double computeArea();
}
public class Circle extends Shape {
private double rad = 5;
public void printMe(){
System.out.println("ImC");
}
public abstract double computeArea(){
return rad*rad*3.15;
}
.
.
.
public class Intro{
public static void main(String[] args){
Shape[] shapes = new Shape[2];
Circle circle = new Circle();
Ambiguous ab = new Ambiguous();
shapes[0] = circle;
shapes[1] = ab;
for(Shape s : shapes){
s.printMe();
System.out.println(s.computeArea());
}
}
}
}
```java
Im C
78.75
Im S
10.0
오버로딩의 정의는 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
오버로딩을 사용하는 이유
1. 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.
println라는 메소드를 대표적인 예로 들어볼 수 있다. 우리는 println의 인자 값으로 int, double, boolean, String 등의 아주 다양한 타입의 매개변수들을 집어넣어도 우리는 그 함수들이 어떻게 실행되지는 모르지만 콘솔창에 아주 잘 출력해주는 것을 볼 수 있다.
매개변수의 타입은 달라도 기능은 같은 함수들을 하나로 사용하는 것이다.
이 위에서 예로 들었던 println을 생각해보자. 이 메소드를 매개변수의 종류에 따라서 다르게 지정한다고 생각해보자. printlnInt, printlnDouble, printlnBoolean 등 수많은 메소드들의 이름을 정해줘야 할 것이다. 이는 프로그래머의 입장에서는 메소드의 네이밍에 고민을 가중시킨다. 그리고 이런 이름들은 다른 곳에 사용할 가능성도 생기게 된다.
오버라이딩(Overriding)
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩이라고 한다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생긴다.
오버라이딩은 부모 클래스의 메소드를 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다. (즉, 선언부의 형태는 같아야 한다)
@Override
여기서 어노테이션은 오버라이딩을 검증하는 기능을 한다. 코드상으로 검사했을 때 오버라이딩이 실제로 시행되지 않았다면 컴파일시 오류를 출력한다.
프로그래머가 Person클래스의 cry메소드를 '흑흑'이라고 정의했다. 그런데 Child클래스와 Senior클래스를 만들면서 울음소리를 다르게 출력하고 싶은 것이다. 그래서 Chile클래스와 Senior클래스에서 부모의 메소드의 이름만 빌려와서 자기의 방식대로 '재정의'하였다. 이것이 오버라이딩이다.
예를 들어 부모클래스의 접근제어자는 default로 설정되어 있다면 자식 클래스들은 default보다 같거나 더 넓은 범위의 접근제어자만 설정할 수 있으므로 default, protected, public 이 세 개의 접근 제어자는 사용이 가능하다.
부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.
부모 클래스의 static메소드를 자식에서 같은 이름으로 정의할 수 있지만 이것은 다시 정의하는 것이 아니라 같은 이름의 static메소드를 새로 정의하는 것이다.
출처
책 : 코딩 인터뷰 완전분석
https://hyoje420.tistory.com/14