본문 바로가기

자바/객체지향

업캐스팅 다운캐스팅

예제1)


public class Test9 {

public static void main(String[] args) {

// super 생성자(먼저 메모리할당) -> sub 생성자

Demo9 ob1=new Demo9();  // new에 의하여 객체생성하면서 생성자 실행

System.out.println(ob1.b);  // 자기것(30) -> 자기것은 Demo9(하위클래스). 

ob1.exam();    // 자기것 메소드 실행


Ex9 ob2=ob1;  // 업캐스팅 => 변수는 상위클래스것을 쓰고  메서드는 하위에 없으면 상위 것을 쓴다.(재정의가 되어있는 메소드에 한해서)

    //Ex9 ob4=new Demo9(); // 이것은 객체생성과 동시에 업캐스팅한것이다. 

// 상위 클래스 객체는 하위 클래스 객체를 가르킬수 있다.

System.out.println(ob2.b);   // 자기것(20)    

ob2.exam(); // 메소드는 멤버변수와 달리 실제객체의 메소드호출  => 하위클래스의 메소드 사용하지만 상위클래스에 이 메소드가 없다면 에러가나옴.

// ob2.print();  //컴파일단계에서 super 클래스에 메소드가 없으므로 error

// Demo9 ob3=ob2; // 하위객체는 상위객체를 가르킬수없다. error

Demo9 ob3=(Demo9)ob2; // 다운캐스팅 => 변수와 메서드 모두 Demo9것 사용. 메서드는 하위에 없으면 상위 것을 쓴다.(재정의가 되어있는 메소드에 한해서)

// 다운캐스팅은 무조건되는 것이 아니라 업캐스팅 된것만 가능

System.out.println(ob3.b); // 다운캐스팅되어 하위클래스의 변수를 호출.

if(ob2 instanceof Demo9) {  // ob2가 Dome9에게 상속받은 객체라면 다음과 같은 명령을 수행하라.

System.out.println("Demo9 객체임....");

}

Ex9 ee=new Ex9();

// Demo9 ff=(Demo9)ee; // 다운캐스팅. 런타임오류

// 다운은 업된것만 가능

// ff.exam();

// ee 객체가 Demo9의 객체인 경우 true

if(ee instanceof Demo9) {  // ee는 Ex9클래스(상위클래스)의 객체이다. ee가 Demo9에게 상속받은 객체라면 다음과 같은 명령을 수행하라.

Demo9 ff=(Demo9)ee;

ff.exam();

}

}

}


class Ex9{

int a=10, b=20;

public Ex9() {

System.out.println("super class 생성자....");

}

public void test() {

System.out.println("a:"+a+",b:"+b);

// System.out.println(c); // 오류:하위클래스멤버접근불가

}

public void exam() {

System.out.println("super 클래스 메소드...");

}

}


class Demo9 extends Ex9 {

int b=30, c=40;

public Demo9() {

System.out.println("sub class 생성자....");

}

public void print() {

System.out.println("a:"+a+",b:"+b+",c:"+c);

}

public void exam() {

System.out.println("sub 클래스 메소드...");

}

}


예제1 결과)


super class 생성자....

sub class 생성자....

30

sub 클래스 메소드...

20

sub 클래스 메소드...

30

Demo9 객체임....

super class 생성자....


===========================================================================================================================================

예제2)

package com.test0516;
public class Test10 {
public static void main(String[] args) {
Object ob=new Ex();
// int x1=ob.a; // 컴파일오류 //Object 클래스는 모든 클래스의 최상위 클래스이다. 따라서 하위클래스를 호출하는 이 명령어는 불가능.
// int x2=(Test)ob.a;  // 컴파일오류 // 가로와 .(닷)이 있을 때는 .이 우선순위가 된다. 따라서 윗줄과 같은 이유로 에러.
int x3=((Test)ob).a;
int x4=((Ex)ob).a;
// int x5=((Test)ob).b; // 컴파일오류 // 상위클래스인 Test클래스로 하위클래스인  Ex클래스의 변수 호출 불가능.
int x6=((Ex)ob).b;
System.out.println(x3+","+x4+","+x6);
}
}
class Test{
    int a=10;
}
class Ex extends Test {
    int b=20;
}

예제2 결과)

10,10,20

'자바 > 객체지향' 카테고리의 다른 글

final 키워드  (0) 2013.05.21
static 키워드  (0) 2013.05.21
재정의(override), 중복정의(overloading)  (0) 2013.05.19
자바의 상속  (0) 2013.05.19
Method 메서드  (0) 2013.05.14