Test121 상속 - 업 캐스팅, 다운 캐스팅
캐스팅이란 타입 변환을 말한다. 자바에서 클래스에 대한 캐스팅은 업캐스팅과 다운 캐스팅으로 나뉜다.
※ 업캐스팅(Upcasting)
자바에서 서브 클래스는 슈터 클래스의 속성을 상속받기 때문에, 서브 클래스의 객체는 슈퍼 클래스의 멤버를 모두 가진다. 서브 클래스는 수퍼 클래스의 모든 특성을 상속받는다는 말이다. 따라서, 서브 클래스는 슈퍼 클래스로 취급될 수 있다. 이 때, 업캐스팅(Upcasting)이란, 서브 클래스의 객체가 슈퍼 클래스 타입으로 형변환 되는 것을 말한다.
다시 말하자면, 슈퍼 클래스의 레퍼런스 변수가 서브 클래스로 객체화된 인스턴를 가리킬 수 있게 되는 것이다.
"사람은 동물이다" 정도로 생각하면 된다.
class Person{
String name;
Person(String name){
this.name = name;
}
}
class Student extends Person{
String check;
Student(String name){
super(name);
}
}
public class Practices {
public static void main(String[] args) {
Student stu = new Student("홍길동");
Person per = student;
per.name = "이름입니다";
per.check = "이름입니다."; //컴파일 타임 에러가 난다.
}
}
위 코드에서 슈퍼클래스 타입의 레퍼런스 per이 서브클래스 객체 stu를 가리키도록 되는 것이 업캐스팅이다.
업캐스팅을 통하여 Person타입의 per은 Student 객체를 가리키지만, per은 Person 타입이기 때문에 per로는 Person클래스의 멤버에만 접근이 가능하다. 그렇기 때문에 per.check 에서 컴파일 타임 에러가 발생했던 것이다.
※ 다운캐스팅(DownCasting)
업캐스팅과 반대로 캐스팅 하는 것을 다운캐스팅(Downcasting)이라고 한다. 자신의 고유한 특성을 잃은 서브클래스의 객체를 다시 복구시켜주는 것을 말하는데, 다시말하자면 업캐스팅 된 것을 다시 원상태로 돌리는 것을 말한다.
class Person{
String name;
Person(String name){
this.name = name;
}
}
class Student extends Person{
String check;
Student(String name){
super(name);
}
}
public class Practices {
public static void main(String[] args) {
Person per = new Student("홍길동");
Student stu = (Student)per;
stu.name = "김가나";
stu.check = "확인용";
}
}
우선 업캐스팅과의 차이점은 명시적으로 타입을 지정해야 한다는 것이다. 그리고 업캐스팅이 선행되어야 한다.
Person per = new Student("홍길동");
우선 이 코드에서 업캐스팅이 실행되었다.
이후 Student stu = (Student)per; 에서 다운캐스팅을 하였는데 보면 (Student)로 형변환을 해주었다. 다운캐스팅은 이와같이 명시적으로 타입 변환을 해 주어야 한다.
※ 실습
/*=======================================
■■■ 클래스 고급 ■■■
- 상속 관계에 있는 클래스들 간의 캐스팅
- 업 캐스팅, 다운 캐스팅
========================================*/
// super class, 부모 클래스, 상위 클래스
class SuperTest121
{
public int a = 10, b = 20;
public void write()
{
System.out.println("슈퍼 클래스 write() 메소드");
}
public int hap()
{
return a + b;
}
}
// sub class, 자식 클래스, 하위 클래스
class SubTest121 extends SuperTest121
{
public int b = 100, c = 200;
@Override
public int hap()
{
return a + b + c;
}
public void print()
{
System.out.println("서브 클래스 print() 메소드...");
}
}
// main() 메소드를 포함하고 있는 외부의 다른 클래스(동일 패키지)
public class Test121
{
public static void main(String[] args)
{
// sub class 기반 인스턴스 생성
SubTest121 ob1 = new SubTest121();
System.out.println("ob1.b : " + ob1.b);
//--==>> ob1.b : 100
// ○ 업 캐스팅
//SuperTest121 ob2;
SuperTest121 ob2 = ob1;
//-- 『SuperTest121 ob2 = (SuperTest121)ob1;』 과 동일한 구문
/*
학생 인경 = new 학생();
인간 사람 = 인경; //『인간 사람 = (인간)인경;』과 동일한 구문
byte a = 10;
short b = a; // 『short b = (short)a;』과 동일한 구문
*/
System.out.println("ob2.b : " + ob2.b);
//--==>> ob2.b : 20
//-- 변수는 객체별로 따로 할당되므로
// 변수 b는 ob2의 변수이다.
System.out.println("합 : " + ob2.hap());
//--==>> 합 : 310
//-- hap() 메소드는 오버라이딩(Overriding)되어 있고
// ob2 는 ob1 을 업캐스팅한 상태의 객체이므로
// 『SuperTest121』의 hap() 메소드를 호출하는 것이 아니라
// 『SubTest121』에서 재정의한 hap() 메소드를 호출하게 된다.
// 즉, 메소드는 업캐스팅이 되더라도
// 재정의(덮어쓰기)한 이상... 원래의 기능으로 되돌릴 수 없다.
ob2.write();
//--==>> 슈퍼 클래스 write() 메소드
//ob2.print();
//--==>> 에러 발생(컴파일 에러)
// ○ 다운 캐스팅
((SubTest121)ob2).print();
// ※ 추가 관찰-------------------------------------------------
// 다운 캐스팅 가능 여부
SuperTest121 ob3 = new SuperTest121();
SubTest121 ob4;
//System.out.println(ob3.c);
//--==>> 에러 발생(컴파일 에러)
//-- 상위 객체는 하위 객체의 멤버에 접근하는 것이 불가능하다.
//ob4 = ob3;
//--==>> 에러 발생(컴파일 에러)
//-- 상위 객체는 하위 객체에 담을 수(참조할 수) 없다.
ob4 = (SubTest121)ob3;
//--==>> 에러 발생(런타임 에러)
//-- 작성된 구문의 문법적인 구조만 봤을 때
// 다운 캐스팅이 이루어지는 상황이다.
// 하지만, 정상적인 캐스팅이 이루어지지 않는다.
// 현재 SubTest121 객체에 대해 메모리 할당이 이루어지지 않은 상태이기 때문에
// 다운 캐스팅은 불가능한 것이다.
}
}
○ 업 캐스팅, 다운 캐스팅이 정상적으로 이루어지는 경우
1. 하위 객체 생성 //-- check~!!!
2. 상위 = 하위 // 업 캐스팅. 정상.
3. 하위 = 상위 // 에러 발생.
4. 하위 = (하위)상위; // 다운 캐스팅. 정상
○ 업 캐스팅, 다운 캐스팅이 정상적으로 이루어지지 않는 경우
1. 상위 객체 생성; //-- check~!!!
2. 하위 = 상위; // 에러 발생.
3. 하위 = (하위)상위; // 다운 캐스팅. 런타임 에러 발생.
※ 업 캐스팅은 항상 가능. 다운 캐스팅은 경우에 따라 가능.
'JAVA > 상속' 카테고리의 다른 글
| Test123 상속 - 인터페이스 (1) (0) | 2020.09.10 |
|---|---|
| Test122 상속 - 인터페이스 개요 (0) | 2020.09.10 |
| Test120 상속 - 추상 클래스(abstract) (0) | 2020.09.10 |
| Test119 상속 - 메소드 오버라이딩(Method Overriding) (0) | 2020.09.10 |
| Test118 상속 - 개요 (실습) (0) | 2020.09.10 |