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 |