웹개발 교육/Java

[35일] Java (37) - 다형성

ewok 2022. 9. 15. 12:52

다형성은 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질이다.  상속 관계에서 다형성을 보면, 부모 클래스의 관점에서 형태가 여러 가지이며 클래스들 간의 형 변환이 용이하다.

 

다형성은 마치 자동차가 타이어를 사용하는 방법은 동일하지만, 어떤 브랜드의 타이어를 사용하냐에 따라 성능이 달라질 수 있는 것과 비슷하다.

 

Calendar cal = new GregorianCalendar();
Number num = new Integer(5);

위의 두 코드는 다형성의 예이다. cal은 GregorianCalendar 객체를 참조하지만 그 형태는 Calendar이다. num은 Integer 객체를 참조하지만 그 형태는 Number이다. 이를 자동 타입 변환이라 한다.

 

이러한 클래스의 변환은 상속 관계에서 발생한다. 자식 클래스는 부모 클래스 타입으로 변환이 가능하다.

 

실습을 위해 클래스를 만들었다.

package oop0915;

import java.util.Calendar;
import java.util.GregorianCalendar;

class Father {
	//멤버변수 field
	public String name = "아버지";
	public String addr = "주소";
	
	//생성자함수 constructor
	public Father() {}
	public Father(String name, String addr) {
		this.name = name;
		this.addr = addr;
	}//end
	
	//멤버함수 method
	public void disp() {
		System.out.println(this.name);
		System.out.println(this.addr);
	}//disp() end
	
}//class end

class Son extends Father {
	public Son() {}
	public Son(String n, String a) {
		super.name = n;
		super.addr = a;
	}//end
}//class end

class Daughter extends Father {
	String friend = "절친";
	public Daughter() {}
	public Daughter(String n, String a) {
		super(n, a); //부모생성자 함수 호출
	}//end
}//class end

public class Test03_poly {

	public static void main(String[] args) {
		
		//1)일반적인 방식으로 객체 생성
		//-> new 연산자
		//-> POJO(Plain Old Java Object) 방식
		/*
		Father fa = new Father();
		fa.disp();
		
		Son son = new Son("손흥민", "영국");
		son.disp();
		
		Daughter dau = new Daughter("김연아", "한국");
		dau.disp();
		*/
		////////////////////////////////////////
		
		//2)다형성을 이용한 객체 생성
		//-> 자식 클래스가 부모 클래스에 대입 가능하다 
		
		Father fa = new Son("개나리", "역삼동");
		fa.disp();
		
		fa = new Daughter("진달래", "서초동");
		fa.disp();
		
		System.out.println(fa.name);
		System.out.println(fa.addr);
		//에러. 자식클래스에서 추가된 멤버는 다형성의 대상이 아니다
		//System.out.println(fa.friend);
		
		//3)
		
	}//main() end

}//class end

부모 타입으로 변환이 된 이후에는 부모 클래스에서 선언된 필드와 메소드만 접근이 가능하다. 따라서 fa.friend를 출력하려고 하면 에러가 발생한다. friend라는 필드는 Daughter 클래스에서만 선언이 되어고 Father 클래스에는 없기 때문이다.

 

메소드의 경우에는 자식 클래스에서 오버라이딩이 되었다면 자식 클래스의 메소드가 대신 호출된다.

 

※ 참고

//부모클래스도 자식클래스에 대입가능하다
//->단, 자식 클래스의 모양으로 형변환해야 한다
Father father = new Father();
Son son = new Son();

father = son;
son = (Son) father;  //Exception이 발생할 수도 있음

Object obj = new Integer(5);  //다형성. 자식클래스가 부모클래스에 대입

Integer inte = (Integer) obj;  //다형성
                               //부모클래스도 자식클래스에 대입가능하지만 자식클래스의 모습으로 변환해야 함

double a = 3.4;
int b = (int)a; //강제 형변환