캐스팅 (Casting)
타입을 변환하는 것
쉽게 말해 형변환
한 데이터 유형을 다른 데이터 유형으로 변환하는 프로세스를 Typecasting 혹은 Upcasting 이라고 하며
Downcasting 은 객체 유형 캐스팅
Java 에서는 객체도 데이터타입처럼 형 변환이 가능
Typecasting 은 변수가 함수에 의해 올바르게 처리되는지 여부를 확인하는데 사용
Upcasting 은 암시적, 명시적으로 수행 가능하지만, Downcasting 은 암시적으로 사용할 수 없다
업캐스팅 (Upcasting)
하위 객체가 상위 클래스로 Typecast 되는 유형
업캐스팅을 하면 슈퍼클래스 변수, 메서드를 자식 클래스에서 쉽게 접근 가능
쉽게 말해
서브클래스의 객체가 슈퍼 클래스로 형 변환 되는 것
class Parent{
void printData(){
System.out.println("method of parent class");
}
}
class Child extends Parent{
void printData(){
System.out.println("method of child class");
}
void printChildData(){
System.out.println("method of only child class");
}
}
Parent parent;
Child child = new Child();
// parent = (Parent) child; 괄호 생략 가능
parent = child;
// parent.printChildData(); 에러 발생
<업캐스팅은 형변환 괄호 생략 가능>
위 코드에서 슈퍼클래스 타입의 parent 객체가 서브클래스 객체인 child 를 가리키는 것이 업캐스팅
업캐스팅을 통해 Parent 타입의 parent 는 Child 객체를 가리킴
parent 는 Parent 타입이기 때문에 슈퍼클래스 객체의 클래스 멤버에만 접근이 가능하다.
업캐스팅을 하게 되면, 슈퍼클래스 멤버로 멤버 개수가 한정되기 때문에 서브클래스의 모든 멤버에 접근 X
쉽게 말해 서브클래스, 슈퍼클래스에서 공통된 것만 사용 가능, 서브클래스에만 있는건 사용 X
왜?
공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위함
상속 관계에서 상속 받은 서브클래스의 개수와 상관없이 하나의 인스턴스로 묶어서 관리가 가능하기 때문
Rectangle[] r = new Rectangle[];
r[0] = new Rectangle();
r[1] = new Rectangle();
Triangle[] t = new Triangle[];
t[0] = new Triangle();
t[1] = new Triangle();
Circle[] c = new Circle[];
c[0] = new Circle();
c[1] = new Circle();
위와 같은 코드에서는, 사각형, 삼각형, 원 모두 각자의 객체를 생성하여 사용
Shape[] s = new Shape[];
s[0] = new Rectangle();
s[1] = new Rectangle();
s[2] = new Triangle();
s[3] = new Triangle();
s[4] = new Circle();
s[5] = new Circle();
업캐스팅을 활용하면 위와 같이 하나의 인스턴스로 여러 타입을 묶어서 활용 가능
유지보수에 매우 좋음
다운캐스팅 (Downcasting)
업캐스팅 객체에서 서브클래스에만 있는 고유한 메서드를 실행하고 싶으면?
>> 그래서 다운캐스팅이 필요
자신의 특성을 잃은 서브클래스 객체를 다시 복구시켜 주는 것
업캐스팅 된 것을 다시 원상태로 돌리는 것을 의미
** 단순하게 업캐스팅의 반대 개념이 아님
슈퍼클래스로 업캐스팅 된 서브클래스를 복구하여 본인의 필드와 기능을 회복하기 위한 것
다운캐스팅에서는 괄호 생략이 불가능하다
Parent parent = new Child();
Child child = (Child) parent;
child.printChildData();
parent 객체는 Child 로 업캐스팅
이후 child 객체를 생성하며 parent 객체를 다시 다운캐스팅
Child 클래스로 다운캐스팅 된 child 객체는 다시 Child 클래스만의 메서드인 printChildData() 사용 가능
주의
업캐스팅 되지 않은 객체일 경우 다운캐스팅을 시도하면 ClassCastException 에러 발생
Parent parent = new Parent("name of parent");
Child child = (Child) parent;
위와 같은 코드에서는
Exception in thread "main" java.lang.ClassCastException: class Parent cannot be cast to class Child (Parent and Child are in unnamed module of loader 'app')
위와 같은 에러가 발생
IDE 상에서 빨간줄로 에러가 표시되지 않으므로 코드 작성시에 매우매우 주의해야 함
'끄적 > ?' 카테고리의 다른 글
Design Patten (0) | 2023.09.19 |
---|---|
HashMap Key에 Object (0) | 2023.09.17 |
Generic (0) | 2023.08.27 |
Java ArrayList와 List 차이 (0) | 2023.08.27 |
String, StringBuffer, StringBuilder (0) | 2023.08.27 |