Backend/JAVA_Basic

20. JAVA, 다형성(polymorphism)

개발개발빈이 2022. 6. 4. 11:05

  다형성(polymorphism)

    - 객체지향 프로그래밍의 특징 중 하나 (참고 : OOP의 특징)

    - 하나의 객체가 여러 가지 타입을 가질 수 있는 것

    - 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현

    - 다형성의 예 : Calendar는 GregorianCalendar()의 부모임(아래 코드 및 그림 참고)

                            new연산자를 이용해 메모리를 할당할 때는 좌우의 클래스가 같아야 하지만

                            밀접도가 높은 상속관계에서는 자식 클래스를 부모 클래스가 참조하는 것이 가능

                            → 형변환이 매우 용이해짐

Calendar now = new Calendar();           //일반적인 경우
Calendar now = new GregorianCalendar();  //다형성(polymorphism)

출처 : https://docs.oracle.com/javase/8/docs/api/

 

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;   // 강제 형변환