Casting은 변수가 원하는 정보를 모두 갖고 있는 것을 의미합니다.
너무 추상적인가요?
예를 들어
int a = 0.1;
int b = (int) true;
위 처럼 int에 0.1을 할당하면 에러가 납니다.
이는 int에 0.1을 할당할 수 없으며, true와 같은 boolean 타입을 int 로 캐스트가 불가하다는 것을 의미합니다.
즉, int라는 클래스는 4byte 크기의 메모리에 넣을 수 있는 정수만 가능하다는 것입니다.
그럼 캐스트는 왜 사용하는 것일까요?
첫 번째는 다형성입니다. 오버라이딩된 함수를 분리해서 활용할수 있습니다.
두 번째는 상속입니다. 캐스팅을 통해 범용적인 프로그래밍이 가능합니다.
그럼 형변환의 종류에 대해 알아보겠습니다.
간단하게 말하면, 상속 관계에 있는 부모와 자식 클래스 간에는 서로간의 형변환이 가능합니다.
그리고 클래스는 reference type으로 분류되므로 이를 참조형 캐스팅이라 부릅니다.
이때 자식 클래스는 부모 클래스를 상속하고 있고, 부모 클래스는 자식 클래스의 맴버를 모두 갖지 못한 상태입니다.
이때 업 캐스팅은 자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것입니다.
그리고 다운 캐스팅은 부모 클래스가 다시 자식 클래스 타입으로 캐스팅 되는 것입니다. 이때는 업 캐스팅 된 것을 다시 바꾸는 개념으로 이해하면 됩니다.(복구하는 개념)
1. 업 캐스팅(묵시적 형변환) : 캐스팅이 자동으로 발생하는 것을 의미합니다.
Parent parent = new Child();
Parent를 오버라이딩 한 Child 클래스는 Parent로 형변환을 해줄 필요가 없습니다.
Object클래스를 모든 클래스에서 오버라이딩 하지 않는 것과 같습니다.
2. 다운 캐스팅(명시적 형변환) : 캐스팅 할 내용을 적어주는 경우입니다.
주의점 : 다운 캐스팅은 단순히 업캐스팅의 반대 개념이 아닙니다.
다운 캐스팅의 진정한 의미는 부모 클래스로 업 캐스팅 된 자식 클래스를 복구하여, 본인의 필드와 기능을 회복하기 위한 것입니다.
즉, 원래 있던 기능을 회복하기 위해 다운 캐스팅을 하는 것입니다.
Parent parent = new Child();
Child child = (Child) parent;
예시로 알아보겠습니다.
class Parent {
int age;
Parent() {}
Parent(int age) {
this.age = age;
}
void printInfo() {
System.out.println("Parent Call!!!!");
}
}
class Child extends Parent {
String name;
Child() {}
Child(int age, String name) {
super(age);
this.name = name;
}
@Override
void printInfo() {
System.out.println("Child Call!!!!");
}
}
public class test {
public static void main(String[] args) {
Parent p = new Child();
p.printInfo(); // 문제1 : 출력 결과는?
Child c = (Child) new Parent(); //문제2 : 에러 종류는?
}
}
문제 1의 경우, 자바에서는 오버라이딩 된 함수를 동적 바인딩하기 때문에 Parent 클래스로 만들었어도 Child의 printInfo()를 사용하게 됩니다.
따라서 Child Call!!!!
> 만약 다시 다운 캐스팅을 해도 Child Call!!!로 메소드 결과가 나오겠죠~
문제 2의 경우 Child로 형변환을 했기때문에 컴파일러는 문법이 맞다고 생각해서 넘어가게됩니다.
하지만, 런타임 과정에서 Child 클래스에 Parent 클래스를 넣을 수 없기 때문에 Runtime Error가 발생합니다.
'기술 스텍 > Java' 카테고리의 다른 글
[Java] 프로세스 vs 스레드? (0) | 2024.02.21 |
---|---|
자바 버전에 따른 차이 (0) | 2024.02.19 |
Object 클래스란? (0) | 2024.02.07 |
직렬화란? (0) | 2024.02.03 |
Call By Value와 Call By Reference 차이점 분석 (0) | 2024.01.20 |