* '상속'에 대한 이해를 바탕으로 학습이뤄져야 함
- 다형성 (Polymorphism)
: 조상타입의 참조변수로 자손타입의 객체(자손의 인스턴스)를 가리키는 것
( 자손타입의 참조변수로 조상 타입객체 가리킴 --> X)
- 장점,
① 다형적 매개변수 (조상의 참조변수로 자손타입객체 가리킬 수 있으며, 참조변수의 형변환으로 사용가능한 멤버변수 수 조절가능)
② 하나의 배열로 여러 종류 객체 다룰 수 있다.
public class Polymorphism1 {
public static void main(String[] args) {
Notebook n = null;
Mac m = new Mac();
Mac m2 =null;
System.out.println(m.color); //null
m.OS(); //"iOS"
n = (Notebook)m; //(=> n = m;) 자손타입 m이 조상타입 n으로 형변환할 때는 생략가능!
m2 = (Mac)n; //조상타입 n이 자손타입의 m2로 가기 때문에 형변환 꼭 명시!
System.out.println(m2.model); //"APPLE"
m2.OS(); //"iOS"
Gram g = null;
//g = (Gram)m; //자손끼리 형변환 불가능
}
}
class Notebook {
String color;
boolean power = false;
void power() {
power = !power;
}
}
class Mac extends Notebook{
String model ="APPLE";
void OS() {
System.out.println("iOS");
}
}
class Gram extends Notebook {
String model = "LG";
void OS () {
System.out.println("Window");
}
}
그림으로 살펴보면,
- 참조변수와 인스턴스의 연결
:메서드의 경우 조상클래스의 메서드를 자손클래스의 메서드와 일치할 경우 오버라이딩 해서 호출되지만, 멤버변수(iv)의 경우 참조변수 타입에 따라 달라진다.
public class Ploymorphism2
public static void main(String[] args) {
Notebook2 n = new Mac2();
Mac2 m = new Mac2();
System.out.println("n.color: " + n.color); //"n.color : black"
n.method(); //"Mac"
System.out.println("m.color: " + m.color); //"m.color : silver"
m.method(); //"Mac"
}
}
class Notebook2 {
String color = "black";
boolean power = false;
void method() {
System.out.println("Notebook");
}
}
class Mac2 extends Notebook2{
String color = "silver"; //조상과 멤버변수이름 중복
String model ="APPLE";
void method() { //조상과 메소드이름 중복
System.out.println("Mac");
}
}
그림으로 살펴보면,
- 매개변수의 다형성 예제 코드 (자바의정석 예제 ex7_21 참고)
: 조상 참조형 매개변수는 메서드 호출시. 자신과 같은타입, 자손타입의 인스턴스를 넘겨줄 수 있다.
public class Polymorphism3 {
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new Computer()); // Product p = new Computer()
b.buy(new Tv()); // Product p = new Tv()
System.out.println("현재 남은 돈 : " + b.money);
System.out.println("현재 적립 보너스 : " + b.bonus);
}
}
class Product {
int price;
int bonus;
Product(int price) {
this.price = price;
bonus = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100); //tv가격 100만원
}
public String toString() { return "Tv"; } //Object의 toString() 오버라이딩
}
class Computer extends Product{
Computer(){
super(200); //Computer가격 200만원
}
public String toString() { return "Computer"; }
}
class Buyer {
int money = 1000; //소비자가 가진 돈 1000만원
int bonus = 0;
void buy(Product p ) {
if (money < p.price) {
System.out.println("잔액부족");
return;
}
money = money - p.price;
bonus = bonus + p.bonus;
System.out.println(p +"을 구매함");
}
}
- 배열에 여러 종류 객체 저장 예제(자바의 정석 예제 Ex7_22 참고)
public class Ex7_23_Polymorphism4 {
public static void main(String[] args) {
Buyer2 b = new Buyer2();
b.buy(new Tv2());
b.buy(new Computer2());
b.buy(new Audio2());
b.summary();
}
}
class Product2 {
int price;
int bonus;
Product2(int price) {
this.price = price;
bonus = (int)(price/10.0);
}
Product2 (){
}
}
class Tv2 extends Product2{
Tv2(){
super(100);
}
public String toString() { return "Tv2"; }
}
class Computer2 extends Product2{
Computer2(){
super(200);
}
public String toString() { return "Computer2"; }
}
class Audio2 extends Product2{
Audio2(){
super(50);
}
public String toString() { return "Audio2"; }
}
class Buyer2 {
int money = 1000;
int bonus = 0;
Product2 [] item = new Product2[10];
int i =0;
void buy(Product2 p) {
if(money < p.price) {
System.out.println("잔액부족함");
return;
}
money -= p.price;
bonus += bonus;
item[i++] = p;
System.out.println(p.toString()+ "를 구입함");
}
void summary() {
int sum = 0;
String itemList = " ";
//구매 총구입, 구입한 물건 출력
for(int i = 0; i<item.length; i++) {
if(item[i]==null) break;
sum += item[i].price;
itemList += item[i].toString() + ",";
}
System.out.println("구입한 총 금액은 " + sum+ "만원");
System.out.println("구입한 제품은" + itemList);
}
}
그림으로 살펴보면, 조상타입 Product2 [] item = new Product2[10]; 배열에
조상을 가진 ,Tv2(), Computer2(), Audio2() 객체를 넣어 하나의 배열로 다룰 수 있다.
참고 : 자바의정석(남궁성)
'JAVA' 카테고리의 다른 글
JAVA_인터페이스 (0) | 2021.08.02 |
---|---|
JAVA_추상화 (0) | 2021.08.01 |
JAVA_제어자 (0) | 2021.07.31 |
JAVA_Pakage와 import (0) | 2021.07.31 |
JAVA_생성자(Constructor) (0) | 2021.07.31 |
댓글