2022.11.22 JAVA 19일차 다형성

2022. 11. 22. 16:46JAVA

다형성(상속을 기본전제로 깔고감)

하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미.
부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조 할 수 있도록 구현

참조변수의 다형성

class Parent{ . . . }
class Child extends Parent{ . . . }

Parent pa = new Parent(); //허용
Child ch = new Child(); //허용
Parent pc = new Child();//허용
Child cp = new Parent(); //오류발생
상속을 통해 확장될수 있으나 축소될수는 없음.
자식 클래스에서 사용할 수 있는 멤버의 개수가 언제나 부모 클래스와 같거나 많게 됨. 

예제)

class A {

	void methodA() {
		System.out.println("methodA()");
	}
}

class B extends A {

	void methodB() {
		System.out.println("methodB()");
	}

}

public class MySample1122 {

	public static void main(String[] args) {

		A obj = new B();

		obj.methodA(); // 가능
//		obj.methodB(); //불가능 

		A objA = new A(); // 가능
		B objB = new B();// 가능

//		B objError = new A(); //불가능

	}

}

Parent p = new Child(); //선언시 

p 는 Child클래스 안에있는 메서드나 인스턴스변수를 사용 불가능 하지만
오버라이딩이 된 메서드가 있을 시 자식에있는 메서드를 실행한다

예제)

 

class Animal2  //extends Object 생략
{
	void breath()
	{
		System.out.println("숨쉬기");
	}
}

class Lion2 extends Animal2
{
	public String toString()		//오버라이딩
	{
		return "사자";
	}
}

class Rabbit extends Animal2
{
	public String toString()		//오버라이딩
	{
		return "토끼";
	}
}

class Monkey extends Animal2
{
	public String toString()		//오버라이딩
	{
		return "원숭이";
	}
}

class ZooKeeper
{
	void feed(Animal2 animal)
	{
		System.out.println(animal + "에게 먹이주기");
	}
	
	
}


public class MySample1122_3 {
	public static void main(String[] args) {
		//다형성3
		
		Animal2 lion = new Lion2();
		ZooKeeper j = new ZooKeeper();
		j.feed(lion);
		
		Animal2 rabbit = new Rabbit();
		j.feed(rabbit);
		
		Animal2 monkey = new Monkey();
		j.feed(monkey);
		
	}
}

출력

instanceof 연산자 : 참조변수가 참조하고 있는 인스턴스 실제타입 확인
문법) 참조변수 instacneof 클래스 이름 -> true,false 리턴

예제)

class Parent3 
{
}

class Child3 extends Parent3 
{
}

class Brother extends Parent3 
{
}

public class MySample1122_4 {
	public static void main(String[] args) {
		// instanceof 연산 (true/false)

		Parent3 p = new Parent3();

		System.out.println(p instanceof Object); 	// true
		System.out.println(p instanceof Parent3); 	// true
		System.out.println(p instanceof Child3); 		// false
		
		Parent3 p2 = new Child3();
		System.out.println(p2 instanceof Object);	//true
		System.out.println(p2 instanceof Parent3);	//true
		System.out.println(p2 instanceof Child3);	//true
		
	}
}

출력

매개변수의 다형성

예)
class Parent{ . . . }
class Child extends Parent{ . . . }
class Method{
void method(Parent p){ . . . }
}
public class Main{
    public static void main(String[] args){
    Method m = new Merhod();
    m.method(new Child());        //가능하다
    }
}

 

예제)

import java.util.Scanner;

class Product2
{
	int price;												//제품가격
	int bounsPoint;									//제품구매시 제공 보너스 점수
	
	Product2(int price)
	{
		this.price = price;
		bounsPoint = (int)(price/10.0);			//제품가격의 10프로 적립
	}
}

class Tv3 extends Product2
{
	Tv3()
	{
		super(250);		//Tv가격
	}
	
	public String toString()
	{
		return "Tv";
	}
}

class Computer2 extends Product2
{
	Computer2()
	{
		super(200);		//컴퓨터가격
	}
	
	public String toString()
	{
		return "컴퓨터";
	}
}

class Buyer
{
	int money;				//고객별 보유금액
	int bounsPoint = 0;				//보너스 점수
	boolean bal = false;
	Buyer(int money)
	{
		this.money = money;
	}
	
	void buy(Product2 p)
	{
		if(money < p.price)
		{
			System.out.println("잔액이 부족합니다.");
			bal = true;
			return;
		}
		
		money -= p.price;
		bounsPoint += p.bounsPoint;
		System.out.println(p + "을(를) 구매하셨습니다.");
		
	}
}

public class MySample1122_6 {

	public static void main(String[] args) {
		//매개변수의 다향성
		Scanner sc = new Scanner(System.in);
		Buyer b = new Buyer(1000);
		Product2 p = null;
		
		while(true)
		{
			System.out.print("구매할 물품을 선택하세요 \nTV\n컴퓨터");
			String a = sc.next();
			
			if(a.equals("TV"))
			{
				p = new Tv3();
			}
			else if(a.equals("컴퓨터"))
			{
				p = new Computer2();
			}
			else
			{
				System.out.println("잘못된 입력값");
				continue;
			}
			b.buy(p);
			
			if(b.bal)
				break;
			
			System.out.println("현재 남은돈은 " + b.money + " 만원 입니다.");
			System.out.println("보너스 점수는 " + b.bounsPoint + " 점 입니다");
		}

	}

}

 

출력