20. JAVA, 다형성(polymorphism)
○ 다형성(polymorphism)
- 객체지향 프로그래밍의 특징 중 하나 (참고 : OOP의 특징)
- 하나의 객체가 여러 가지 타입을 가질 수 있는 것
- 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현
- 다형성의 예 : Calendar는 GregorianCalendar()의 부모임(아래 코드 및 그림 참고)
new연산자를 이용해 메모리를 할당할 때는 좌우의 클래스가 같아야 하지만
밀접도가 높은 상속관계에서는 자식 클래스를 부모 클래스가 참조하는 것이 가능
→ 형변환이 매우 용이해짐
Calendar now = new Calendar(); //일반적인 경우
Calendar now = new GregorianCalendar(); //다형성(polymorphism)
○ POJO vs Polymorphism
- 객체 생성 방식
① POJO(Plain Old Java Object) 방식
② 다형성을 이용한 객체 생성
package oop0411;
class Father {
public String name="아버지";
public String addr="주소";
public Father() {};
public Father(String name, String addr) {
this.name=name; //this.멤버변수=매개변수
this.addr=addr;
};
public void disp() {
System.out.println(this.name);
System.out.println(this.addr);
}
}//Father class end
class Son extends Father {
public Son() {};
public Son(String n, String a) {
super.name=n;
super.addr=a;
};
}//Son class end
class Daugther extends Father {
public String frirnd="절친";
public Daugther() {}
public Daugther(String n, String a) {
super(n, a); //부모 생성자 함수 호출
}
}//Daugther class end
① POJO(Plain Old Java Object) 방식
- new연산자 이용한 일반적인 객체 생성 방식
Father fa = new Father();
fa.disp();
Son son = new Son("손흥민", "영국");
son.disp();
Daugther dau = new Daugther("김연아", "한국");
dau.disp();
② 다형성을 이용한 객체 생성
- 자식클래스를 부모클래스에 대입 가능
- 부모클래스는 대입된 자식클래스의 모양으로 스스로를 변환
- 자식클래스에서 추가된 멤버는 다형성의 대상이 아님
Father father = new Son("개나리", "관철동");
father.disp();
father = new Daugther("진달래", "인사동");
father.disp();
System.out.println(father.name);
System.out.println(father.addr);
// father.friend 에러, 자식클래스에서 추가된 멤버
- 부모클래스도 자식클래스에 대입 가능
- 단, 데이터손실률이 발생할 수 있어 상속관계를 자세히 따져봐야 함
- 부모클래스는 자식클래스의 모양으로 형변환해야 함
Father papa = new Father();
Son sun = new Son();
// sun=papa; 에러, 부모가 자식에 들어갈 때는 강제 형변환(cast) 필요
sun=(Son)papa; // ClassCastException 발생
double a=3.4;
int b=(int)a; // 강제 형변환