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. 다운캐스팅