Java/모두의 자바

Chapter 07-41 오버라이딩(Overriding)

계란💕 2022. 2. 8. 23:15

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