상위 클래스에서 상속받은 메서드를 하위 클래스에서 재 정의 하는 것을 말한다.
오버라이딩은 부모 클래스의 메서드를 재 정의하는 것으로 자식 클래스에서는 오버라이딩하고자 하는 메서드의 이름, 매개변수 타입, 매개변수 개수, 리턴 값 이 모두 같아야 한다.
예시
public class A {
public String run() {
System.out.println("뛴다");
}
}
public class B extend A {
@Override
public String run() {
System.out.println("숨이 차게 뛴다");
}
}
실제 코드로는 이런식으로 사용 가능하다.
위 코드는 spring security로 보안을 설계할 때 사용하는 코드 중 일부이다.
CustomUsernamePasswordAuthenticationFilter 가 UsernamePasswordAuthenticationFilter 를 상속 받았다.
@Override 애너테이션을 붙여서 attemptAuthentication 메서드의 내부는 재정의하고 파라미터 타입, 개수, 리턴 값 모두 같은 것을 알 수 있다.
오버로딩은 이름이 같은 메서드를 변경하여 재정의하는 것을 말한다.
같은 클래스 내에 있어야하며 이름
이 같아야하고, 파라미터 타입, 파라미터 개수가 달라야한다.
하지만 리턴 값
만 다른 것은 허용되지 않는다.
예시
class A {
public void study() {
System.out.println("공부를 합니다.");
}
int study(int num) {
System.out.println("오늘 공부한 시간은?");
return num;
}
boolean study(boolean status) {
System.out.println("오늘 공부를 했나요?");
return status;
}
void study(String name) {
System.out.println("오늘 공부한 과목은? " + name);
}
}
만약 오버로딩을 사용하지 않고 메서드를 작성한다면 같은 행동임에도 불구하고 여러가지 메서드를 정의해줘야 할 것이다.
class A {
public void study() {
System.out.println("공부를 합니다.");
}
public int studyTime(int num) {
System.out.println("오늘 공부한 시간은?");
}
public boolean studyYN(boolean status) {
System.out.println("오늘 공부를 했나요?");
}
이런식으로 말이다.
위 코드처럼 복잡하게 메서드를 정의하는 것 보다 오버로딩을 사용함으로써 코드가 깔끔해지는 효과가 있기 때문에 오버로딩을 사용한다.
참고 : https://hyoje420.tistory.com/14
공식문서 : https://docs.oracle.com/javase/8/docs/api/