Casting(클래스 형 변환)

김지원·2022년 6월 3일
0

Java

목록 보기
29/38

class도 type이다
=> class타입끼리의 형 변환에 대해 알아보자.

Up casting

부모 클래스 타입으로 자식 생성자를 호출하는 것.
( = 자식꺼를 부모클래스 타입으로 바꾸는 것.)

부모클래스명 객체 = new 자식생성자( );
  • 부모와 자식간의 공통 요소 (재정의 메서드) 만 사용가능하며,
    자식 클래스의 추가된 것들은 사용할 수 없다.
    ( 즉, 자식에서 만든 기능들에는 접근하지 못한다.)
  • 부모 타입으로 선언 되었기 때문에 부모의 필드만 사용 가능하지만
    자식 클래스에서 재정의 했다면 재정의 된 메서드로 사용된다.
  • 그냥 가능하다. ( 자식 -> 부모 )

Down casting

자식 클래스 타입으로 부모 생성자를 호출하는 오류
( = 자식꺼를 자식클래스 타입으로 바꾸는 것.)

  • 자식이 부모를 담을 수 있을까?
    없다! 그래서 오류라고 표현을 한다.
  • 부모의 범위가 더 크기 때문에 자식에 담을 수 없다.
  • 자식이 부모로 업캐스팅 되었던 적이 있었을 때,
    그 변환된 부모가 가능 ( 부모 -> 자식 )

간단한 예제로 upCasting 과 downCasting을 알아보자.

package casting;
class Car {
	String brand;
	String color;
	int price;
	
	public Car(String brand, String color, int price) {
		this.brand = brand;
		this.color = color;
		this.price = price;
	}
	
	public Car() {
		
	}

	void engineStart() {
		System.out.println("열쇠로 시동 킴");
	}
	
	void engineStop() {
		System.out.println("열쇠로 시동 끔");
	}
}

class SuperCar extends Car {
	String mode;
	
	public SuperCar() {
		
	}

	public SuperCar(String mode,String brand, String color, int price) {
		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("엔진으로 시동 끔");
	}
}

main에서 호출해보자!

new Car(); 타입이 아닌 자식생성자new SuperCar();를 불러준다.

재정의 된 메서드는 부모타입 일지라도 재정의 된 기능이 사용이 된다.
engineStart( ); 는 superCar에서 재정의한 것으로 출력된다.

changeMode(자식클래스에서 만든거)는 쓸수없다.
Car타입이라서 접근할 수 없다.

없다!!

< upCasting 결과 >

downCasting을 해보자.


컴파일러가 자바다시배우고 오라고 화를 내고 있다,,,
부모생성자를 호출할수없다는 오류가 나온다.


바꾸고 싶다면 강제형변환을 하면된다.

brokenCar.changeMode("스포츠");
출력을 해보자.

< downCasting 결과 >

코드를 작성할 때는 오류가 나지 않았는데 호출을 하니 오류가 뜬다.
즉, 실행해보기 전에는 오류인지 모른다.


이런 생각을 해본 적이 있나??
어떤 애가 정수타입인지 실수타입인지 궁금하다.
이때까지는 소수점이 있고 없고의 판단을 뺴기를 이용해서 0이면 정수 뭔가가 남으면 실수로 판단하였다.
이런거 말고 값이 들어오면 바로 바로 실수,정수인지 구분해주는게 있으면 좋지 않을까?
그렇다면!
그 클래스 타입이, 타입이 맞는것인지 안맞는것인지 구분하는걸 알아보자.

바로 그 아이는 instanceOf이다.

instanceof

: 각각의 타입을 확인할 때 사용하는 문법.

값 instanceof 클래스 타입

해석 : 값이 클래스 타입이니?

instanceof는 값이 두개가 나온다. -> 참 또는 거짓
=> 조건식이 생각난다.
이 아이를 참 또는 거짓의 값으로 보아야한다.


코드를 작성하면서 이해해보자.

첫번째 if문 해석 : (나머지도 이렇게 해석하면 된다.)
car는 값이다. => 이 값(객체)이(가) 자동차 타입이니?
=> nice casting이 출력되었다.

< 4가지 if문 출력결과 >

car instanceof SuperCar은 슈퍼카에 자동차를 담을 수 없기 때문에 오류가 뜬다.

noOptionFerrari instanceof Car 가 가장 헷갈린다.
결과는 자동차타입이라고 한다.

noOptionFerrari은 Car타입이긴한데 자식생성자를 호출한 아이다...

타입이 자동차타입이기 때문에 업캐스팅을 해도 자식클래스에 추가된 기능을 사용할 수 없다.
즉 범위를 벗어나지 않기 때문에 car타입이다.

0개의 댓글

관련 채용 정보