타입변환
다형성을 위해 자바는 부모 클래스(상위)로 타입 변환을 허용한다. 즉 부모 타입에 모든 자식객체가 대입될 수 있다. 이것을 이용하면 객체는 부품화가 가능하다.
강제 타입 변환(Casting)
강제 타입변환(Casting)은 부모타입을 자식 타입으로 변환하는 것을 말한다. 그렇다고 해서 모든 부모타입을 자식클래스 타입으로 강제 변환할 수 있는 것은 아니다. 자식 타입이 부모타입으로 자동 변환한 후 , 다시 자식 타입으로 변환할 떄 강제 타입변환을 사용할 수 있다.
Parent parent = new Child();
parent.field1 = "XX";
parent.method1();
parent.method2();
parent.field2 = "yy"; //컴파일에러
parent.method3(); //컴파일에러
Child child = (Child)parent;
child.field3 = "yy";
child.method3();
child.field1 = "zz";
child.method1();
메모리 구조를 그림으로 그려보면
Parent 타입의 parent 변수는 child 안에 있는 색칠한 Parent만 참조하고 있다.
그렇기 떄문에 위 코드에서 컴파일에러라 주석처리한 부분을 보면 Parent안에 존재하지 않기 때문에 에러가 나타난다.
Child child = (Child)parent; 강제형변환을 하게 되면 child의 변수를 보면 Child 전체를 참조하게 된다.
부모타입으로 객체를 만들고 parent 로 upcasting을 하게 되면 원래 형태로 down cating이 가능하다.
객체 타입 확인
자바는 컴파일 후 메모리를 할당하는 순서로 이루어진다.
부모타입으로 객체를 만들고 parent 로 upcasting을 하게 되면 원래 형태로 downcating이 가능하다.
앞서 말했듯이 자바는 컴파일을 하고 난 후 메모리에 할당하는 순서로 이루어져있다. 그렇기 때문에 컴파일 성공을 해도 위 그림처럼 메모리 할당이 되지 않고 예외가 발생할 수 있다.
Child 변수를 보면 강제 Downcasting 을 하였다. parent 객체 내부 child 영역이 없기 때문에 Downcasting이 되지 않는다. ClaaCastException 예외가 발생하며 프로그램이 죽어버린다. 이러한 예외가 발생할 수 있기 때문에 그 전에 물어볼 수 있는 방법이 있다.
Parent parent = new Parnet();
boolean flag = parent instanceof Child;
if(flag){ // if(flag == true){
Child child = (Child)parent; //컴파일 성공
}
Parent가 Child 타입의 객체라면 강제형 변환을 한다는 if절을 사용한다.
instanceof 연산자
boolean result = 좌항(객체) instanceof 우항(타입)
instanceof 연산자는 매개값의 타입을 조사할 때 주로 사용된다. 메소드 내에서 강제 타입변환이 필요할 경우 반드시 매개 값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입변환을 해야한다.
'java' 카테고리의 다른 글
java_11_인터페이스 (0) | 2021.10.21 |
---|---|
java_10_final & abstract (0) | 2021.10.21 |
java_9_ 다형성과 Overriding (0) | 2021.10.20 |
java_8_상속(문제) (0) | 2021.10.19 |
java_8_ 상속 ( super와 this & 오버라이딩 ) (0) | 2021.10.19 |