[Java] 클래스 형변환

zizi·2023년 5월 3일
0

Java

목록 보기
21/27

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


상속관계의 클래스 생성

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

    public class Bus extends Car{
        public void ppangppang(){
            System.out.println("빵빵.");
        }   
    }
  • 상속관계란 is a 관계
  • "Bus는 Car다." 라는 관계가 성립

부모타입으로 자식객체를 참조

  • 부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다.
    public class BusExam{
        public static void main(String args[]){
            Car car = new Bus();	//부모타입으로 자식객체를 참조. 부모가 가지고 있는 내용만 사용 가능.
            car.run();
            car.ppangppang(); // 컴파일 오류 발생
        }
    }
  • ppangppang()메소드를 호출하고 싶다면 Bus타입의 참조변수로 참조해야 한다.
    public class BusExam{
        public static void main(String args[]){
            Car car = new Bus();	
            car.run();
            //car.ppangppang(); // 컴파일 오류 발생

            Bus bus = (Bus)car;  //부모타입을 자식타입으로 형변환 
            bus.run();
            bus.ppangppang();
        }
    }
  • 객체들끼리도 형변환이 가능하다. 단 상속관계에 있었을 때만 가능하다.
  • 부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.(작은->큰)
  • 자식타입으로 부모타입의 객체를 참조하게 할때는 명시적으로 형변환 해주어야한다. (큰->작은)
  • 단 후자로 형변환 할때에는 부모가 참조하는 인스턴스가 형변환 하려는 자식타입일 때만 가능하다.

예제

public class Car{
    public int gas;
}
public class Suv extends Car{
}
public class Truck extends Car{
}
public class GasStation{
    public static void main(String[]args){
        GasStation gasStation = new GasStation(); //gasStation인스턴스 생성
        Suv suv = new Suv(); //suv 인스턴스 생성
        Truck truck = new Truck(); //truck 인스턴스 생성
        
        gasStation.fill(suv);	//gasStation에서 suv에 기름을 넣습니다.
        gasStation.fill(truck);	//gasStation에서 truck에 기름을 넣습니다.
    }
    
    public void fill(Suv suv){
        System.out.println("Suv에 기름을 넣습니다.");
        suv.gas += 10;
        System.out.println("기름이 "+suv.gas+"리터 들어있습니다.");
    }
    
    public void fill(Truck truck){
        System.out.println("Truck에 기름을 넣습니다.");
        truck.gas += 10;
        System.out.println("기름이 "+truck.gas+"리터 들어있습니다.");
    }
    
    //위의 2개 fill 메서드와 같은 결과를 효율적으로 수행하는 코드
    public void fill(Car car){
        //참고. car.getClass().getName()은 car오브젝트가 실제로 어떤 클래스인지를 알려줍니다.
        System.out.println(car.getClass().getName()+"에 기름을 넣습니다.");
        car.gas += 10;
        System.out.println("기름이 "+car.gas+"리터 들어있습니다.");
    }
}
profile
좋았다면 추억이고 나빴다면 경험이다.🍀

0개의 댓글

관련 채용 정보