다형성이란?

 

  • 자식객체를 부모타입의 참조변수에 담아 제어하는 기술

 

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