class 형변환
class도 하나의 자료형이기 때문에 형변환이 가능하다 단 class들이 상속관계에 있을 때만 업캐스팅이나 다운캐스팅이 가능하다. 자료형의 형변환과 마찬가지로 다운캐스팅을 할 때에는 명시해줘야 한다.
상속관계 A -> B, C(B,C가 A를 상속받는 관계)
업캐스팅
ex) A a = new B(); -> A가 부모class이고 B는 자식 관계이므로 B를 생성할 때 자동적으로 A class로 업 캐스팅이 되기때문에 명시를 할 필요가 없다 단 상속관계여야 class의 형변환이 가능하다. 여기서 주의할 점은 업캐스팅을 했을 때 B라는 class로 생성을 했지만 A의 메소드만 쓸 수 있다.
A class
package Javatest;
public class A {
public void info() {
System.out.println("A class method");
}
}
A를 상속받은 B
package Javatest;
public class B extends A{
public void Binfo() {
System.out.println("B");
}
}
main class
package Main;
import Javatest.A;
import Javatest.B;
public class Main {
public static void main(String[] args) {
A a = new B();
a.info();
}
}
A class로 B를 생성했지만 부모 class인 A method만 쓸 수 있다. B에 method Binfo라는 method는 쓸 수가 없다. 만약 B에서 method를 쓰고 싶다면 A에 method를 B에서 오버라이드를 하여 재정의하면 B에서 쓸 수가 있다.
다운캐스팅
자료형의 다운캐스팅 처럼 class에서도 다운캐스팅이 가능하다. 똑같이 명시적으로 알려줘야한다. 하지만 부모class에서 생성하면 자식class로 다운캐스팅이 불가능하고 상속관계가 없는 class도 불가능하다. class의 형변환은 상속관계가 성립됐을때만 가능하다.
package Main;
import Javatest.A;
import Javatest.B;
public class Main {
public static void main(String[] args) {
A a = new B();
a.info();
B b = (B) new A();
b.Binfo();
}
}
업캐스팅과 다운캐스팅 코드 연습
package j13_상속.casting2;
public class Main {
public static void main(String[] args) {
Taxi taxi = new Taxi();
Subway subway = new Subway();
Transportation transportation = new Transportation();
// Taxi t1 = (Taxi) transportation; //다운캐스팅이 안된다. 왜?? -> 부모클래스를 생성했을시 메모리 공간이
// //부모 클래스의 메모리 공간만 생성되고 자식클래스는 부모와 자기자신의 메모리공간이 같이 생성되기 때문에
// //담을 공간이 없기 때문에 안된다.
//
//
// Transportation transportation1 = taxi;
// Subway s1 = (Subway) transportation1; //다운 캐스팅이 안된다. 부모클래스는 같지만 택시와 지하철은 관계가 없기
// //때문에 다운캐스팅이 되지 않는다.
//
// Transportation transportation2 = subway;
//instanceof는 포함관계를 보고, getclass(), class는 명확하게 어떤 객체가 생성되었는지 보는 것
Transportation[] transportations = new Transportation[6];
//업캐스팅
transportations[0] = taxi;
transportations[1] = subway;
transportations[2] = taxi;
transportations[3] = subway;
transportations[4] = taxi;
transportations[5] = subway;
//다운캐스팅
for (int i = 0; i < transportations.length; i++) {
if(transportations[i] instanceof Taxi) {
Taxi tx = (Taxi)transportations[i];
tx.checkTaxiNumber();
}else if(transportations[i] instanceof Subway) {
Subway sw = (Subway)transportations[i];
sw.checkRoute();
}
transportations[i].go();
}
for(Transportation trans : transportations ) {
trans.stop();
}
}
}
'Language > Java' 카테고리의 다른 글
[Java] 익명 클래스 (0) | 2023.09.15 |
---|---|
[Java] 추상클래스와 인터페이스 차이점 (1) | 2023.09.15 |
[Java] Class의 생성자(Constructor) 및 접근 지정자 (0) | 2023.09.13 |
[Java] Class와 객체지향언어(OOP) (0) | 2023.09.13 |
[Java] Method(함수) (0) | 2023.09.12 |