오늘은 캐스팅을 배워보려 합니다. 전에 클래스 설명하면서 '클래스도 타입이다!' 라고 했던것 기억하시나요? 이 문구와 상속에서 '모든 자식은 부모타입이다' 라는 이 문구를 기억하면서~ 캐스팅 설명들어갑니다~
Casting. 즉, 형변환이라고 하며 타입 변환이라고 봐도 될 것 같습니다.
캐스팅에는 2가지가 있습니다.
1. 업 캐스팅 (up casting)
- 자식의 타입을 부모 타입으로 형변환 하는 것
2. 다운 캐스팅 (down casting)
- up casting된 객체를 자식 타입으로 형변환
※ 주의 할 점! 처음부터 바로 부모 값을 자식타입으로 형변환시 오류가 발생합니다!
<캐스팅을 하는 이유>
모든 자식 값을 전달 받기 위해서는 동일한 타입의 저장공간으로 받아야 합니다.
하지만 자식끼리는 서로 타입이 다르기 때문에 한 번에 전달 받을 수가 없습니다.
(person의 부모클래스, Man, Woman의 자식클래스가 있을때 Man과 Woman의 타입은 다릅니다!)
이때 up casting을 사용하면, 모든 자식이 부모 타입이므로 하나의 저장공간에
모든 자식을 받을 수 있게 됩니다.
만약 up casting으로 자식 값을 전달 받았다면, 자식에서 새롭게 구현한 기능들은 사용할 수 없기 때문에
down casting을 통해서 복구 하고 사용합니다.
-> 업캐스팅을 하여 부모타입으로 자식을 받으면 부모에서는 부모 클래스에 있는 필드만 접근할 수 있습니다.
또한 부모 클래스의 필드 중 오버라이딩이 된 메소드가 있다면 재정의된 자식의 메소드의 내용만 사용할 수 있습니다.
// 부모 클래스
class Car {
void engineStart() {
System.out.println("시동 킴");
}
}
// 자식 클래스
class SuperCar extends Car {
@Override
void engineStart() {
System.out.println("음성으로 시동 킴");
}
void openRoof() {
System.out.println("뚜껑 열림");
}
}
public class CastingTest {
public static void main(String[] args) {
// 자식클래스와 부모클래스 타입으로 객체 생성
Car matiz = new Car();
SuperCar ferrari = new SuperCar();
// up casting
Car noOptionFerrari = new SuperCar();
// down casting
SuperCar fullOptionFerrari = (SuperCar) noOptionFerrari;
// 오류
// SuperCar brokenFerrari = (SuperCar)new Car();
}
}
★Point! 이제부터는 UpCasting과 DownCasting이 빈번하게 나오니 내용을 잘 보시고 넘어가시는것을 추천드립니다^^
그런데 이렇게 다운캐스팅과 업캐스팅이 난무하면 어떠한 객체가 어떤타입인지 어떤부모와 어떤자식의 타입으로 캐스팅이 된건지 복잡해집니다. 이럴때 쓰는 문법이 바로~ 바로~!! instanceof!!
instanceof란?
이 객체는 이 타입이 맞는가? 를 판별할 수 있는 문법으로서 a instanceof A 로 사용합니다.
이렇게 문법을 사용하면 결과값이 타입이 맞으면 true, 타입이 다르면 false로 나옵니다.
Car matiz = new Car();
SuperCar ferrari = new SuperCar();
// up casting
Car noOptionFerrari = new SuperCar();
// down casting
SuperCar fullOptionFerrari = (SuperCar) noOptionFerrari;
// matiz instanceof Car : true
System.out.println(matiz instanceof Car);
// matiz instanceof SuperCar : false
System.out.println(matiz instanceof SuperCar);
// ferrari instanceof Car : true
System.out.println(ferrari instanceof Car);
// ferrari instanceof SuperCar : true
System.out.println(ferrari instanceof SuperCar);
// noOptionFerrari instanceif Car : true
System.out.println(noOptionFerrari instanceof Car);
// noOptionFerrari instanceof SuperCar : true
System.out.println(noOptionFerrari instanceof SuperCar);
// fullOptionFerrari instanceof Car : true
System.out.println(fullOptionFerrari instanceof Car);
// fullOptoinFerrari instanceof SuperCar : true
System.out.println(fullOptionFerrari instanceof SuperCar);
-> 이 예제를 보면서 instanceof의 사용법과 예제를 확인 해주시면 도움이 될것 같습니다.
'프로그래밍 공부 > Java' 카테고리의 다른 글
[lesson] Java 프로그래밍 언어 - 추상 클래스 (0) | 2021.07.28 |
---|---|
[lesson] Java 프로그래밍 언어 - 접근 권한 제어자 (접근자) (0) | 2021.07.28 |
[lesson] Java 프로그래밍 언어 - 상속 (0) | 2021.07.28 |
[lesson] Java 프로그래밍 언어 - 클래스 (0) | 2021.07.27 |
[lesson] Java 프로그래밍 언어 - 메소드 (0) | 2021.07.26 |