조상 클래스로부터 상속받은 메서드 내용을 상속받는 클래스에 맞게 변경하는 것을 말한다.
*override : ~위에 덮어쓰다, ~에 우선하다
🖥 코드 작성
class Point {
int x;
int y;
String getLocation(){
return "x :" + x + ", y:"+ y;
}
}
class Point3D extends Point{
int z;
String getLocation(){ //오버라이딩
return "x :" + x + ", y:"+ y +", z:" + z;
}
}
Point3D 클래스는 z축의 좌표값도 필요하기 때문에 포함하여 반환하도록 오버라이딩 하였다.
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
2. 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
👉 만일 조상 클래스에 정의된 메서드의 접근제어자가 protected라면 오버라이딩 하는 자손 클래스의 메서드는 protected,public 이어야 한다. (public > protected > (default) > private )
3. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
class Parent{
void parentMethod() throws IOException,SQLException{
...
}
}
class Child extends Parent{
void parentMethod() throws IOException{
...
}
...
}
👉 Child 클래스에 parentMethod()에 선언된 예외의 개수가 조상 클래스의 parentMethod()에 선언된 예외의 개수보다 적으므로 바르게 오버라이딩 되었다.
자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있는 것을 말한다
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
👉 리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
- 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change,modify)
🖥 코드 작성
class Parent{
void parentMethod(){}
}
class Child extends Parent{
void parentMethod(){} //오버라이딩
void parentMethod(int i){} //오버로딩
void childMethod(){}
void childMethod(int i){} //오버로딩
void childMethod(){} //에러 : 중복정의
}
출처: 자바의 정석(도서,유튜브)