본문 바로가기
Spec UP - Backend/나도코딩의 자바기본편

Chap_07. 다형성

by TIS_Ha 2023. 4. 28.
반응형

다형성 : 하나의 클래스나 함수가 다양한 방식으로 동작가능한것.

 

상속 시간에 기본 카메라(Camera), 화재감지카메라(FactoryCam), 속도감지카메라(SpeedCam)을 생성하였다.

그리고 각각 Camera 클래스를 부모클래스로, FactoryCam과 SpeedCam 클래스를 자식클래스로 설정하였다.

 

이는 곧 아래와 같이 IS - A 관계라고 할 수 있다.

FactoryCam is a Camera : FactoryCam 은 Camera이다.

SpeedCam is a Camera : SpeedCam 은 Camera이다.

 

하지만 반대로 " Camera는 FactoryCam이라고 할수 있는가? " 혹은 " Camera는 SpeedCam인가? " 라고 질문한다면 아니라고 할 수 있다.

 

아래 예를 통해 생각해보자. (Ex. 부모클래스 : 사람 / 자식클래스 : 학생, 선생님) 

   class Person : 사람

   class Student extends Person : 학생은 사람이다. Student is a Person (IS-A)

   class Teacher extends Person : 선생님은 사람이다. Teacher is a Person(IS-A)

이라고 할때,  "사람은 학생이다" or "사람은 선생님이다"라는 말은 성립하지 않는 것과 같다.

 

이러한 IS-A 관계와 기존의 상속 클래스(Camera - FactoryCam, SpeedCam)를 이용해 다형성을 이해해보자.

기존에는 위와 같이 객체를 선언할 때 우리는 클래스명을 선언하였다.

FactoryCam is a Camera : FactoryCam 은 Camera이다.

SpeedCam is a Camera : SpeedCam 은 Camera이다.

 

여기서 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) {
        // 다형성
        Camera camera = new Camera();
        Camera factoryCam = new FactoryCam();
        Camera speedCam = new SpeedCam();
    }
}

이처럼 FactoryCam, SpeedCam 클래스명을 부모클래스명인 Camera로 대체해주어도 동일하게 인식된다.

하나의 클래스나 함수가 다양한 방식으로 동작가능한 특성을 다형성 이라고한다.


다형성을 활용하여 아래와 같이 배열로 만들 수도 있다.

cameras 객체를 배열로 생성하여 각각의 인덱스에 Camera, FactoryCam, SpeedCam 객체를 생성하였다.

그리고 아래 for each 문을 통하여 cameras 배열에 있는 모든 객체에 대하여 .showMainFeature() 메소드를 반복적으로 수행할 수 있다.


그런데 위와 같이 다형성을 이용해 클래스명을 부모클래스인 Camera로 선언한 경우 문제점이 발생된다.

FactoryCam과 SpeedCam은 각각 고유한 메소드를 가지고 있었는데 해당 메소드를 호출하면 아래와 같이 오류가 발생되는 것을 볼 수 있다.

이는 Camera 라는 부모클래스의 이름으로 정의했기 때문에 부모클래스 내에 있는 메소드만 접근할 수 있게되는 것이다.

때문에 자식 클래스(FactoryCam, SpeedCam)에만 있는 메소드는 바로 호출할 수 없다.

 

이 문제를 해결하기 위해 Java에는 이 객체가 어떤 클래스의 인스턴스인지를 확인하는 instanceof 라는 키워드가 있다.

아래와 같이 instanceof를 이용해 호출하면 자식클래스 내에만 있던 메소드에 접근 및 호출이 가능하다.

 

참고로 모든 Java 클래스는 기본적으로 Object라는 클래스를 상속받게된다.

반응형

'Spec UP - Backend > 나도코딩의 자바기본편' 카테고리의 다른 글

Chap_07. Reference 참조  (0) 2023.05.02
Chap_07. Super  (0) 2023.04.28
Chap_07. 메소드 오버라이딩  (0) 2023.04.28
Chap_07. 상속  (0) 2023.04.28
Chap_07. 패키지  (0) 2023.04.28

댓글