본문 바로가기

2023/JAVA_나도코딩 강의 공부

다형성

_14_Polymorphism (다형성)

https://ruhaharu1107.tistory.com/14

 

메소드 오버라이딩

_13_MethodOverriding ( 메소드 오버라이딩) 메소드 오버라이딩 자식 클래스에서 부모 클래스에 있는 메소드를 덮어쓴다.(재정의) 같은 이름의 메소드임에도 불구하고 객체마다 다른 기능을 하게 된다

ruhaharu1107.tistory.com

카메라 패키지안에 있는 세 가지 클래스(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 배열로 관리는 할 수 있다.

    }
}

위 코드의 실행결과 => 다형성 특징을 활용하면 반복문의 showMainFeature() 메소드를 한번만 서술하고도 위아래가 동일한 결과가 나옴을 확인할 수 있다.

 

 

 

 

이 때 주의점!! 위 사진의 빨갛게 표시된 메소드가 보이는가?

본문의 빨간 네모박스 친 부분과 같이 객체를 생성할 경우(부모 클래스를 이용해 자식클래스 객체 생성/ 다형성 관련)각 자식클래스의 객체에서 메소드를 사용할 때 해당 자식 클래스에만 정의된 메소드는 사용할 수 없다.

 

그러면 위와 같이 자식 클래스에만 정의된 메소드를 부모 클래스를 이용해 생성한 자식클래스 객체들과 함께 사용하려면 어떻게 해야 할까? 

 

그런 경우에는 아래처럼 일종의 '형변환'을 해주면서 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();
}

실행 결과

 

 

 

'2023 > JAVA_나도코딩 강의 공부' 카테고리의 다른 글

Super  (0) 2023.03.01
메소드 오버라이딩  (0) 2023.02.28
상속  (0) 2023.02.28
패키지  (0) 2023.02.28
생성자  (1) 2023.02.27