⁂ Java/: 기본 익히기

[JAVA] #8-2 다형성(Polymorphism)

김갱환 2022. 9. 15. 12:26

1. 다형성 이해해보기

 

 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.

 예를 들어 자동차가 타이어를 사용하는 방법은 동일하지만 어떤 타이어를 사용하는지에 따라 성능이 바뀐다.

 여기서 타이어를 부모 클래스, 그리고 타이어의 종류들을 각각 자식 클래스로 생각하면 된다.

 

 타이어 = new 금호 타이어

 타이어 = new 한국 타이어

 와 같은 모습인 것이다.

 

 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있다.

 다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나다.

 

 이번엔 코드로 예를 들어보자.

class Parent { ... }

class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용
Child ch = new Child();   // 허용
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생.

 

 지금까지 우리는 클래스 타입이 같은 것들만 인스턴스를 생성해왔다(Parent pa = new Parent();와 같이).

 하지만 위의 코드 처럼 부모 클래스 타입의 참조변수가 자식 클래스 타입의 인스턴스를 참조할 수 있다.

 이것이 바로 다형성이다.

 (반대는 허용되지 않는다)

 

 이제 다형성을 이용해 객체를 생성하는 방법을 더 자세히 알아보자.

 

 

2. 다형성으로 객체 생성하기

 

클래스 코드

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

 

 

1) 일반적인 방식으로 객체 생성하기

 일반적인 방식으로 객체를 생성한다는 것은 new 연산자를 사용한다는 뜻이다.

 이런 방식을 POJO(Plain Old Java Object) 방식이라 부른다.

 

Father fa = new Father();
fa.disp();

Son son = new Son("손흥민", "영국");
son.disp();

Daughter da = new Daughter("김연아", "한국");
da.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) 부모 클래스를 자식 클래스에 대입하기

 부모 클래스도 자식 클래스에 대입 가능하다. 단 자식 클래스의 모양으로 형변환 해야 한다.

Father father = new Father();
Son son = new Son();

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

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

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

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

obj=new Father();
System.out.println(obj.toString());