Kim VamPa

[Java]다형성(polymorphism)이란? 본문

공부/자바

[Java]다형성(polymorphism)이란?

Kim VamPa 2020. 4. 24. 09:04
728x90
반응형

개인 공부 후 자료를 남기기 위한 목적이기에 내용 상에 오류가 있을 수 있습니다.


다형성

다형성이란 '여러가지 형태를 가질 수 있는 능력'을 의미합니다. 자바에서는 한 타입의 참조변수로 여러타입의 객체를 참조 할 수 있게 함으로써 다형성을 구현하였고, 이로인해 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작 할 수 있습니다. 클래스의 예를 통해 다형성을 살펴보겠습니다.

 

 

클래스와 다형성

 자바에서 클래스를 사용하기 위해서는 '참조 변수를 선언하여 클래스의 객체(인스턴스)를 생성(인스턴스화)후 객체의 주소를 참조변수에 저장' 합니다. 보통의 경우는 객체(인스턴스)의 타입과 참조변수의 타입이 일치합니다. 

 

그림 1

public class Example {

	public static void main(String[] args) {

		// 참조변수 타입과 객체의 타입 일치
		Parent p = new Parent();

	}

}

//클래스 Parent
class Parent {
	
}

 

  보통 위와같이 참조변수 타입과 객체 타입이 일치하지만, 만약 "상속"관계에 있는 두개의 클래스가 있을 때 '조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조'하도록 할 수 있습니다.

 

public class Example{

	public static void main(String[] args) {

		// 객체의 타입과 참조변수 타입이 일치
		Parent p = new Parent();
		Child1 c1 = new Child1();
		
		// 객체의 타입과 참조변수 타입이 불일치
		Parent P = new Child1();
		
	}

}

//클래스 Parent
class Parent {
	
}

// 클래스 Child1(Parent 클래스를 상속)
class Child1 extends Parent{
	
}

 

 위의코드에서 "Parent P = new Child1();" 를 보시면 참조변수 타입과 객체의 타입이 다름에도 에러가 나지 않습니다.  그렇다면 상속관계가 아닌 두클래스 또한 참조변수 타입과 객체의 타입이 다를 수 있을까요? 답은 '안된다 입니다'. 상속관계에 있지 않은 두개의 클래스를 참조변수 타입과 객체의 타입에 사용한다면 다음과 같이 에러가 나게 됩니다.

 

그림 2

 

 

 또 한가지 주의 해야 할 점은 '조상타입의 참조변수로 자손타입의 인스턴스를 참조 할 수 있지만', 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조 할 수 없다'는 점입니다. 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 경우 다음과 같이 에러가납니다.

 

그림 3

 

  지금까지의 것들을 정리해보겠습니다. 참조변수타입과 참조변수가 참조하는 인스턴스 타입이 다를 수있습니다. 단, 참조변수 타입으로 사용되는 클래스와 인스턴스로 사용되는 클래스가 상속관계일때만 가능합니다. 그리고 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수는 잇지만, 자손타입의 참조변수로 조상타입의 인스턴스를 참조할수 없습니다.

 

참조변수 타입에따라 사용할 수 있는 멤버의 개수 변화

 이에더해서 한가지 좀 더 주의 깊게 보아야 하는 것은 '참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다'는 것입니다. 예를 통해서 살표 보겠습니다.

 

 2개의 클래스가 있습니다. Tv클래스는 2개의 속성(power, channel)과 3개의 기능(power, channelUp, channelDown)이 있습니다. CaptionTv 클래스는 Tv클래스를 상속 받았고 1개의 속성(text)과 1개의 기능(caption)이 잇습니다. 

class Tv{
	
	boolean power;
	int channel;
	
	void power() {
		power = !power;
	}
	void channelUp() {
		++channel;
	}
	void channelDown() {
		--channel;
	}
	
}

class CaptionTv extends Tv{
	
	String text;
	void caption() {
		
	}
}

 

두개의 클래스의 관계를 시각화 하면 다음과 같습니다.

 

그림 4

 

 

 

Tv t = new Tv();

 Tv타입의 참조변수 Tv인스턴스를 사용할 경우 5개의 멤버를 사용 할 수 있습니다.

-power / channel / power() / channelUp() / channelDown()

 

CaptionTv c = new CaptionTv();

CaptionTv의 참조변수와 CaptionTv 인스턴스를 사용할 경우는 7개의 멤버를 사용 할 수 있습니다.

-power / channel / text / power() / channelUp() / channelDown() / Caption()

 

Tv t = new CaptionTv();

그렇다면 조상클래스인 Tv타입의 참조변수를 자손타입인CaptionTv 인스턴스를 참조할 경우 몇개의 멤버가 사용 가능할까요? 5개의 멤버만 사용이 가능합니다.

 -power / channel / power() / channelUp() / channelDown()

 CaptionTv 인스턴스를 사용하지만 타입이 Tv이기때문에 CaptionTv인스턴스 멤버들 중 Tv타입에 있는 멤버들만사용이 가능합니다.

 

그림 5

 

 

요약

  • 다형성이란 '여러가지 형태를 가질 수 잇는 능력'을 말합니다.
  • 자바에서는 한 타입의 참조변수로 여러타입의 객체를 참조 할수 있게 함으로써 다형성을 구현하였습니다. 
  • 참조변수 타입과 참조변수가 참조 하는 인스턴스 타입은 다를 수 있습니다. 단, 참조변수 타입으로 사용되는 클래스와 인스턴스로 사용되는 클래스가 상속관계일때만 가능합니다.
  • 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수는 있지만, 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없습니다.
  • 참조변수의 타입에 따라 참조되는 인스턴스의 멤버의 개수가 달라집니다.

 

Reference

 

Date

  • 2020.04.24

 

 

728x90
반응형
Comments