메소드 오버라이딩은 상속된 메소드의 내용이 자식 클래스에 맞지 않는 경우, 자식 클래스에서 동일한 이름을 갖는 메소드를 재정의하는 것을 말한다.
메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된 자식 메소드가 호출된다.
Parent
class Parent {
void method1();
void method2();
}
Child
class Child extends Parent {
void method2();
void method3();
}
ChildExample
class ChildExample {
public static void main(String[] args) {
Child child = new Child();
child.method1();
child.method2(); //재정의된 메소드 호출 (즉, Child 객체의 method2() 호출)
child.method3();
}
}
위와 같이, 메소드 오버라이딩을 했을 때, 자식 객체의 메소드를 호출하면 재정의된 메소드가 호출된다.
메소드를 오버라이딩하기 위한 조건은 다음과 같다.
public
접근 제한을 가질 경우, 자식 메소드는 default
나 private
접근 제한으로 수정할 수 없다.throws
할 수 없다.super
)자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 경우, 명시적으로
super
키워드를 붙여서 부모 메소드를 호출할 수 있다.
super
는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있다.super.부모메소드();
final
클래스와 final
메소드 ]
fianl
키워드는 해당 선언이 최종 상태이고, 결코 수정될 수 없음을 뜻한다.
final
키워드는 클래스, 필드, 메소드 선언 시에 사용할 수 있다.final
클래스클래스를 선언할 때
final
키워드를class
앞에 붙이면 상속할 수 없는 클래스가 된다.
즉final
클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다!
public final class 클래스 { ... }
Member
public final class Member {
}
VeryVeryImportantPerson
public class VeryVeryImportantPerson extends Member {
}
→ 에러 발생!
final
메소드메소드를 선언할 때
final
키워드를 붙이면 오버라이딩할 수 없는 메소드가 된다.
즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된final
메소드는 자식 클래스에서 재정의할 수 없다.
public final 리턴타입 메소드( [매개변수, ...] ) { ... }
Car
public class Car {
//필드
public int speed;
//메소드
public void speedUp() { speed += 1}
//final 메소드
public final void stop() {
System.out.println("차를 멈춤");
speed = 0;
}
}
SportsCar
public class SportsCar extends Car {
@Override
public void speedUp() { speed += 10 }
//오버라이딩할 수 없음!
//@Override
//public void stop() {
// System.out.println("스포츠카를 멈춤");
// speed = 0;
//}
}
Car
에서 stop()
메소드를 final
로 선언하였으므로, Car
를 상속받은 SportsCar
에서는 stop()
메소드를 오버라이딩할 수 없다!
이것이 자바다 책
http://tcpschool.com/java/java_inheritance_overriding