_13_MethodOverriding ( 메소드 오버라이딩)
메소드 오버라이딩
- 자식 클래스에서 부모 클래스에 있는 메소드를 덮어쓴다.(재정의)
- 같은 이름의 메소드임에도 불구하고 객체마다 다른 기능을 하게 된다.
1. 부모 클래스(Camera)
package chap_07.camera;
public class Camera { // 부모 클래스
public String name;
public Camera() { // 생성자
this.name = "카메라";
}
public void takePicture(){
// 사진 촬영
System.out.println(this.name + " : 사진을 촬영합니다.");
}
public void recordVideo(){
// 동영상 녹화
System.out.println(this.name + " : 동영상을 녹화합니다.");
}
public void showMainFeature(){
System.out.println(this.name + "의 주요 기능 : 사진 촬영, 동영상 녹화");
}
}
2. 자식클래스 ( FactoryCam )
package chap_07.camera;
public class FactoryCam extends Camera { // 자식 클래스
// 공장 카메라
// 설정 : 화재 감지 기능을 가짐.
public FactoryCam() {
this.name="공장 카메라";
}
public void detectFire(){
System.out.println("화재를 감지합니다.");
}
@Override
public void showMainFeature(){
System.out.println(this.name + "의 주요 기능 : 화재 감지");
// 메소드 오버라이딩 한 것
// factoryCam 객체를 통해 showMainFeature()를 호출하면
// 카메라 클래스(부모 클래스)에 있는 메소드를 덮어써서
// 사진 촬영, 동영상 녹화(부모 클래스 메소드)가 아니라 화재 감지가 뜸.
// factoryCam 객체를 통해서는 부모 클래스의 메소드 showMainFeature()를 불러올 수 없다.
// 메소드를 새롭게 재정의
}
}
3. 자식 클래스( SpeedCam )
package chap_07.camera;
public class SpeedCam extends Camera { // 자식 클래스
// 과속 단속 카메라
public SpeedCam() {
this.name="과속단속 카메라";
}
public void checkSpeed(){
// 속도 체크
System.out.println("속도를 측정합니다.");
}
public void recognizeLicensePlate(){
// 차량 번호 인식
System.out.println("차량 번호를 인식합니다.");
}
@Override // annotation : 컴파일러에게 부모 메소드를 오버라이딩 한 것임을 알려줌.
public void showMainFeature() {
System.out.println(this.name + "의 주요 기능 : 속도 측정, 번호 인식");
}
}
4. main
package chap_07;
import chap_07.camera.Camera;
import chap_07.camera.FactoryCam;
import chap_07.camera.SpeedCam;
import java.security.SecurityPermission;
public class _13_MethodOverriding {
public static void main(String[] args) {
// 메소드 오버라이딩 : 자식 클래스에서 부모 클래스의 메소드를 덮어쓰기 ( 재정의 )
Camera camera=new Camera();
FactoryCam factoryCam=new FactoryCam();
SpeedCam speedCam=new SpeedCam();
camera.showMainFeature();
factoryCam.showMainFeature();
speedCam.showMainFeature();
// 메소드 오버라이딩 하면 자식 클래스에서 부모 클래스에 있는 메소드를 덮어써
// 같은 이름의 메소드임에도 불구하고 객체마다 다른 기능을 하게 된다.
}
}
[실행 결과]
Camera, FactoryCam, SpeedCam 세 가지 클래스의 마지막 부분 showMainFeature() 함수에 주목하라.
같은 이름의 함수이지만 자식 클래스인 공장 카메라와 과속단속 카메라에서 메소드오버라이딩하여 새롭게 재정의했다.