본문 바로가기
자바(Java)

자바 입문하기14 - 클래스 형변환

by codeyaki 2022. 1. 11.
반응형

해당 강의를 보고 정리한 것입니다.

https://programmers.co.kr/learn/courses/5

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr


클래스 형 변환

: 부모 타입으로 자식 객체를 참조하게 되면 부모가 가지고 있는 메서드만 사용할 수 있다. 자식 객체가 가지고 있는 메서드나 속성을 사용하고 싶다면 형 변환해야 한다.

 

- 부모 Car클래스

public class Car {
	public void run() {
		System.out.println("Car의 run메서드");
	}
}

- 자식 Bus클래스

public class Bus extends Car{
	public void ppangppang() {
		System.out.println("빵빵");
	}
}

- 부모 타입으로 자식 객체 참조하기

  • 이 경우 부모가 가지고 있는 메서드만 사용 가능, 객체는 Bus의 객체로 생성됨.
public class BusExam {
	public static void main(String[] args) {
		Car car = new Bus();
		car.run();
		
	}
}

>> Car의 run메서드

 

- 형 변환 하기

public class BusExam {
	public static void main(String[] args) {
		Car car = new Bus();
		car.run();
		
		Bus bus = (Bus)car;
		bus.run();
		bus.ppangppang();
	}
}

>> 

Car의 Run메서드
Bus의 Run메서드
빵빵

  • 객체들끼리도 형 변환이 가능하다
  • 부모 타입으로 자식 타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.
  • 자식 타입으로 부모 타입의 객체를 바로 참조하려면 오류가 발생한다.
    따라서 자식 타입으로 부모 타입의 객체를 참조하게 할 때는 명시적으로 형 변환을 해줘야 한다.
    단, 부모가 참조하는 인스턴스가 형 변환하려는 자식 타입일 때만 가능
    - 잘못된 예
    Car car2 = new Car();
    Bus bus2 = (Bus)car2;
    bus2.run();//오류 발생
    >> ClassCastException 오류가 발생한다!!!- 옳바른 예
    Car car2 = new Bus();
    Bus bus2 = (Bus)car2;
    bus2.run();​
     근데 이렇게 쓰는 경우가 있을까 ? 그냥 처음부터 Bus로 인스턴스를 생성하면 될텐데... 후에 혹시라도 사용하는 경우를 발견하게 되면 기록을 남겨야겠다.


  • 만약 Bus클래스에 run()을 오버 라이딩한다면? 강의에 없는 내용이라 직접 테스트해보았다.
public class Bus extends Car{
	public Bus(){
		super();
//	System.out.println("Bus의 기본생성자");
	}
	public void run() {
		System.out.println("Bus의 Run메서드");
	}
	public void ppangppang() {
		System.out.println("빵빵");
	}
}
  • 결과
public class BusExam {
	public static void main(String[] args) {
		Car car = new Bus();
		car.run();
		
	}
}

>> Bus의 Run메서드

 

이유?

  • 먼저 Bus로 객체를 생성 후 Car로 형 변환을 해줘서 car.run(); 의 결과가 Bus의 Run메서드가 실행된 걸로 보인다.
반응형