다형성 - 업캐스팅, 다운캐스팅

1. 업 캐스팅.

 

- 특정 객체가 하위 클래스의 형에서 상위의 클래스의 형으로 캐스팅 되는것.

- 업캐스팅은 다음과 같은 기술과 연결된다.

*상속, 오버라이딩, 가상메서드,  추상클래스, 인터페이스.

-일반적인 캐스팅의 원리는 작은 것이 큰 것으로 될수 있다는 것이다.

 

 

 

1
2
3
4
5
6
public class UpcastingTest {
    public static void main(String agr[]){
        byte b = 0;        
        int i = b;//byte형에서 int형으로 변환이 가능하다.
    }
}

 byte형에서 int형으로 캐스팅 되었다.

 

 

- 클래스의 업 캐스팅 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class UpcastingTest {
    public static void main(String agr[]){
        TestTop top = new TestBottom(); 
        //작은것(TestBottom)이 큰것(TestTop)으로 캐스팅 되었다.
        Top.Test1();
        Top.Test2();//에러! 이 경우 Top는 하위 클래스의 test2메소드 호출이 불가능하다.
 
    }
}
class TestTop{
    public void Test1(){        
    }
}
class TestBottom extends TestTop{
    public void test2(){        
    }
}

 

 이 경우, 상위 클래스인 TestTop은 하위 클래스인 TestBottom의 맴버메소드에 접근 할 수 없다.

하지만 오버라이딩과 가상 메소드 기법을 사용하여 접근 할 수 없는 부분을 사용할 수가 있다.

 

-가상메소드를 이용한 업캐스팅. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class UpcastingTest {
    public static void main(String agr[]){
        TestBottom bottom = new TestBottom();
        TestTop Top = bottom;
        bottom.Test1();        
        Top.Test1();//하위클래스에서 정의가 되었다면 하위클래스를 호출.
    }
}
class TestTop{
    public void Test1(){
        System.out.println("상위클래스의 멤버입니다.");
    }
}
class TestBottom extends TestTop{
    public void Test1(){
        System.out.println("하위클래스의 멤버입니다.");
    }
}

 결과

 

하위클래스의 멤버입니다.
하위클래스의 멤버입니다.

 

 

 

-상위클래스의 메소드를 호출했지만 하위클래스에서 같은 이름으로 메소드가 정의 되었다면 하위클래스의 메소드를 호출하게 된다.

물론, 하위클래스에서 정의 되지 않았으면 상위클래스의 메소드를 호출한다.

 

 

-추상메소드를 이용한 업캐스팅 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class UpcastingTest {
    public static void main(String agr[]){
        TestBottom bottom = new TestBottom();
        TestTop Top = bottom;
        bottom.Test1();        
        Top.Test1();    
    }
}
abstract class TestTop{
    public abstract void Test1();
}
class TestBottom extends TestTop{
    @Override
    public void Test1(){
        System.out.println("하위클래스의 멤버입니다.");
    }
}

 

결과

 

하위클래스의 멤버입니다.
하위클래스의 멤버입니다.
 

 

-추상클래스는 하위클래스에서 추상메소드를 오버라이딩 해야 객체생성이 되기때문에 가상메소드의 개념과 비슷하다.

 


2. 다운캐스팅

 

'웹 & 안드로이드 > JAVA & JSP' 카테고리의 다른 글

IntegerArrayConverter - String배열을 int배열로 변환  (0) 2013.10.06
내부클래스  (0) 2013.10.04
다형성-인터페이스  (0) 2013.10.02
다형성-추상클래스  (0) 2013.10.01
추상클래스, 인터페이스  (0) 2013.10.01

댓글()