오버라이딩(overriding)
: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것▶ 2차원 좌표계의 한 점을 표현하기 위한 Point클래스가 있을 때, 이를 조상으로 하는 Point3D클래스,
3차원 좌표계의 한 점을 표현하기 위한 클래스를 아래와 같이 작성함
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;
}
}
* Point클래스의 getLocation()은 한 점의 x,y 좌표를 문자열로 반환하도록 작성됨
* 이 두 클래스는 서로 상속관계에 있으므로 Point3D클래스는
Point클래스로부터 getLocation()을 상속받지만,
Point3D클래스는 3차원 좌표계의 한 점을 표현하기 위한 것이므로 조상인 Point클래스로부터 상속받은
getLocation()은 Point3D클래스에 맞지 않음
* 그래서 이 메서드를 Point3D클래스 자신에 맞게 z축의 좌표값도 포함하여 반환하도록 오버라이딩 함
⛳ 조건
1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 불가
-만일 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가 protected나 public이어야 함(같은 범위 혹은 더 넓은 것)
-대부분의 경우 같은 범위의 접근 제어자를 사용함
-접근 제어자의 접근범위를 넓은 것에서 좁은 것 순으로 나열하면 public > protected > (default) > provate임
2. 조상 클래스의 메서드보다 많은 수의 예외를 선언 할 수 없음
-아래코드 참고 : Child클래스의 ParentMethod()에 선언된 예외의 개수가 조상인 Parent클래스의 ParentMethod()에 선언된 예외의 개수보다 작으므로 바르게 오버라이딩 됨
class Parent {
void ParentMethod() throws IOException, SQLException {
...
}
}
class Child extends Parent {
void parentMethod() throws IOException {
...
}
...
}
▶조상 클래스에 메서드를 자손 클래스에서 오버라이딩할 때
1. 선언부가 조상 클래스의 메서드와 일치
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없음
3. 예외는 조상 클래스의 메서드보다 많이 선언 할 수 없음
오버로딩
: 기존에 없는 새로운 메서드를 추가하는 것(new)오버라이딩
: 조상으로부터 상속받은 메서드의 내용을 변경하는 것(change, modify)class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} //오버라이딩
void parentMethod(int i) {} //오버로딩
void childMethod() {}
void childMethod(int i) {} //오버로딩
void childMethod() {} //에러. 중복정의 되었음(already defined in Child)