다른 타입으로 변환하는 것을 말한다.
자동 타입 변환과 강제 타입 변환(casting)이 있다.
자동으로 타입 변환이 일어나는 것이다.
다음과 같이 자식은 부모의 기능을 상속받았기 때문에 부모의 타입으로 자동 타입 변환이 가능하다.
public class Parent { }
class Child extends Parent { }
//부모타입 변수 = 자식타입객체;
Parent p = new Child();
부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드, 메소드만 접근이 가능하다. 단, Overriding 된 메소드가 있다면 Overriding된 메소드가 호출된다. (자식 메소드가 실행된다.)
다형성
사용 방법은 동일하지만 실행 결과가 다르게 나오는 것 이다.
객체의 메소드는 동일하지만 결과가 다르게 나오는 성질을 말한다.
부모 타입은 자식 타입으로 자동 변환되지 않는다.
대신 캐스팅을 통해 강제로 타입 변환을 할 수 있다.
//자식타입 변수 = (자식타입) 부모타입객체;
Child c = (Child) p;
Parents p1 = new Child();
Child c1 = (Child) p1; //강제 타입 변환 가능
Parents p2 = new Parents();
Child c2 = (Child) p2; //강제 타입 변환 불가능, 런타임 에러
변수가 참조하는 타입을 확인할 때 instancof를 사용하며, boolean 값을 리턴해준다.
다음은 위에서 작성한 c1 객체가 Child 타입인지 확인해주는 코드다.
boolean result = c1 instanceof Child;
다음과 같이 강제 타입 변환 전에 사용하고자 하는 타입(Child2)인지 instance로 확인한다. 사용하고자하는 타입이 아니라면(!Child2) 강제 타입 변환을 할 수 없다.
강제 타입 변환을 하는 이유는 사용하고자 하는 자식 객체의 모든 멤버에 접근하기 위해서다. ( Child2의 필드인 name에 접근하기 위해서다. Child1,3에는 name 필드가 존재하지 않아 접근할 수 없다. )
class Child1 extends Parents{}
class Child2 extends Parents{
String name = "두번째";
}
class Child3 extends Parents{}
public class Child{
//부모 타입으로 받음 : 자식 객체면 아무나 typeCheck사용 가능
static void typeCheck(Parents p) {
//타입 확인 후 강제 타입 변환
/* 방법 1
if(p instanceof Child2) {
Child2 ch = (Child2) p;
System.out.println(ch.name +" : Child2 타입이다.");
}
*/
//방법 2 : java 12부터 사용, true일 경우 객체가 우측 변수에 담김
if(p instanceof Child2 ch)
System.out.println(ch.name +" : Child2 타입이다.");
}
public static void main(String[] args) {
Parents c1 = new Child1();
Parents c2 = new Child2();
Parents c3 = new Child3();
typeCheck(c1);
typeCheck(c2);
typeCheck(c3);
}
}
결과는 다음과 같다.
두번째 : Child2 타입이다.
🙇🏻♀️
이것이 자바다 - 한빛미디어