_15_Super
필요성과 사용법을 단계별로 코드를 수정해가며 확인해보자.
[가 정]
공장 카메라에서는 동영상을 녹화함과 동시에 화재 감지 기능이 실행되고
과속 단속 카메라에서는 사진 촬영과 동시에 속도 측정과 번호판 인식 기능이 실행된다고 가정하자.
[단계 1]
1. Camera.class
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.class
3. SpeedCam.class
package chap_07.camera;
public class SpeedCam extends Camera { // 자식 클래스
// 과속 단속 카메라
public SpeedCam() {
this.name="과속단속 카메라";
}
////////////수정한 부분///////////////////////////////////////////////////////////////////
public void takePicture(){ // 사진 촬영과 동시에 속도 측정 및 반호판 인식
// 사진 촬영
System.out.println(this.name + " : 사진을 촬영합니다.");
checkSpeed();
recognizeLicensePlate();
}
////////////////////////////////////////////////////////////////////////////////////////
public void checkSpeed(){
// 속도 체크
System.out.println("속도를 측정합니다.");
}
public void recognizeLicensePlate(){
// 차량 번호 인식
System.out.println("차량 번호를 인식합니다.");
}
@Override // annotation : 컴파일러에게 부모 메소드를 오버라이딩 한 것임을 알려줌.
public void showMainFeature() {
System.out.println(this.name + "의 주요 기능 : 속도 측정, 번호 인식");
}
}
SpeedCam.class 는 _ 14_다형성 코드를 기반으로 표시한 영역에 해당하는 코드를 덧붙인 것이다.
4. main
package chap_07;
import chap_07.camera.FactoryCam;
import chap_07.camera.SpeedCam;
public class _15_Super {
public static void main(String[] args) {
// Super
FactoryCam factoryCam=new FactoryCam();
SpeedCam speedCam=new SpeedCam();
factoryCam.recordVideo();
System.out.println("------------------------");
speedCam.takePicture();
}
}
여기서 우리가 앞서 상속을 한 이유를 생각해보자.
- 부모 클래스에 있는 변수, 메소드 동작을 자식클래스에서 그대로 사용하기 위해서
- 공통적인 부분은 그대로 사용하면서 추가적인 부분만 자식 클래스에 만들어 사용하기 위함.
그런데 위와 같이 코드를 추가하면 우리가 상속을 한 의미가 사라지게 된다.
부모 클래스에서 takePicture(), recordVideo()의 동작을 바꾸거나 추가하게 되면 자식 클래스인 공장카메라, 과속 단속 카메라에서의 코드도 바꿔야 하는 현상이 발생한다.
이럴 때 Super를 사용한다.
super 를 아래와 같은 목적으로 사용한다.
부모클래스에 있는 recordVideo()를 수행하고 // super.recordVideo();
거기다가 추가로 자식클래스에서 제공하는 화재감지 기능 함께 수행. // detectFire();
자식 클래스에서 오버라이딩을 하긴 했지만 부모클래스에 있는 메소드 내용을 완전히 바꾸는 게 아니라
부모 클래스에 있는 내용을 그대로 쓰면서 뒤이어 추가적인 기능을 쓰겠다고 명시해 주는 것.
동영상 녹화와 동시에 화재 감지 기능도 on!
직접 코드를 살펴보면 FactoryCam.class에서 recordVideo() 메소드를 아래 빨간색 밑줄과 같이 수정한다.
마찬가지로 SpeedCam.class에서 takePicture() 메소드를 아래 빨간색 밑줄과 같이 수정한다.
위와 같이 수정하고 다시 _15_Super.class의 메인 메소드를 실행하면 super 를 사용하기 전과 같은 결과를 얻을 수 있다.