Small Grey Outline Pointer Java Casting/instance of
본문 바로가기
Dev./java

Java Casting/instance of

by sso. 2022. 6. 11.

[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

댓글