* 다형성의 정의
- 상속구조에서 부모타입으로부터 파생된 여러타입의 자식 객체들을 부모타입 하나로 다룰 수 있는 기술
* 다형성을 쓰는 목적(장점)
- 코드 길이 감소
- 클래스 형변환
업 캐스팅(Up Casting) : 부모 타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있음
(자식타입 --> 부모타입 으로 자동 형변환)
다운캐스팅 (Down Casting) : 자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야할 경우 ,
부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형변환 하는 것
(부모타입 --> 자식타입으로 강제 형변환)
* 다형성을 사용하는 이유
* 1. 부모타입의 배열로 다양한 자식객체들을 받을 수 있음
* 2. 메소드 정의시 다형성 개념을 적용시키면 메소드 갯수가 확 줄어들수있음
* => Object클래스의 equals 메소드의 매개변수가 Object타입으로 되어있음
* 학생객체.equals(학생객체)
* 도서객체.equals(도서객체)
* 제품객체.equals(제품객체)
예시 1)
// 다형성 적용 전
// Child1 객체 2개와 Child2객체 2개를 관리
Child1[] arr1 = new Child1[2];
arr1[0]= new Child1(1,2,4);
arr1[1]= new Child1(3,4,5);
Child2[] arr2 = new Child2[2];
arr2[0] = new Child2(2,3,4);
arr2[1] = new Child2(1,4,5);
// 다형성 적용 후
Parent[] arr = new Parent[4];
//Parent
arr[0] = new Child1(1,2,4);
arr[1] = new Child2(2,3,4);
arr[2] = new Child2(1,4,5);
arr[3] = new Child1(3,4,5);
System.out.println("======================");
((Child1)arr[0]).printChild1();
((Child2)arr[1]).printChild2();
//((Child1)arr[2]).printChild1(); //ClassCastException 실직적으로 담긴 객체의 자료형과 달라 오류 (부적절한 클래스 형변환시)
((Child2)arr[2]).printChild2();
((Child1)arr[3]).printChild1();
System.out.println("=======반복문 이용========");
/* // 강제형변환 사용시
for(int i=0;i<arr.length;i++) {
if(i==0 || i==3) {
((Child1)arr[i]).printChild1();
} else{
((Child2)arr[i]).printChild2();
}
*/
/*
* instanceof => 현재 레퍼런스가 실직적으로 어떤 클래스 타입을 참조하는지 확인할 때 사용
*/
for(int i =0; i<arr.length;i++) {
if(arr[i] instanceof Child1){ // arr[i]레퍼런스가 실제 Child1참조하고 있을경우 true
((Child1)arr[i]).printChild1();
}else {
((Child2)arr[i]).printChild2();
}
}
예시 2)
//다형성 적용 전 case
public class ElectronicShop1 {
//전자상가에 있는 가게라고 생각
private Desktop desk;
private NoteBook note;
private Tablet tab;
//자식타입의 매개변수
public void insert(Desktop d) { //Desktop d = new Desktop(~~);
desk = d;
}
public void insert(NoteBook n) {
note = n;
}
public void insert(Tablet t) {
tab = t;
}
public Desktop selectDesktop() {
return desk;
}
public NoteBook selectNoteBook() {
return note;
}
public Tablet selecTablet() {
return tab;
}
//실행클래스
public static void main(String[] args) {
//1. 다형성 적용 안했을 경우 (ElectronicShop1)
ElectronicShop1 es = new ElectronicShop1();
//추가기능
es.insert(new Desktop("Samsung","데탑",1200000,"Geforce1070"));
es.insert(new NoteBook("LG","그램",2000000,4));
es.insert(new Tablet("Apple","아이패드",800000,false));
//조회
Desktop d = es.selectDesktop();
System.out.println(d);
NoteBook n = es.selectNoteBook();
System.out.println(n);
//Tablet t = es.selecTablet();
System.out.println(es.selecTablet());
//다형성 적용 후
public class ElectronicShop2 {
private Electronic[] elec = new Electronic[3];
private int count = 0;
public void insert(Electronic any) { //부모타입의 매개변수 하나 작성시 자식클래스 객체 모두 받아줄수있음
elec[count++] = any;
//count++;
}
public Electronic select(int index) {
return elec[index];
public class ElectronicRun {
// 실행용 클래스는 납품업체라고 생각
public static void main(String[] args) {
System.out.println("=============다형성 적용=============");
//2. 다형성 적용했을 경우 (ElectronicShop2)
ElectronicShop2 es2 = new ElectronicShop2();
//추가
es2.insert(new Desktop("Samsung","데탑",1200000,"Geforce1070"));
es2.insert(new NoteBook("LG","그램",2000000,4));
es2.insert(new Tablet("Apple","아이패드",800000,false));
//조회
Desktop d2 = (Desktop)es2.select(0);
NoteBook n2 = (NoteBook)es2.select(1);
Tablet t = (Tablet)es2.select(2);
System.out.println(d2);
System.out.println(n2);
System.out.println(t);
'JAVA' 카테고리의 다른 글
9_3. 다형성 _ 인터페이스 (0) | 2022.11.03 |
---|---|
9_2 . 다형성 _ 추상클래스/ 추상메소드 (0) | 2022.11.03 |
8_2. 상속 오버라이딩 (0) | 2022.11.02 |
8. 상속 (0) | 2022.11.02 |
7. 객체 배열 (0) | 2022.10.31 |