관리 메뉴

Frog is cry

타입변환과다형성 본문

JAVA/복습

타입변환과다형성

Frog is cry 2020. 7. 22. 19:56

ex01

package 타입변환과다형성.ex01;

public class A {

}
package 타입변환과다형성.ex01;

public class B extends A{

}
package 타입변환과다형성.ex01;

public class C extends A{

}
package 타입변환과다형성.ex01;

public class D extends B{

}
package 타입변환과다형성.ex01;

public class E extends C{
	
}
package 타입변환과다형성.ex01;

public class Promotion_Ex {
	public static void main(String[] args) {
		B b = new B();
		C c = new C();
		D d = new D();
		E e = new E();
		
		A a1 = b;
		A a2 = c;
		A a3 = d;
		A a4 = e;

		B b1 = d;
		C c1 = e;
		
//		B b2 = e; e객체는 B와 전혀 연관이 없기에 변환안됨
//		C c2 = d; d객체는 C와 전혀 연관이 없기에 변환안됨
		
		
	}
}

ex02

package 타입변환과다형성.ex02;

public class Child_Ex {
	
	public static void main(String[] args) {
		
	
	Child child = new Child();
	
	Parent parent = child;	// 부모것의 parent를 불러와 child 값 대입
	
	parent.method1();	
	// 부모한텐 있고 자식한텐 없어 부모것을 불러옴
	parent.method2();	
	// 부모,자식 둘다 가지고 있지만 자식 것을 불러옴. 매우중요!!
	// parent.method3();	
	// 부모에게 method3이 없어 불러올수가 없음
	
	}
}
package 타입변환과다형성.ex02;

public class Child extends Parent{

	@Override
	public void method2() {
		System.out.println("Child-method2(자식)");
	}
	
	public void method3() {
		System.out.println("Child-method3(자식)");
	}
	
}
package 타입변환과다형성.ex02;

public class Parent {
	public void method1() {
		System.out.println("Child-method1(부모)");
	}

	public void method2() {
		System.out.println("Child-method2(부모)");
	}
}

ex03

package 타입변환과다형성.ex03;

public class Car {
	//필드
	Tire frontLeftTire = new Tire("앞왼쪽", 6);
	Tire frontRightTire = new Tire("앞오른쪽", 2);
	Tire backLeftTire = new Tire("뒤왼쪽", 3);
	Tire backRightTire = new Tire("뒤오른쪽", 4);
	
	//생성자
	
	//메소드
	int run() {
		System.out.println("[자동차가 달립니다.]");
		if(frontLeftTire.roll() == false) {stop(); return 1;};
		if(frontRightTire.roll() == false) {stop(); return 2;};
		if(backLeftTire.roll() == false) {stop(); return 3;};
		if(backRightTire.roll() == false) {stop(); return 4;};
		return 0;
	}
	
	void stop() {
		System.out.println("[자동차가 멈춥니다.]");
	}
}
package 타입변환과다형성.ex03;

public class Car_Ex {
	public static void main(String[] args) {
	
		Car car = new Car();
		
		for (int i = 0; i <=5; i++) {
			int problemlocation = car.run();
			switch(problemlocation) {
			case 1:
				System.out.println("앞 왼쪽 HankkokTire로 교체");
				car.frontLeftTire = new HankookTire("앞 왼쪽", 15);	
				// 자식 객체를 부모타입에 넣어 타입변환을 함
				break;
			case 2:
				System.out.println("앞 오른쪽 KumhoTire로 교체");
				car.frontRightTire = new KumhoTire("앞 오른쪽", 13);	
				// 자식 객체를 부모타입에 넣어 타입변환을 함
				break;
			case 3:
				System.out.println("뒤 왼쪽 HankookTire로 교체");
				car.backLeftTire = new HankookTire("뒤 왼쪽", 14);	
				// 자식 객체를 부모타입에 넣어 타입변환을 함
				break;
			case 4:
				System.out.println("뒤 오른쪽 KumhoTire로 교체");
				car.backRightTire = new HankookTire("뒤 오른쪽", 17);	
				// 자식 객체를 부모타입에 넣어 타입변환을 함
				break;
			}
			System.out.println("-----------------");
		}
	}
}
package 타입변환과다형성.ex03;

public class Tire {
	//필드
	public int maxRotation;			// 최대 회전수(최대 수명)
	public int accumulatedRotation;	// 누적 회전수
	public String location;			// 타이어의 위치
	
	//생성자
	public Tire(String location, int maxRotation) {
		this.location = location;
		this.maxRotation = maxRotation;
	}
	
	//메소드
	public boolean roll() {	// 회전할 수 있다면 true 할수 없다면 false를 해서 종료 시키기 위해 boolean을 사용함
		++accumulatedRotation;
		if(accumulatedRotation<maxRotation) {
			System.out.println(location + "Tire 수명 : " + (maxRotation - accumulatedRotation) + "회");
			return true;
		}else {
			System.out.println("*** " + location + "Tire 펑크 ***");
			return false;
		}
	}
}
package 타입변환과다형성.ex03;

public class KumhoTire extends Tire{
	//필드
	//생성자
	public KumhoTire(String location, int maxRocation) {
		super(location, maxRocation); 
	}
	//메소드
	@Override
	public boolean roll() {
	++accumulatedRotation;
	if(accumulatedRotation<maxRotation) {
		System.out.println(location + "KumhoTire 수명 : " + (maxRotation - accumulatedRotation) + "회" );
		return true;
	}else {
		System.out.println("*** " + location + "KumhoTire 펑크 ***");
		return false;
		}
	}
}
package 타입변환과다형성.ex03;

public class HankookTire extends Tire {
	//필드
	//생성자
	public HankookTire(String location, int maxRocation) {
		super(location, maxRocation); 
	}
	//메소드
	@Override
	public boolean roll() {
	++accumulatedRotation;
	if(accumulatedRotation<maxRotation) {
		System.out.println(location + "HankookTire 수명 : " + (maxRotation - accumulatedRotation) + "회" );
		return true;
	}else {
		System.out.println("*** " + location + "HankookTire 펑크 ***");
		return false;
	}
  }
}

ex04

package 타입변환과다형성.ex03;

public class HankookTire extends Tire {
	//필드
	//생성자
	public HankookTire(String location, int maxRocation) {
		super(location, maxRocation); 
	}
	//메소드
	@Override
	public boolean roll() {
	++accumulatedRotation;
	if(accumulatedRotation<maxRotation) {
		System.out.println(location + "HankookTire 수명 : " + (maxRotation - accumulatedRotation) + "회" );
		return true;
	}else {
		System.out.println("*** " + location + "HankookTire 펑크 ***");
		return false;
	}
  }
}
package 타입변환과다형성.ex04;

public class Taxi extends Vehicle{

	public void run() {
		System.out.println("택시가 달립니다");
	}


}
package 타입변환과다형성.ex04;

public class Driver {
	public void driver(Vehicle vehicle) {
		vehicle.run();
	}
}
package 타입변환과다형성.ex04;

public class Driver_Ex {
	
	public static void main(String[] args) {
		
		Driver driver = new Driver();
		
		Vehicle vehicle = new Vehicle();
		
		driver.driver(vehicle);
		
		Bus bus = new Bus();
		driver.driver(bus);
	
		Taxi taxi = new Taxi();
		driver.driver(taxi);
	}
}
package 타입변환과다형성.ex04;

public class Bus extends Vehicle{

	public void run() {
		System.out.println("버스가 달립니다");
	}
}

ex05

package 타입변환과다형성.ex05_casting;

public class Parent {
	public String field1;
	
	public void method1() {
		System.out.println("Parent-method1()");
	}

	public void method2() {
		System.out.println("Parent-method2()");
	}
}
package 타입변환과다형성.ex05_casting;

public class Child extends Parent{
	public String field2;
	
	public void method3() {
		System.out.println("Child-method3()");
	}
}
package 타입변환과다형성.ex05_casting;

public class Child_Ex {
	public static void main(String[] args) {
		
		Parent parent = new Child();
		
		parent.field1 = "data1";
		parent.method1();
		parent.method2();
		
//		캐스팅 전 
//		parent.field2; 생성불가
		
//		자식 객체가 부모 타입으로 대입이 되고나서 다시 자식 객체로 대입이 필요할떄
//		이와같이 강제타입을 해서 값을 얻어내야함
		Child child = (Child) parent;
		child.field2 = "data2";	
		child.method3();
		
	}
	
}

ex06

package 타입변환과다형성.ex06_instanceof;

public class Parent {

}
package 타입변환과다형성.ex06_instanceof;

public class Child extends Parent{

}
package 타입변환과다형성.ex06_instanceof;

public class Instanceof_Ex {
	public static void main(String[] args) {
		
//		Parent parent = new Parent();
//		
//		if(parent instanceof Child) {
//			Child child = (Child) parent;
//		}else {
//			System.out.println("11");
//		}
		
		Parent parentA = new Child();
		method1(parentA);
		
		Parent parentB = new Parent();
		method1(parentB);
		}
	
	public static void method1(Parent parent) {
		if(parent instanceof Child) {
			Child child = (Child)parent;
			System.out.println("method1 - Child로 변환 성공");
		}else {
			System.out.println("method1 - Child로 변환되지 않음");
		}
		
	}

}

'JAVA > 복습' 카테고리의 다른 글

인터페이스  (0) 2020.07.22
추상클래스  (0) 2020.07.22
메소드 재정의(오버라이딩)  (0) 2020.07.22
getter_setter  (0) 2020.07.22
싱글톤, 파이널  (0) 2020.07.20
Comments