조상클래스로부터 상속받은 메소드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라 한다.
//override : '~위에 덮어쓰다(overwrite)'
오버로딩과 헷갈리지말자
지난 포스팅 : 메소드 오버로딩
class Point { //2차원 좌표
int x;
int y;
String getLocation() {
//2차원 좌표의 위치
return "x:"+x+",y:"+y;
}
}
class Point3D extends Point { //상속, 3차원 좌표상의 점
int z;
String getLocation() { //오버라이딩 : 조상 변경
return "x:"+x+",y:"+y+"z:"+z;
}
}
class Point {
int x;
int y;
String getLocation() { //선언부 1번
return "x:"+x+",y:"+y;
}
}
class Point3D extends Point {
int z;
String getLocation() { //선언부 2번
return "x:"+x+",y:"+y+"z:"+z;
}
}
//선언부 1번과 2번이 같다(메소드이름, 반환타입, 매개변수 목록)
접근제어자를 좁은 범위로 변경할 수 없다.
조상클래스의 메소드보다 많은 수의 예외를 선언할 수 없다.
class Parent {
void parentMethod() throws IoException, SQLException { //예외 선언, 메소드 개수 : IoException 1개, SQLException 1개 = 2개
...
}
}
class Child extends Parent {
void parentMethod() throws IoException { //예외 선언, 메소드 개수 : IoException 1개
...
}
}
=> 둘은 전혀 관계가 없지만 이름때문에 헷갈린다.
오버라이딩(Overriding) : 기존에 없던 새로운 메소드를 정의하는 것(new method)
오버로딩(Overloading) : 상속받은 메소드의 내용을 변경하는 것(change,modify method)
class Parent{
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} //조상의 메소드를 변경한 것 => 오버라이딩
void parentMethod(int i) {} // 이름이 같은 메소드를 매개변수(int i)만 다르게 해서 정의 => 오버로딩
void childMethod() {} // 그냥 메소드 정의
void childMethod(int i) {} // 오버로딩
void childMethod() {} // 중복정의 -> 에러 발생
}