_14_Polymorphism (다형성)
https://ruhaharu1107.tistory.com/14
카메라 패키지안에 있는 세 가지 클래스(Camera.class, FactoryCam.class, SpeedCam.class)는 위의 포스팅과 동일하다.
- class Person : 사람
- class Student extends Person : 학생 (학생은 사람이다. Student is a person)
- class Teacher extends Person : 선생님 (선생님은 사람이다. Teacher is a person)
- 상속 관계는 IS A 관계가 성립한다.
package chap_07;
import chap_07.camera.Camera;
import chap_07.camera.FactoryCam;
import chap_07.camera.SpeedCam;
public class _14_Polymorphism {
public static void main(String[] args) {
// 다형성
// class Person : 사람
// class Student extends Person : 학생 (학생은 사람이다. Student is a person)
// class Teacher extends Person : 선생님 (선생님은 사람이다. Teacher is a person)
// 상속 관계는 IS A 관계가 성립한다.
// 자식 클래스 객체 생성할 때 앞에 있는 부분은
// 아래와 같이 부모 클래스(Camera)를 이용해 생성해도 된다.
// Camera라는 부모 클래스로 서로 다른 형태의 객체 만들 수 있음 => 다형성
Camera camera=new Camera();
Camera factoryCam=new FactoryCam();
Camera speedCam=new SpeedCam();
// 아래 세 문장의 실행 결과는 이전과 같다.[* 여기]
camera.showMainFeature();
factoryCam.showMainFeature();
speedCam.showMainFeature();
System.out.println("-----------------------------");
Camera[] cameras=new Camera[3]; // 배열 생성
cameras[0]=new Camera(); // 1
cameras[1]=new FactoryCam(); // 2
cameras[2]=new SpeedCam(); // 3
// 1, 2, 3 과 같이 서로 다른 형태의 객체를 배열에 집어넣음.
// 반복문을 통해 showMainFeature() 메소드를 한 번만 서술하고도
// [* 여기]와 동일한 결과를 얻을 수 있다.
for(Camera cam : cameras){
cam.showMainFeature();
}
// 참고
// SpeedCam speedCam=new SpeedCam();과 같이 생성된 객체도
// cameras 배열로 관리는 할 수 있다.
}
}
이 때 주의점!! 위 사진의 빨갛게 표시된 메소드가 보이는가?
본문의 빨간 네모박스 친 부분과 같이 객체를 생성할 경우(부모 클래스를 이용해 자식클래스 객체 생성/ 다형성 관련)각 자식클래스의 객체에서 메소드를 사용할 때 해당 자식 클래스에만 정의된 메소드는 사용할 수 없다.
그러면 위와 같이 자식 클래스에만 정의된 메소드를 부모 클래스를 이용해 생성한 자식클래스 객체들과 함께 사용하려면 어떻게 해야 할까?
그런 경우에는 아래처럼 일종의 '형변환'을 해주면서 instanceof 키워드를 함께 사용하면 된다.
// 자바에는 객체가 어떤 클래스의 인스턴스인지 확인하는 instanceof 키워드가 있다.
if(camera instanceof Camera){
System.out.println("카메라입니다.");
}
if(factoryCam instanceof FactoryCam){
((FactoryCam) factoryCam).detectFire(); // 객체 factoryCam은 FactoryCam이라는 클래스로 형변환됨.
// 형변환한 후에는 자식 클래스인 FactoryCam에만 정의된 메소드인 detectFire()을 사용가능
}
if(speedCam instanceof SpeedCam){
((SpeedCam) speedCam).checkSpeed();
((SpeedCam) speedCam).recognizeLicensePlate();
}