JAVA/Bootcamp 자바

Downcasting, 객체형변환

whyHbr 2024. 2. 28. 16:04
728x90
반응형

부모가 자식을 가리키게 하려면 -> Downcasting

 

부모는 크고 자식은 작기 때문에 자식이 부모에게 갈 때는 타입변환이 필요 없다 

하지만, 부모가 특정 자식에게 갈 때는 자식의 형으로 변환을 해 가야한다.

 

부모와 자식 상속관계선 부모타입은 자식 모두를 가리킬 수 있다 = upcasting

downcasting = 강제 형변환. 부모가 특정 자식으로 가고 싶을 때, 부모 타입이 바로 자식에게 갈 수 없다. 자식 타입으로 변환을 해야한다.

 

업캐스팅이 되어야 다운캐스팅이 된다

 

public class ObjectCasting {
   
public static void main(String[] args) {
        Animal ani =
new Dog();
       
ani.eat(); //dog
       
ani = new Cat();
       
ani.eat();//eat
   
}
}

하나의 메시지 eat인데 dog, cat 이다. 이것을 다형성이라고 한다.

 

고양이가 가지고 있고 부모는 없는

ani.night();

night메서드는 호출하지 못한다.

 

night는 재정의 되어있지 않다. 그래서 ani 로 갈 수 없다. 

downcasting에 의해 가능하다. 

ani를 cat을 형변환해서 가야한다.

 

 

Upcasting과 Downcasting

 

자식은 부모의 것을 마음대로 쓸 수 있지만 자식은 부모의 것을 마음대로 쓰지 못한다.

 

고양이만 가진 night를 부모가 사용하게 하려면?

downcasting

다운캐스팅은 부모의 타입을 자식의 타입으로 바꾸는 것이다.

 

Cat c =(Cat)ani;// downcasting
//ani
타입을 cat타입으로 바꿔 cat타입으로 바꿀 있다
//((Cat)ani).night(); 
이렇게도 가능하다
c.night();

 

Cat c= (Cat)ani;

 

((Cat)ani.)night();

 

 

(추가) 다운 캐스팅을 하려면

public class PersonDowncasting {
    public static void main(String[] args) {
     Person p = new Student();


    Student std = (Student) p;
    ((Student) p).graduation();

    Person sal = new Salary(); //다운 하려면 각각의 부모 객체가 필요함
        ((Salary)sal).pay();
    }
}

 

 

부모는 자식에게 각각 객체 생성을 해야한다.

Person p = new Student();

 

Student std = (Student) p;

p.graduation();

Salary sal = (Salary) p;

p.pay();

--> 이렇게 안된다는 것

 

다운캐스팅을 하려면 업캐스팅을 해놔야한다


Person p = new Person();
Student std = (Student) p;
((Student) p).graduation();

이것도 안됨

 

--------------------

public class PersonDowncasting {
    public static void main(String[] args) {

     Person p = new Student("name",34,534534); //1다운 1생성
    Student std = (Student) p;
    ((Student) p).graduation();
        System.out.println(p.toString());
        
     Person sal = new Salary(); //다운 하려면 각각의 부모 객체가 필요함
         ((Salary)sal).pay();
         sal.Zzz();

    }
}

 

Person에서 상태변수를 private으로 해놨기 때문에 객체 생성 할 때 바로 전달을 해야한다.

Zzz()메소드는 오버라이드를 해놔 Salary에서 정의한 Zzz로 출력된다. 

 

 

728x90

'JAVA > Bootcamp 자바' 카테고리의 다른 글

추상 클래스, 인터페이스  (2) 2024.03.05
자바 - 다형성  (0) 2024.02.29
Override재정의, Upcasting, 동적바인딩  (1) 2024.02.28
부모, 자식, 상속, protected, extends  (0) 2024.02.27
class, object, instance  (0) 2024.02.26