목차
다형성이란?
다형성의 예제 그림
참조변수의 형변환 예제
다형성이란?
다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것입니다.
부모 클래스의 참조변수로 자식 클래스의 인스턴스를 참조하는 방식으로 많이 사용합니다.
다형성, 업캐스팅, 다운캐스팅
부모-자식 관계의 클래스에서 어떻게 다형성을 활용하는지 아래 그림과 함께 보겠습니다.
부모가 Parent 클래스이고 자식이 Child 클래스입니다.
부모클래스 참조변수 Parent p 는 자식 클래스의 인스턴스 new Child()를 참조합니다.
이를, 업캐스팅(Upcasting) 이라고 합니다. 자동으로 형 변환을 합니다.
Parent p = new Child();
반대로 자식 클래스 참조변수 Child c가 부모 클래스의 인스턴스 new Parent()를 참조할 수도 있습니다.
이를, 다운캐스팅(DownCasting) 이라고 합니다. 명시적으로 형 변환을 합니다.
Child c = null;
Parent p = new Parent();
c = (Child) p;
참조변수의 형변환 예제
참조변수의 다형성 특징을 자바 코드로 알아보겠습니다.
Car 클래스가 부모 클래스, FireEngine 클래스가 자식 클래스입니다.
main() 메서드에서 5가지 설정이 유효한지 확인해보겠습니다.
class Car{
String color;
int door;
void drive(){
System.out.println("drive, Srrrr~");
}
void stop(){
System.out.println("stop!!");
}
}
class FireEngine extends Car{
void water(){
System.out.println("water!!!");
}
}
====================================================
public static void main(String[] args){
Car car =null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water(); // Line 1
car = fe // Line 2
car.water(); // Line 3
fe2 = (FireEngine)car; //Line 4
fe2.water(); //Line 5
}
아래 코드처럼, 초기 클래스들의 인스턴스를 생성합니다.
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
객체 3개를 생성하는데, 각 참조변수는 주소값을 가집니다. car와 fe2는 참조 대상이 null이기 때문에 주소가 할당되지 않으며 fe 객체만이 new FireEngine() 인스턴스를 참조해 주소값을 가집니다. fe객체는 자신의 인스턴스를 가리킵니다.
아래 사진은 현재 참조변수와 FireEngine 인스턴스의 관계 현황입니다.
- line1
참조변수 fe로 water() 메서드를 실행합니다.
fe.water();
참조변수 fe는 자신의 타입으로 생성한 인스턴스를 참조하기 때문에 모든 변수에 접근이 가능하고 메서드를 실행할 수 있습니다. 따라서 fe.water() 가 정상 실행됩니다.
- line2, 3
참조변수 car가 참조변수 fe를 참조합니다.
car = fe;
//car.water()
자손타입의 참조변수 fe가 가리키는 인스터스를 조상타입의 car가 참조하도록 업캐스팅(Upcasting)합니다. 업캐스팅이기 때문에 형변환을 하지 않습니다. car는 fe가 사용하고 있는 인스턴스에 접근할 수 있지만 자손타입이 새롭게 정의한 water()메소드는 사용 할 수 없습니다.
- line4, 5, 6
자손타입의 참조변수 fe2가 car를 참조합니다. 그리고 fe.water()를 실행합니다
fe2 = (FireEngine)car;
fe2.water();
fe2가 자손타입의 참조변수 이므로, 부모타입을 참조하기 위해서 다운캐스팅(DownCasting)을 합니다. 다운캐스팅을 하기 위해서는 꼭 형변환을 명시적으로 해야합니다. line2의 car와 달리 line3의 참조변수 fe2는 FireEngine클래스이므로 water() 메서드를 사용할 수 있습니다.
참고
'학습' 카테고리의 다른 글
ArrayList & Vector 차이점 (0) | 2020.07.23 |
---|---|
Compile vs Interpretation (0) | 2020.07.23 |
Wrapper class / Integer cache pool (0) | 2020.07.17 |
Override vs Overload (0) | 2020.07.17 |
Java Heap vs Stack (Memory Allocation) (0) | 2020.07.15 |