쌍용교육(JAVA)/JAVA

쌍용교육 -JAVA 수업 10일차 Polymorphism다형성

구 승 2024. 4. 11. 17:24
package kr.s18.object.poly;
//부모클래스
class Parent{
	int a = 100;
}
//자식클래스
class Child extends Parent{
	int b = 200;
}
public class PolyMain01 {
	public static void main(String[] args) {
		Child ch =new Child();
		System.out.println(ch.a);
		System.out.println(ch.b);
		
		Parent p = ch; //자식클래스 타입에서 부모클래스(Parent)로 바꿈,
					  //업캐스팅, 자동적으로 형변환됨
		System.out.println(p.a);
		//호출범위를 벗어나서 호출 불가. 
		//System.out.println(p.b);//b는 호출이안됨.
		
		//Child ch2 = p; //에러남.
		Child ch2 = (Child)p; //부모클래스타입 -> 자식클래스 타입으로 형변환
							 //다운캐스팅,명시적으로 형변환
	
		System.out.println(ch2.a);
		System.out.println(ch2.b);
		
	}
}

100
200
100
100
200

package kr.s18.object.poly;

//부모클래스
class A {
	public void make() {
		System.out.println("make 메서드");
	}
}

class B extends A {
	public void play(){
		System.out.println("play 메서드");
	}
}
public class PolyMain02 {
	public static void main(String[] args) {
		B Bp = new B();
		Bp.make();
		Bp.play();
	
		A ap = Bp; //자식 클래스 타입에서 부모 클래스 타입으로 형변환(업 캐스팅)
		ap.make();
		//호출 범위를 벗어나서 호출 불가능
		//ap.play()
		
		B bp2 = (B)ap;//부모클래스 타입 -> 자식 클래스 타입
						//다운캐스팅, 명시적으로 형변환
		Bp.make();
		Bp.play();
	}
	
	
}

make 메서드
play 메서드
make 메서드
make 메서드
play 메서드

package kr.s18.object.poly;
//부모클래스
class Parent2{
	public void make() {
		System.out.println("부모클래스의 make");
	}
}

//자식클래스
class Child2 extends Parent2 {
	@Override
	public void make() {
		System.out.println("자식클래스의 make");
	}
}
public class PolyMain03 {
	/*
	 * 다형성(Polymorphism)
	 * 객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 
	 * 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써
	 * 다형성을 프로그램적으로 구현.
	 * 부모클래스타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하였음.  
	 */
	public static void main(String[] args) {
		Child2 ch = new Child2();
		ch.make();
		
		Parent2 p = ch; //자식 클래스 타입 -> 부모클래스타입 형변환
						//업캐스팅, 자동적으로 형변환
		//재정의된 메서드가 호출됨. 오버라이딩이라서 이름이 같은 것이라 자식 클래스로 나옴. 만약 오버라이딩이 아니면(이름이 다르면) 오류남
		p.make();
	}
}

자식클래스의 make
자식클래스의 make

package kr.s18.object.poly;
//부모클래스
class Product{
	int price; //제품 가격
	int bonusPoint; //제품 구매시 제공하는 보너스 점수
	//생성자
	public Product(int price) {
		this.price = price;
		bonusPoint = price/10;
	}
	public String getName() {
		return "상품";
	}
}
class Tv extends Product{
	//생성자
	public Tv() {
		super(100);
	}
	@Override
	public String getName() {
		return "TV";
	}
}
class Computer extends Product{
	//생성자
	public Computer() {
		super(200);
	}
	@Override
	public String getName() {
		return "컴퓨터";
	}
}
class Audio extends Product {
	public Audio() {
		super(300);
		
	}
	@Override
	public String getName() {
		return "오디오";
	}
}
//구매자
class Buyer {
	
	private int money =1000; //구매자 보유금액
	private int bonusPoint = 0;//제품구매시 누적 보너스 점수
	//구매 하기
	public void buy(Product p) {
		if(money < p.price) {
			System.out.println("잔액이 부족하여 물건을 구매할 수 없습니다.");
			return;
		}
		money -= p.price;
		bonusPoint += p.bonusPoint;
		
		System.out.println(p.getName()+"을/를 구입했습니다.");
		System.out.println("현재 남은 돈은"+ money +"만원입니다.");
		System.out.println("현재 보너스 점수는" + bonusPoint +"점입니다.");
	}
}
public class PolyMain04 {
	public static void main(String[] args) {
		//구매자 생성
		Buyer b = new Buyer();
		//제품생성
		Tv tv = new Tv();
		Computer com = new Computer();
		Audio au = new Audio();
		
		//제품 구매
		b.buy(tv); //Tv ->Product 업캐스팅 자동적으로 형변환
		b.buy(com); //Computer ->Product 업캐스팅 자동적으로 형변환
		b.buy(au);
	}
}

TV을/를 구입했습니다.
현재 남은 돈은900만원입니다.
현재 보너스 점수는10점입니다.
컴퓨터을/를 구입했습니다.
현재 남은 돈은700만원입니다.
현재 보너스 점수는30점입니다.
오디오을/를 구입했습니다.
현재 남은 돈은400만원입니다.
현재 보너스 점수는60점입니다.

package kr.s18.object.poly;

//부모클래스
class Parent3 {
	//object의 toString을 재정의
	@Override
	public String toString() {
		return "Parent 클래스";
	}
}
//자식클래스
class Child3 extends Parent3{
	@Override
	public String toString() {
		return "Child3 클래스";
	}
}
public class PolyMain05 {
	public static void main(String[] args) {
		Parent3 p = new Parent3();
		
		//컴파일시 오류는 없지만 실행시 오류가 발생. 자식클래스의 객체를 생성하지않는 실수를 함.
		//Child3 ch = (Child3)p;
		
		
		//instanceof 연산자는 상속관계일 때 사용(우리가 상속관계인걸 알고있는 상태에서만 사용해야됨. 상속관계인지 몰라서 알아내기 위해 사용하는 것은 아님)
		//좌측에 지정한 객체가 우측에 지정한 타입을 사용할 수 있는지 검증하는 연산자. 사용 가능하면 true,불가능하면 false
		//객체(p)			타입(Child3)
		if(p instanceof Child3) {
			Child3 ch2 = (Child3)p;
			System.out.println(ch2);
			System.out.println("-----------------------------");
			
		}else {
			System.out.println(p);
			System.out.println("+++++++++++++++++++++++++++++");
		}
	}
}

Parent 클래스
+++++++++++++++++++++++++++++

package kr.s18.object.poly;
//부모 클래스
class Car{
	String color;
	int door;
	public void drive() {
		System.out.println("운전하다~~");
	}
	public void stop() {
		System.out.println("정지하다");
	}
}
class FireEngine extends Car{
	public void water() {
		System.out.println("물을 뿌리다~~");
	}
}
public class PolyMain06 {
	public static void main(String[] args) {
		FireEngine fe = new FireEngine();
		
		if (fe instanceof FireEngine) {
			System.out.println("FireEngine 객체입니다");
		}
		if (fe instanceof Car) {
			System.out.println("Car 객체입니다");
		}
		if (fe instanceof Object) {
			System.out.println("Object 객체입니다.");
		}
	}
}

FireEngine 객체입니다
Car 객체입니다
Object 객체입니다.