본문 바로가기
프로그래밍 공부/Java

[lesson] Java 프로그래밍 언어 - 캐스팅(Casting)

by Luna_lua 2021. 7. 28.
반응형

오늘은 캐스팅을 배워보려 합니다. 전에 클래스 설명하면서 '클래스도 타입이다!' 라고 했던것 기억하시나요? 이 문구와 상속에서 '모든 자식은 부모타입이다' 라는 이 문구를 기억하면서~ 캐스팅 설명들어갑니다~

 

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의 사용법과 예제를 확인 해주시면 도움이 될것 같습니다.

반응형