Java의 기본 개념 중 업캐스팅에 대해 알아보자
업캐스팅이란, 자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것이다.
조금 더 상세하게 설명해보자 !
만약 class A가 있고, class B extends A일때
A a = new B();
이처럼 부모 = 자식인 관계를 업캐스팅이라고 한다.
이를 해석해보자 !
대입연산자를 기준으로,
왼쪽(문법) = 오른쪽(메모리)
업캐스팅의 경우
왼쪽을 보면 a의 객체이므로 A의 문법을 사용할 수 있고,
왼쪽을 보면 b의 객체이므로 A와 B의 메모리를 사용 가능하다.
업캐스팅의 경우 반드시 자식을 보게 되어있다. 만약 자식에 오버라이딩 된 함수가 있다면 자식의 결과로 출력한다.
class A {
void f1() {
System.out.println(1);
}
void f2() {
System.out.println(888);
}
}
class B extends A {
void f1() {
System.out.println(2);
}
void f3() {
System.out.println(999);
}
}
public class hello {
public static void main(String[] args) {
//객체 생성 방법 4가지
A t1 = new A(); //1)상속과 관계 없는
A t2 = new B(); //2)부모 = 자식 (업캐스팅)
//B t3 = new A(); //3)자식 = 부모 (다운캐스팅) -> error
B t4 = new B(); //4)자식 >>> 부모
t2.f1(); // 자식에게 오버라이딩 된 함수(f1())가 있기 때문에 자식의 값 2 출력
t2.f2(); // 자식에게 오버라이딩 된 함수가 없기 때문에 부모의 값 888 출력
}
}
class A {
void m1() {
System.out.println(1);
}
void m3() {
System.out.println(3);
}
void m4() {
System.out.println(41);
}
}
class B extends A {
void m1() {
System.out.println(2);
m2(); //자식의 메모리가 존재하므로 출력됨
m3();
super.m4();
}
void m2() {
System.out.println(4);
}
void m4() {
System.out.println(42);
}
}
public class hello {
public static void main(String[] args) {
A t = new B(); //업캐스팅
t.m1(); //자식 메모리가 있으므로 자식에게 간다 !! 출력 결과 2
}
}
출력 결과는 ??
t.m1() 호출
-> 자식 class B에 m1()이 있으므로 이동
-> System.out.println(2);
실행
-> m2(); 실행 >> 자식 class B에 m2()가 있으므로 이동
-> System.out.println(4);
실행
-> m3(); 실행
-> 자식 class B에 m3()가 없으므로 부모로 이동
-> 부모 class A에 m3()가 있으므로 실행
->System.out.println(3);
-> 실행 후 다시 자식으로 이동
-> super.m4(); 실행
-> super 키워드에 따라 부모 class로 이동
-> System.out.println(41);
2
4
3
41