다형성이란?
- 자식객체를 부모타입의 참조변수에 담아 제어하는 기술
up-casting
- 상속관계에 있는 부모,자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입의 객체의 주소를 받을 수 있다.
Animal animal1 = new Lion(); //up - casting
down-casting
- 자식객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조할 경우, 후손 클래스 타입으로 형 변환해야 한다.
Lion lionAgain = (Lion) animal1;
//부모타입 -> 자식타입 (명시적 형변환 필요) down - casting
- 또는, 바로 형변환 가능
Anumal animal2 = new Tiger(); //up-casting
((Tiger(animal2).null(); //down-casting
객체배열의 다형성
- 상속 관계에 있는 여러 개의 자식클래스를 부모 클래스의 배열에 저장가능
Alphabet[] arr = new Alphabet[5]; //부모 클래스 Alphabet
arr[0] = new a();//자식클래스
arr[1] = new b();//자식클래스
arr[2] = new c();
arr[3] = new d();
arr[4] = new e();
instanceof연산자
형변환시 꼭 instanceof연산자로 확인
- 현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인할 때 사용
- 클래스타입이 맞으면 true, 아니면 false값 반환
- 해당 타입으로 형변환 할 수 있는가?로 생각하면 된다
Animal[] arr = new Animal[4];
arr[0] = new Lion();
arr[1] = new Tiger();
arr[2] = new Lion();
arr[3] = new Tiger();
for(int i = 0; i < arr.length; i++) {
((Lion)arr[i]).punch();
- 위와 같은 코드로 실행 할 경우 Tiger객체 까지 형변환 시도를 하기 때문에 , class cast Exception 에러가 발생
Animal[] arr = new Animal[4];
arr[0] = new Lion();
arr[1] = new Tiger();
arr[2] = new Lion();
arr[3] = new Tiger();
for(int i = 0; i < arr.length; i++) {
if(arr[i] instanceof Lion) {
((Lion)arr[i]).null1();
}
if(arr[i] instanceof Tiger) {
((Tiger)arr[i]).null2();
}
- 객체배열 arr[i]가 Lion객체인가? 라고 물어보는것
instanceof 연산자와 down-casting 활용
kindCar(new Sonata()); //자식 클래스
kindCar(new Avante());
kindCar(new Grandure());
public void kindCar(Car c){ // Car 부모클래스
if(c instanceof Sonata){
((Sonata).c).doSonataJump();
}
else if(c instanceof Avante){
((Avante).c).doAvanteJump();
}
else if(c instanceof Grandure){
((Grandure).c).doGrandureJump();
}
}
동적바인딩
- 상속 관계로 이루어져 다형성이 적용된 경우
- 오버라이딩된 메소드를 호출한 경우
Animal[] animals = new Animal[2];
animals[0] = animalGenerator();
animals[1] = animalGenerator();
for(Animal animal : animals) {
animal.attack();
// Tiger,Lion 메소드에 attack을 오버라이딩 했다고 가정
}
}
- Aniaml클래스의 attack메소드가 호출 되는것이 아닌, 오버라이딩 했던 Tiger,Lion의 attack메소드가 호출된다.
'Programming > Java' 카테고리의 다른 글
[JAVA ] toCharArray() (0) | 2022.03.28 |
---|---|
[JAVA 객체]캡슐화,상속,다형성, (0) | 2022.03.27 |
[JAVA 상속]생성자,new역할,this (0) | 2022.03.20 |
[JAVA 메소드]call by value,reference (0) | 2022.03.17 |
[JAVA 메소드]오버로딩 (0) | 2022.03.17 |