07-41.1 오버 라이딩(Overriding)
Def) 오버 라이딩(Overriding) : 부모가 가진 메서드나 똑같은 모양의 메서드를 자식이 가지는 것을 말한다
- 부모가 물려준 메서드를 자식 클래스를 재정의해서 사용하는 것이다.
(1) Car클래스에 run메서드를 만든다.
<hide/>
package javaStudy;
public class Car{
public void run() {
System.out.println("Car의 run 메서드");
}
}
(2) Car클래스를 상속받는 Van클래스를 만든다.
<hide/>
package javaStudy;
public class Van extends Car {
}
(3) VanExam 클래스를 만든다.
- VanExam에 Van의 인스턴스를 생성하고 Van이 가진 run 메서드를 실행한다.
<hide/>
package javaStudy;
public class VanExam {
public static void main(String[] args) {
Van van = new Van();
van.run();
}
}
Note) 실행 결과: Car의 run 메서드
- Van 클래스는 메서드가 없기 때문에 부모 클래스인 Car클래스의 run메서드가 실행된다.
(4) Van 클래스에 부모 클래스 Car가 가진 메서드와 같은 모양의 메서드를 선언한다.
<hide/>
package javaStudy;
public class Van extends Car {
public void run() {
System.out.println("Van의 run 메서드");
}
}
Note) VanExam 실행결과 : Van의 run 메서드
- 실행 결과가 달라졌다. 부모 클래스인 Car가 가진 run 메서드를 실행하지 않는다.
- 자식 클래스인 Van이 새로 정의한 run메서드를 실행한다.
- 재정의하더라도 부모 클래스의 메서드가 사라지진 않는다.
07-41.2 부모 클래스의 메서드를 아예 사용하지 않는 것이 아니라 특정 부분만 추가하고 싶은 경우는?
- super.run() 을 추가한다.
<hide/>
package javaStudy;
public class VanExam {
public static void main(String[] args) {
Van van = new Van();
van.run();
}
}
Note) 출력 결과
- 자식 클래스에서 run메서드를 호출하면 자식이 가진 run 메서드만 호출한다.
- super.run() 을 추가하여 실행하면 Car클래스와 Van클래스의 run메서드가 차례대로 실행된다.'
- 또한, 오버라이딩을 해도 부모 클래스와 메서드가 사라지지 않는다는 걸 알 수 있다.
07-41.3 오버라이딩 실습
Ex 1) 오버라이딩은 부모 클래스의 메서드를 그대로 사용하되 조금만 수정하고 싶을 때 유용하다.
예를 들어 차와 버스는 비슷한 점이 많다. 멈추거나 경적을 울리는 행동은 같다.
그런데 버스는 달릴 때 다음 정거장이 어디인지 안내하는 동작을 추가해야 한다.
Car클래스를 상속 받는 Bus클래스에서 run메서드를 오바라이딩하라.
오버라이드된 run메서드에서는 "차가 달리면서 다음 정거장을 안내합니다."라고 출력되도록 한다.
<hide/>
package javaStudy;
public class Car{
public void run() {
System.out.println("차가 달립니다.");
}
public void stop() {
System.out.println("차가 멈춥니다.");
}
public void horn() {
System.out.println("경적을 울립니다.");
}
}
<hide/>
package javaStudy;
public class Bus extends Car {
// 정답 public void run() {
// System.out.println("차가 달리면서 다음 정거장을 안내합니다.");
}
}
<hide/>
// 실행위한 코드
package javaStudy;
public class BusExam {
public static void main(String[] args) {
Bus bus = new Bus();
bus.run();
}
}
Note) 출력 결과
- Car클래스를 상속 받은 Bus클래스는 Car클래스가 가진 메서드를 사용할 수 있다.
- 그러나 Bus 클래스는 run메서드가 필요하지만 Car의 run과 다르게 동작하고 싶다.
- 부모가 가진 메서드와 별개로 다른 이름의 메서드를 정읳 사용할 수도 있다.
- 그러면 사용자 입장에서 차를 달리게 할 때, 버스가 달리게 할 때 각각 다른 메서드를 사용해야 하므로 불편하다.
- 이런 불편함 때문에 오버라이딩을 이용하는 것이다.
- Car클래스를 상속받은 Bus 클래스는 run메서드를 두 개 가진다.
- 그러면 메서드는 오버라이딩 되면 무조선 자식의 메서드를 사용하므로 어느 메서드가 사용될지 걱정할 필요 없다.
07-41.4 오버라이딩 실습
Ex 2) 오버라이딩 하는 경우 부모 클래스의 메서드도 이용하고 싶은 경우, super 키워드를 이용한다.
Bus클래스에서 run을 오버라이드 하는 부분을 확인하고 실행하라
<hide/>
package javaStudy;
public class Bus extends Car {
public void run() {
super.run();
System.out.println("차가 달리면서 다음 정거장을 안내합니다.");
}
}
Note) 실행 결과
- 오버라이드하면 무조건 자식의 메서드를 이용한다.
- 따라서, 부모의 메서드를 실행하려면 명시적으로 알려줘야 한다.
- 부모 클래스를 뜻하는 키워드 "super"를 이용한다.
- super.메서드, super.필드.. 이렇게 호출하면 메서드나 필드를 오버라이드 했을 때,
- 명시적으로 부모의 메서드나 필드를 호출할 수 있다.
'Java > 모두의 자바' 카테고리의 다른 글
Chapter 08-43 인터페이스 만들기 (0) | 2022.02.09 |
---|---|
Chapter 07-42 클래스 형변환 (0) | 2022.02.09 |
Chapter 07-40 super과 부모 생성자 (0) | 2022.02.08 |
Chapter 07-39 추상 클래스 (0) | 2022.02.08 |
Chapter 07-38 접근 제한자 (0) | 2022.02.08 |