2022. 11. 22. 16:46ㆍJAVA
다형성(상속을 기본전제로 깔고감)
하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미.
부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조 할 수 있도록 구현
참조변수의 다형성
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 + " 점 입니다");
}
}
}
출력


'JAVA' 카테고리의 다른 글
| 2022.11.24 JAVA 21일차 인터페이스 (0) | 2022.11.24 |
|---|---|
| 2022.11.23 20일차 Vector클래스, 추상화클래스 (0) | 2022.11.23 |
| 2022.11.21 JAVA 18일차 오버라이딩, 접근제어자 (0) | 2022.11.22 |
| 2022.11.18 JAVA 17일차 객체지향 응용문제(상수) (0) | 2022.11.22 |
| 2022.11.17 JAVA 16일차 생성자2, 상속 (0) | 2022.11.22 |