- 자바의 정석 (기본편)을 참고했습니다.
- 복습을 위한 게시글입니다.
- 소스에 오타가 있을 수 있습니다. ^^:;
다형성의 정의와 특징
자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현했다.
조상 타입의 참조변수로 자손 타입의 인스턴스를 참조할 수 있다.
반대로 자손 타입의 참조변수로 조상 타입의 인스턴스는 참조할 수 없다 !
- 상속을 알고 있다면, 자식은 조상의 멤버와 같거나 혹은 더 많은 멤버를 가지고 있다는 것을 알고 있을 것이다.
즉, 조상이 가지고 있는 멤버의 개수보다 자식 타입의 참조변수가 사용할 수 있는 멤버 개수가 더 많기 때문에
자손 타입의 참조변수로는 조상 타입의 인스턴스를 참조할 수 없다.
다형성 예제 코드
class Ex7_23 {
public static void main(String args[]) {
// 보통 인스턴스 타입과 참조변수 타입이 일치시켜서 사용한다.
Tv t = new Tv();
SmartTv s = new SmartTv();
/* 조상의 참조변수로 자손의 인스턴스를 참조할 수 있다.
다만 이 경우에는 자손 SmartTv 인스턴스 멤버 중에서 Tv 클래스의 멤버만 사용할 수 있다.
즉, Tv 인스턴스 멤버가 아닌 text, caption()은 사용할 수 없다.
*/
Tv t = new SmartTv();
// 자손의 참조변수로 조상의 인스턴스를 참조할 순 없다. (컴파일 에러 발생)
SmartTv s = new Tv();
}
}
class Tv {
boolean power;
int channel;
void power() {
power = !power;
}
void channelUp() {
++channelUp;
}
void channelDown() {
--channelDown;
}
}
class SmartTv extends Tv {
String text;
void caption() {
// 내용 생략
}
}
매개변수의 다형성
메서드의 매개변수에도 다형성을 적용시킬 수 있다.
아래의 예제 코드에 적힌 buy() 메서드는 구매를 위한 메서드인데, 해당 메서드의 선언부에 조상 타입의 인스턴스를
적어주면, Tv, Computer 등 자손 타입의 인스턴스를 각각 적는 번거로움 없이 자손의 인스턴스를 받아 사용할 수 있다.
예제 코드
class Ex7_8 {
public static void main(String args[]) {
Tv t = new Tv();
Computer c = new Computer();
Buyer b = new Buyer();
b.buy(t);
b.buy(c);
System.out.println("현재 남은 돈은" + b.money + "만원입니다.");
System.out.println("현재 보너스포인트는" + b.bonusPoint + "점입니다.");
}
}
class Product {
int price;
int bonusPoint;
// 생성자
Product(int price) {
this.price = price;
bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product {
Tv() {
// 조상 Product의 생성자 호출 후 초기화
super(100);
}
public String toString() {
return "Tv";
}
}
class Computer extends Product {
Computer() {
// 조상 Product의 생성자 호출 후 초기화
super(200);
}
public String toString() {
return "Computer";
}
}
class Buyer {
int money = 1000;
int bonusPoint =0;
/* buy 메서드를 Tv, Computer 인스턴스마다 새로 생성하기 번거롭기 때문에, 조상의 인스턴스를
매개변수로 받도록 설정하면 Product를 상속받는 자식 인스턴스는 무엇이든 받을 수 있다.
*/
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
} else {
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"을/를 구입하셨습니다.");
}
}
}
/*
결과
Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
현재 남은 돈은 700만원입니다.
현재 보너스점수는 30점입니다.
*/
'JAVA' 카테고리의 다른 글
[JAVA 복습] 인터페이스(Interface) (0) | 2021.09.03 |
---|---|
[JAVA 복습] 추상 클래스(abstract class) (0) | 2021.09.02 |
[JAVA 복습] 캡슐화와 접근 제어자 (0) | 2021.09.02 |
[JAVA 복습] 참조변수 super와 조상의 생성자 super() (0) | 2021.09.02 |
[JAVA 복습] 상속에 대해 (0) | 2021.09.02 |