다형성이란?
다형성이란 여러가지 형태를 가질 수 있는 능력을 뜻하며,
자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현한다. 다시 말해, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 한다.
다형성의 특징
-조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.
그렇게 되면 조상클래스 타입의 참조변수로 자손클래스에 있는 멤버들에 접근할 수 있다.
단, 조상클래스에서 상속받은 멤버들만 접근할 수 있고, 자손클래스에서 만들어진 멤버들에는
접근할 수 없다.
-자손타입의 참조변수로 조상타입의 인스턴스는 참조할 수 없다.
-반드시 상속관계가 이뤄져야 한다.
다형성은 어떤 경우에 사용하는가?
-하나의 참조변수로 여러타입의 객체를 참조할 때.
-여러(자손)클래스의 객체들을 하나의(조상)클래스의 배열로 묶어 다룰 경우.
-하나의 매개변수로 여러 타입의 참조변수를 받을 경우.
다형성을 사용함으로써 생기는 장점
-좀 더 객체지향적인 프로그래밍을 짤 수 있다.
-여러 클래스들을 하나의 배열로 묶어 다룰 수 있기 때문에 반복문등을 사용하는등
편리하게 사용할 수 있다. 가령 클래스안의 특정 수들을 더하고자 할 경우 객체마다 별도로
계산을 하려면 복잡하지만 하나의 배열로 묶으면 반복문을 사용하면 훨씬 짧은 코드로
쉽게 구현할 수 있다.
-객체의 참조변수를 매개변수로 받을 경우, 객체의 타입마다 그 타입에 맞춰 매개변수를 생성하게 되면 매개변수의 개수도 계속 늘어나게 되어 코드가 복잡해지고 유지보수에도 어려움이 따르지만 조상클래스 타입의 참조변수 하나를 매개변수로 사용하게 되면 그 메서드 하나만으로
구현을 할 수가 있어 코드가 훨씬 간단해지고 유지보수도 수월하다.
다형성은 어떻게 사용하는가?
- 매개변수에 다형성을 적용하는 경우
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매 시 제공하는 보너스점수
}
class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {}
class Buyer { // 고객, 물건을 사는 사람
int money = 1000; // 소유금액
int bonusPoint = 0; // 보너스점수
void buy(Product p) { //이렇게 조상클래스 하나를 매게변수로 두면
money = money - p.price; //어떤 (자손)클래스의 참조변수라도 다 받을 수가 있다.
bonusPoint = bonusPoint + p.bonusPoint; //여기서 p 는 들어오는 참조변수마다 달라진다.
} //예를 들어 Tv의 참조변수가 들어오면 Tv에 있는 멤버들을,
} //Audio의 참조변수가 들어오면 Audio에 있는 멤버들을 각각 달리 접근하게 된다.
아래는 실행 예 이다.
public class buyerTest{
publc static void main( String[] args ){
Buyer b = new Buyer();
Tv t = new Tv();
Computer c = new Computer();
b.buy(t);
b.buy(c);
}
}
- 여러 개의 객체를 배열로 다룰 수 있다.
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
class Buyer {
int money = 1000;
int bonusPoint = 0;
Product item[] = new Product[10]; // 구입한 제품을 저장하기 위한 배열
int i =0; // Product배열 item에 사용될 index
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살수 없습니다.");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
item[i++] = p; // 구입한 제품들을 하나 배열로 다룰 수 있다.
System.out.println(p + "을/를 구입하셨습니다.");
}
}
참고로 다형성을 비롯한 자바 객체지향에 관한 내용 대부분은 [플래쉬로배우는 자바] 참조 하였음.