🌱 오늘의 주제 : 다형성(polymorphism)
🌱 다형성(polymorphism)
- 다형성 : 여러 가지 형태를 가질 수 있는 능력. 즉, 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것.
- 클래스가 서로 상속관계에 있을 경우, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 한 것.
조상타입의 참조변수로 자손타입의 객체를 참조 할 수 있다.
반대로 자손타입의 참조변수로 조상타입의 객체를 참조할 수는 없다.
Tv t = new SmartTv( ); // 타입 불일치. 조상 타입의 참조변수로 자손 객체를 참조. (TV - 조상, SmartTv - 자손)
SmartTv s = new Tv( ); // 에러. 자손 타입의 참조변수로 조상 객체를 잠조했기 때문.
🌱 매개변수의 다형성(polymorphism)
package polymorphism;
//매개변수의 다형성
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매 시 제공하는 보너스점수
Product(int price) {
this.price = price;
bonusPoint = (int)(price/10.0); //보너스점수는 제품가격의 10%
}
}
class Tv1 extends Product {
Tv1() {
// 조상 클래스의 생성자 Product(int price)를 호출한다.
super(100); // Tv의 가격을 100만원으로 한다.
}
public String toString() { // Object클래스의 toString()을 오버라이딩한다.
return "Tv";
}
}
class Computer extends Product {
Computer() {
super(200);
}
public String toString() {
return "Computer";
}
}
class Buyer {
int money = 1000;
int bonusPoint = 0;
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p.toString() + "을/를 구입하셨습니다.");
}
}
package polymorphism;
class Ex7_8 {
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new Tv1()); // 이 코드를 줄여씀. Product p = new Tv1(); / b.buy(p);
b.buy(new Computer());
System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");
System.out.println("현재 보너스점수는 " + b.bonusPoint + "점입니다.");
}
}
------------------------
Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
현재 남은 돈은 700만원입니다.
현재 보너스점수는 30점입니다.
🌱 여러 종류의 객체를 배열로 다루기
package polymorphism;
// 여러 종류의 객체를 배열로 다루기 예제
public class Product2 {
int price;
int bonusPoint;
Product2(int price) {
this.price = price;
bonusPoint = (int)(price/10.0);
}
Product2(){ // 기본 생성자
}
}
class Tv2 extends Product2 {
Tv2() {
super(100); // 조상클래스의 생성자 Product2(int price)를 호출한다.
}
public String toString() {
return "Tv";
}
}
class Computer2 extends Product2{
Computer2() {
super(200);
}
public String toString() {
return "Computer";
}
}
class Audio2 extends Product2 {
Audio2() {
super(50);
}
public String toString() {
return "Audio";
}
}
class Buyer2{
int money = 1000;
int bonusPoint = 0;
Product2[] cart = new Product2[10]; // 구입할 제품을 저장하기 위한 배열
int i = 0; // Product 배열에 사용될 카운터
void buy(Product2 p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
cart[i++] = p;
System.out.println(p + "을/를 구입하셨습니다.");
}
void summary() {
int sum = 0;
String itemList = "";
for(int i = 0; i < cart.length; i++) { // 반복문을 이용해서 구입한 물품의 총 가격과 목록을 만든다.
if(cart[i] == null)
break;
sum += cart[i].price;
itemList += cart[i] + ",";
}
System.out.println("구입하신 물품의 총 금액은 " + sum + "만원입니다.");
System.out.println("구입하신 제품은 " + itemList + "입니다.");
}
}
package polymorphism;
public class Ex7_9 {
public static void main(String[] args) {
// 여러 종류의 객체를 배열로 다루기 예제
Buyer2 b = new Buyer2();
b.buy(new Tv2());
b.buy(new Computer2());
b.buy(new Audio2());
b.summary();
}
}
---------------------------
Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
Audio을/를 구입하셨습니다.
구입하신 물품의 총 금액은 350만원입니다.
구입하신 제품은 Tv,Computer,Audio,입니다.
'Java' 카테고리의 다른 글
Java - 추상 클래스(abstract class), 추상메서드(abstract method) (0) | 2023.01.29 |
---|---|
Java - 참조변수의 형변환 (0) | 2023.01.28 |
Java - super( ), super, 오버라이딩 (0) | 2023.01.25 |
Java - 클래스 간의 관계 - 포함관계 (0) | 2023.01.25 |
Java - 생성자에서 다른 생성자 호출하기 - this ( ) (0) | 2023.01.24 |