부모가 자식을 가리키게 하려면 -> 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를 부모가 사용하게 하려면?
다운캐스팅은 부모의 타입을 자식의 타입으로 바꾸는 것이다.
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로 출력된다.
'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 |