코딩/Java

자바 클래스와 다형성

 

이상하게 보이겠지만 클래스B의 데이터 형이 클래스A이다. 클래스 B는 클래스A를 상속하고 있다. 이런 경우에 클래스B는 클래스A를 데이터 형으로 삼을 수 있다.

그리고 어떠한 클래스를 인스턴스화 시킬 때 담는 변수의 데이터 타잎은 B클래스가 될 수도 있고  
B 클래스의 부모 클래스인 a가 될 수도 있다.

 

 

이 코드는 실행이 되지 않는다.


obj인 인스턴스가 마치 부모클래스인 A처럼 동작한다. 그래서 obj인스턴스의 메소드y 실행이 되지 않는다.

 

A obj = new B();는 클래스 A에 정의 되어있는 메소드들만 실행 

클래스 B에서 추가적으로 정의한 메소드는 실행x
하지만 클래스 B의 있는 메소드가 상위 클래스에 있는 메소드를 오버라이딩 했다면 실행 가능하다.

 

1.클래스 B의 데이터 타입을 클래스 A로 인스턴스화 했을 때
클래스 B의 메소드 y는 마치 존재하지 않는 것처럼 실행되지 않았다.
클래스 B가 클래스 A화 되었다.

2.클래스 B의 데이터 타입을 클래스 A로해서 인스턴스화 했을 때 
클래스 B의 메소드 x를 실행하면 클래스 A에서 정의된 메소드가 아니라
클래스 B에서 정의된 메소드가 실행 되었다.
클래스 B의 기본적인 성질은 그대로 간직하고 있다.

정리해보면 아래와 같다.

클래스 B를 클래스 A의 데이터 타입으로 인스턴스화 했을 때 
클래스 A에 존재하는 맴버만이 클래스 B의 맴버가 된다. 
동시에 클래스 B에서 오버라이딩한 맴버의 동작방식은 그대로 유지한다.

 

서로 다른 클래스 B와 B2가 동일한 데이터 타입 A로 인스턴스화 되었다.

하지만 두 인스턴스의 메소드 x를 호출한 결과는 서로 다르다.

이것이 상속과 오버라이딩 그리고 형변환을 이용한 다양성이다

 

사용 이유

클래스 CalculatorDemo의 execute 메소드는 CalculatorDecoPlus와 CalculatorDecoMinus 클래스의 메소드 run을 호출하면서 그것이 '실행결과'라는 사실을 화면에 표시하는 기능을 가지고 있다. 이 때 메소드 execute 내부에서는 매개변수로 전달된 객체의 메소드 run을 호출하고 있다.

만약 메소드 execute의 매개변수 데이터 타입이 Calculator가 아니라면 어떻게 해야할까? 위와 같은 로직을 처리 할 수 없을 것이다. 메소드 execute 입장에서는 매개변수로 전달된 값이 Calculator이거나 그 자식이라면 메소드 run을 가지고 있다는 것을 보장 받을 수 있게 되는 것이다.

 

'코딩 > Java' 카테고리의 다른 글

자바 예외  (0) 2020.12.27
자바 인터페이스와 다형성  (0) 2020.12.26
자바 다형성  (0) 2020.12.26
자바 interface  (0) 2020.12.24
자바 abstract  (0) 2020.12.24