[up casting]
부모클래스 타입으로 자식 생성자를 호출하는 것
부모클래스명 객체 = new 자식 생성자();
부모 안에 자식을 담는 것
부모와 자식간의 공통 요소(재정의 메서드)만 사용 가능하며 자식 클래스의 추가 된 것들은 사용할 수 없다
부모타입으로 선언 되었기 때문에 부모필드만 사용 가능하지만, 자식 클래스에서 재정의 했다면 재정의 된 메서드로 사용된다
[down casting]
자식 클래스 타입으로 부모 생성자를 호출하는 오류
부모의 범위가 더 크기 때문에 자식에 담을 수 없다
package day18;
class Car{
String brand;
String color;
int price;
public Car() {
}
public Car(String brand, String color, int price) {
this.brand = brand;
this.color = color;
this.price = price;
}
void engineStart() {
System.out.println("열쇠로 시동 킴");
}
void engineStop() {
System.out.println("열쇠로 시동 끔");
}
}
//부모를 상속 받은 자식 클래스
class SuperCar extends Car{
String mode;
//기본 생성자
public SuperCar() {
}
public SuperCar(String brand, String color, int price, String mode) {
super(brand, color, price); //부모생성자 받아오기
this.mode = mode;
}
void changeMode(String newMode) {
this.mode = newMode;
System.out.println("모드가 바뀌었습니다");
}
@Override //재정의
void engineStart() {
System.out.println("음성으로 시동 킴");
}
@Override
void engineStop() {
System.out.println("음성으로 시동 끔");
}
}
public class CastingTest {
public static void main(String[] args) {
//up casting 자식 생성자를 불러옴
Car noOptionFerrari = new SuperCar();
noOptionFerrari.engineStart();
//noOptionFerrari 에서 시동을 켜면 음성일까 열쇠일까?
//부모타입일지라도, 자식 클래스에서 재정의된 엔진스타트 메서드가 있다면 재정의 된 메서드로 사용이 된다. 따라서 음성으로 시동 킴!
}
}
음성으로 시동 킴
public class CastingTest {
public static void main(String[] args) {
//up casting 자식 생성자를 불러옴
Car noOptionFerrari = new SuperCar();
noOptionFerrari.engineStart();
//noOptionFerrari 에서 시동을 켜면 음성일까 열쇠일까?
//부모타입일지라도, 자식 클래스에서 재정의된 엔진스타트 메서드가 있다면 재정의 된 메서드로 사용이 된다. 따라서 음성으로 시동 킴!
//down casting : 오류
SuperCar brokenCar = (SuperCar) new Car();
brokenCar.changeMode("스포츠");
}
}
강제 형변환으로 캐스팅 할 수는 있으나 오류가 난다
Car car = new Car();
SuperCar ferrari = new SuperCar();
//car는 값이다. 따라서 car의 값이 Car자동차 타입이니? 묻는 것
if(car instanceof Car) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
if(ferrari instanceof Car) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
if(car instanceof SuperCar) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
if(noOptionFerrari instanceof Car) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
//타입이 자동차 타입. 업캐스팅을 해도 타입만 맞다면 맞다
}
}
nice casting
nice casting
err : wrong casting
nice casting
자동차가 슈퍼카보다 큰 범위 이기 때문에, 자동차를 슈퍼카에 담을 수 없다
err : wrong casting
최종코드
package day18;
class Car{
String brand;
String color;
int price;
public Car() {
}
public Car(String brand, String color, int price) {
this.brand = brand;
this.color = color;
this.price = price;
}
void engineStart() {
System.out.println("열쇠로 시동 킴");
}
void engineStop() {
System.out.println("열쇠로 시동 끔");
}
}
//부모를 상속 받은 자식 클래스
class SuperCar extends Car{
String mode;
//기본 생성자
public SuperCar() {
}
public SuperCar(String brand, String color, int price, String mode) {
super(brand, color, price); //부모생성자 받아오기
this.mode = mode;
}
void changeMode(String newMode) {
this.mode = newMode;
System.out.println("모드가 바뀌었습니다");
}
@Override //재정의
void engineStart() {
System.out.println("음성으로 시동 킴");
}
@Override
void engineStop() {
System.out.println("음성으로 시동 끔");
}
}
public class CastingTest {
public static void main(String[] args) {
//up casting 자식 생성자를 불러옴
Car noOptionFerrari = new SuperCar();
//noOptionFerrari.engineStart();
//noOptionFerrari 에서 시동을 켜면 음성일까 열쇠일까?
//부모타입일지라도, 자식 클래스에서 재정의된 엔진스타트 메서드가 있다면 재정의 된 메서드로 사용이 된다. 따라서 음성으로 시동 킴!
//down casting : 오류
// SuperCar brokenCar = (SuperCar) new Car();
// brokenCar.changeMode("스포츠");
Car car = new Car();
SuperCar ferrari = new SuperCar();
//car는 값이다. 따라서 car의 값이 Car자동차 타입이니? 묻는 것
if(car instanceof Car) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
if(ferrari instanceof Car) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
if(car instanceof SuperCar) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
if(noOptionFerrari instanceof Car) {
System.out.println("nice casting");
}else {
System.out.println("err : wrong casting");
}
//타입이 자동차 타입. 업캐스팅을 해도 타입만 맞다면 맞다
}
}
728x90
'Dev. > java' 카테고리의 다른 글
Java 추상 클래스 (0) | 2022.06.12 |
---|---|
Java :: 다형성/ 싱글턴 패턴 (0) | 2022.06.12 |
Java 클래스 배열 (0) | 2022.06.11 |
Java 상속 (0) | 2022.06.11 |
상속 / 다형성 (0) | 2022.06.07 |
댓글