1.다형성


다형성이란 단순하게 부모클래스로 선언하여 자식클래스로 객체화하거나 그 반대를 의미한다.


특징으로는 자식클래스의 기능을 간편하게 이용할 수 있다는게 가장 큰 장점이고 


단점으로는 겹치는 기능들만 사용하도록 기능이 축소되는것이다.


부모클래스로 선언하여 자식클래스로 객체화에는 따로 작업이 필요 없고 (묵시적 형변환, Promotion)


자식클래스에서 부모클래스로 이용을 할 때에는 따로 형변환을 적어줘야 한다. (Casting)


다형성을 사용하면 공간을 효율적으로 사용하고 객체 방을 새로 선언할 수고를 덜어준다.


아래 두가지 예제를 살펴보자



1. 포유류와 조류의 관계에 대한 다형성 예제


package Chap05.exam06.promotion;

/************************************************************
 			-  상속 관계  - 
 		 		Vertebrate
  				l			l
  			Birds			Mamal
 			/ 	l				/  l
 Chicken 	Ducks  Dog    Cat
 
 ************************************************************/

class Vertebrate{}


class Birds extends Vertebrate {}	// 조류
class Mamal extends Vertebrate {}	//포유류


class Chicken extends Birds {}		// 닭
class Duck extends Birds {}			// 오리 

class Dog extends Mamal {}			// 개
class Cat extends Mamal {}			// 고양이

/************************************************************/

public class Promotion {

	public static void main(String[] args) {
		// Promotion : 작은거 -> 큰거
		Vertebrate 척추동물;
		척추동물 = new Dog();
		척추동물 = new Cat();
		척추동물 = new Duck();
		척추동물 = new Chicken();
		
		Mamal 포유류;
		포유류 = new Dog();
		포유류 = new Cat();
		// 닭은 포유류를 상속 받지 않았기 때문에 Promotion 불가
		// 포유류 = new Chicken();  // 오류 발생
	}

}










2. Mamal클래스를 상속받은 Cat, Dog 클래스에 대한 Casting 예제


포유류

package Chap05.exam07.cast;

public class Mamal {

	public void birth() {
		System.out.println("새끼를 낳다.");
	}
	public void eat() {
		System.out.println("젖을 먹이다.");
	}
	
}

고양이

package Chap05.exam07.cast;

public class Cat extends Mamal {

	@Override  // 부모로부터 온 것이기 때문에 Promotion시 유지된다.
	public void birth() {
		System.out.println("4마리를 낳는다.");
	}

	// 원래 내 것은 Promotion시 사용하지 못 한다.
	public void mew() {
		System.out.println("냥");
	}
	
}


package Chap05.exam07.cast;

public class Dog extends Mamal {

	@Override  // 부모로부터 온 것이기 때문에 Promotion시 유지된다.
	public void birth() {
		System.out.println("5마리를 낳는다.");
	}

	// 원래 내 것은 Promotion시 사용하지 못 한다.
	public void bark() {
		System.out.println("멍멍 짖는다.");
	}
	
}

Casing 예

package Chap05.exam07.cast;

public class Cast {

	public static void main(String[] args) {


		// Promotion
		Mamal mamal = new Dog();
		mamal.birth();
		mamal.eat();
		//mamal.bark(); // Promotion 했기 때문에 자기것은 사용 불
		
		// bark나 mew를 사용하고 싶을 경우 Casting 사용
		Dog 댕댕이 = (Dog) mamal;
		댕댕이.bark();
		
		mamal = new Cat(); // 다시 Promotion을 해주어 바꿔야 오류가 나지 않음
		Cat 나비 = (Cat) mamal;
		나비.mew();
		
		// 상속받은 객체가 많은 경우 누가 누군지 헷갈리게 된다.
		// instanceof (bool값 반환) 를 사용하면 본래 객체를 확인 할 수 있다.
		if(mamal instanceof Cat) {
			나비 = (Cat) mamal;
			나비.mew();
		} else {
			System.out.println("고양이 객체가 아니에요");
			댕댕이 = (Dog) mamal;
			댕댕이.bark();
		}
		
	}

}


'개념 및 코딩 > 05.상속' 카테고리의 다른 글

[JAVA]05-06.익명객체, 결합도  (0) 2018.08.30
[JAVA]05-05.추상클래스, 인터페이스  (0) 2018.08.30
[JAVA]05-04.다형성 배열, 활용  (0) 2018.08.29
[JAVA]05-02.오버라이드  (0) 2018.08.27
[JAVA]05-01.상속  (0) 2018.08.24

+ Recent posts