728x90
문제 1번
package exam05_instanceof;
public interface hipasspay_interface extends pay_interface {
public void HipassPay();
}
package exam05_instanceof;
public interface pay_interface {
public void Pay();
}
package exam05_instanceof;
public interface Vehicle {
public void run();
}
package exam05_instanceof;
import java.util.Scanner;
public class Bus implements Vehicle , pay_interface {
int inputpay = 0;
@Override
public void run() {
System.out.println("버스달림~부룽룽");
}
public void checkFare() {
System.out.println("버스기사: 얼마지불하셨소?");
System.out.println("당신이 지불하신 요금은 "+this.inputpay+" 입니다");
}
@Override
public void Pay() {
System.out.println("버스요금을 납부하세요");
Scanner sc = new Scanner(System.in);
inputpay = sc.nextInt();
}
}
package exam05_instanceof;
import java.util.Scanner;
public class Taxi implements Vehicle, hipasspay_interface{
int inputpay = 0;
int payhipass = 1000;
@Override
public void run() {
System.out.println("택시달림~부르릉");
}
public void checkFare() {
System.out.println("택시기사: 얼마지불하셨소?");
System.out.println("당신이 지불하신 요금은 "+this.inputpay+" 입니다");
}
@Override
public void Pay() {
System.out.println("택시 요금을 납부하세요");
Scanner sc = new Scanner(System.in);
inputpay = sc.nextInt();
}
@Override
public void HipassPay() {
System.out.println("택시는 자동으로 하이패스 요금을 납부됩니다");
System.out.println("지불될 요금은 "+this.payhipass+" 입니다");
}
}
문제 2번
public interface Driver_30 {
public int SPEED = 30;
public void Speed_30();
}
public interface Driver_60 {
public int SPEED = 60;
public void Speed_60();
}
public interface Driver_100 {
public int SPEED = 100;
public void Speed_100();
}
public class ADriver implements Driver_100, Driver_60, Driver_30{
@Override
public void Speed_30() {
System.out.println("운전모드 : 초보자 주행모드");
System.out.println("현재 속도는 "+Driver_30.SPEED+" 이하 입니다");
}
@Override
public void Speed_60() {
System.out.println("운전모드 : 숙련자 주행모드");
System.out.println("현재 속도는 "+Driver_60.SPEED+" 미만 입니다");
}
@Override
public void Speed_100() {
System.out.println("운전모드 : 전문가 주행모드");
System.out.println("현재 속도는 "+Driver_100.SPEED+" 이상 입니다");
}
}
package exam05_instanceof;
import java.util.Scanner;
public class ChooseAndRide extends OnTheRoad {
Bus bus = new Bus();
Taxi taxi = new Taxi();
public void chooseandride() {
System.out.println("당신은 천안에서 서울로 갑니다.");
System.out.println("버스와 택시중에 하나를 골라 입력해주세요");
Scanner sc = new Scanner(System.in);
String inputVehicle = sc.nextLine();
//문제1
if(inputVehicle.equals("버스")){
bus.run();
bus.Pay();
bus.checkFare();
// bus.HipassPay();
System.out.println("");
System.out.println("천안에서 서울로 출발합니다!");
ontheroad(inputVehicle);
} else if (inputVehicle.equals("택시")){
taxi.run();
taxi.Pay();
taxi.checkFare();
// taxi.HipassPay();
ontheroad(inputVehicle);
} else {
System.out.println("다시 입력해주세요");
return;
}
}
}
package exam05_instanceof;
public class OnTheRoad {
public void ontheroad(String inputVehicle) {
Driver_30 driver_30 = new ADriver();
ADriver aDriver = new ADriver();
Taxi taxi = new Taxi();
Bus bus = new Bus();
String[] Road = new String[]{"천안", "천안톨게이트", "고속도로", "서울톨게이트", "서울"};
for (int i = 0; i < Road.length; i++) {
if (Road[i] == Road[0]) {
System.out.println("-----------------------------");
System.out.println("현재 위치는 " + Road[0] + " 입니다");
driver_30.Speed_30();
//불가능
//driver_30.Speed_60();
//driver_30.Speed_100();
} else if (Road[i] == Road[1]) {
System.out.println("-----------------------------");
System.out.println("현재 위치는 " + Road[1] + " 입니다");
driver_30.Speed_30();
//불가능
//driver_30.Speed_60();
//driver_30.Speed_100();
//하이패스
if(inputVehicle.equals("택시")){
taxi.HipassPay();
}else if(inputVehicle.equals("버스")){
bus.HipassPay();
}
} else if (Road[i] == Road[2]) {
System.out.println("-----------------------------");
System.out.println("현재 위치는 " + Road[2] + " 입니다");
if (driver_30 instanceof ADriver) {
ADriver adriver = (ADriver) driver_30;
adriver.Speed_100();
//부모인척하던것을 다시 자식으로 형변환
//adriver.Speed_60();
//adriver.Speed_100();
//30,60,100모두가능
}
} else if (Road[i] == Road[3]) {
System.out.println("-----------------------------");
System.out.println("현재 위치는 " + Road[3] + " 입니다");
driver_30.Speed_30();
//하이패스
if(inputVehicle.equals("택시")){
taxi.HipassPay();
}else if(inputVehicle.equals("버스")){
bus.HipassPay();
}
} else if (Road[i] == Road[4]) {
System.out.println("-----------------------------");
System.out.println("현재 위치는 " + Road[4] + " 입니다");
driver_30.Speed_30();
System.out.println("-----------------------------");
}
}
}
}
main
package exam05_instanceof;
public class DriverExample {
public static void main(String[] args) {
ChooseAndRide choose = new ChooseAndRide();
choose.chooseandride();
}
}
형변환은 A -(상속)-> B 의 관계에서
1. 자식인B가 부모인 A인척을 할 수있고 (자동)
2. 부모인 A인 척 하던 B를 다시 자식으로 끌어 내릴 수 있다 (강제캐스팅)
형변환:
1. 부모인 interface와 자식인 class의 형변환 가능 (자동형변환 예)
Driver_30 driver_30 = new ADriver();
ADriver에는 속도 30,60,100이 있고, Driver_30에는 속도 30만 있다
위와 같이 형변환을 하게되면
driver_30.Speed_30();
//불가능
//driver_30.Speed_60();
//driver_30.Speed_100();
ADriver에 있는 속도 30,60,100을 모두 출력할 수 없고 Driver_30에 있는 속도 30만 접근이 가능하다
2. instaceof는 class와 interface를 비교할수있다. (강제캐스팅 예)
if (driver_30 instanceof ADriver) {
ADriver adriver = (ADriver) driver_30;
adriver.Speed_100();
//부모인척하던것을 다시 자식으로 형변환
//adriver.Speed_60();
//adriver.Speed_100();
//30,60,100모두가능
이렇게 형변환을 사용하는 이유는?
생활코딩에서 들었던 예인데,
요즘 나오는 전자 제품에는 수많은 기능이 있지만
우리는 그 많은 기능을 다 사용하지 않을 경우가 많고,
내가 주로 사용하는 기능만 사용하고 싶어질 것이다.
예를 들어
휴대폰을 구입하여 나이가 많은 할머니에게 드릴때
우리는 "이것은 전화기입니다 "라며 드린다면,
할머니는 전화의 기능만 사용하게 될 것이다.
반대로 나이가 어린 어린이에게 줄때
우리는 "이것은 게임기입니다"라며 준다면,
아이는 게임의 기능만을 사용하게 될 것이다.
이렇게 내가 사용하고 싶은 기능만을 사용하고 싶어질 때,
형변환을 하여 해당 기능만이 담긴 부모로 변환하여 사용할 수 있다는 것이
형변환을 사용하는 이유였다..
728x90
'STUDY > JAVA' 카테고리의 다른 글
[JAVA-이것이자바다.6장] 클래스 확인 문제 (0) | 2022.07.13 |
---|---|
[JAVA-이것이자바다.5장] 참조 타입 확인 문제 (0) | 2022.07.13 |
[JAVA]22-07-08 컬렉션 프레임워크 ☑ (0) | 2022.07.08 |
[JAVA] 22-07-07 인터페이스를 활용한 간식 먹기 문제 ☑ (0) | 2022.07.07 |
[JAVA-이것이자바다.4장] 조건문과 반복문 확인 문제 (0) | 2022.07.06 |