다형성(polymorphism)


다형성(polymorphism)은 하나의 객체가 여러 타입을 가질 수 있음을 의미하지만, 좀 더 정확하게 말씀드리자면

 

상속받을(부모) 타입 참조변수로 자식 타입 객체를 다루는 것을 의미합니다! 

 

우리는 그동안 Example E = new Example(); 과 같이 클래스 타입과 인스턴스 타입을 일치해서만 사용해왔습니다.

 

그런데 사실 아래 코드처럼 부모 타입의 참조변수로 자식 타입의 인스턴스를 다루다는 것이 가능합니다.

 

하지만 그 역인 자식 타입의 참조변수로 부모 타입의 인스턴스를 다루는 것은 불가능합니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ParentExam {
    int a = 1;
    int b;
}
 
class ChildExam extends ParentExam {
    int c;
}
 
public class polymorphismExam {
 
    public static void main(String[] args) {
        
        ParentExam P = new ChildExam();
        System.out.println(P.a);
 
    }
}
cs

 

 

그 이유를 말씀드리기 전에 타입이 일치됐을 때와 불일치 됐을 때의 차이를 간단한 그림을 통해 보여드리겠습니다.

 

 

왼쪽 그림은 참조변수 Child를 통해 즉 ChildExam Child = new ChildExam(); 타입 일치를 시켜준 우리가 사용한 일반적인 경우이고,

 

오른쪽 그림은 참조변수 P를 통해 즉 ParentExam P = new ChildExam(); 부모 타입 참조 변수로 자식 타입 인스턴스를 다루는

 

타입 불일치를 시켜준 경우입니다.

 

이때 타입 일치를 시켜준 경우에는 상속을 받았기 때문에 부모 클래스보다 멤버의 개수가 같거나 많습니다. 따라서 자신의 모든 멤버를

 

사용할 수 있겠죠? 반대로 타입 불일치 된 경우에는 부모 클래스를 다룰 수 있는 참조변수 P를 통해 자식 인스턴스를 가리키고 있기

 

때문에 자식 인스턴스에서 선언된 멤버 변수 c를 사용할 수 없습니다. 이해가 어려우시다면 리모컨을 상상하시면 쉽습니다!

 

우리는 세 가지의 기능을 이용할 수 있는 리모컨(Child)과 그 제품(ChildExam)이 일치하는 경우에 세 가지의 모든 기능을

 

다룰 수 있는 제품과 그에 맞는 세 가지 버튼을 가진 리모컨이 있으므로 문제없이 모두 사용 가능합니다.

 

하지만 두 가지의 기능을 이용할 수 있는 리모컨(P)이라면 그 제품에 기능이 세 가지더라도 두 가지 기능만 사용할 수 있는 것입니다.

 

그렇다면 왜 이렇게 적은 기능을 사용하는데 굳이 다형성이란 개념이 필요한 것일까요? 또 장점은 무엇일까요?

 

그에 대한 답은 이후 보충 글에서 다루도록하겠습니다! 

'java > 객체지향' 카테고리의 다른 글

18-2. 다형성의 의의 및 장점  (1) 2023.01.20
18-1. 참조변수 형변환, instanceof 연산자  (2) 2023.01.20
17. 캡슐화(encapsulation)  (0) 2023.01.19
16-1. 제어자(modifier)  (0) 2023.01.18
16. 접근 제어자(access modifier)  (0) 2023.01.18

+ Recent posts