[JAVA]/08. 상속

13_4. [강의] 다형성3 예제(추상클래스&인터페이스 이용)

76beny 2022. 5. 29. 00:47

 

super class _ Car

package com.kh.ex04.poly_interface;

public abstract class Car { // 부모 클래스
	protected int cc = 0; // 배기량

	public Car(int cc) {
		this.cc = cc;
	}
	
	public void oilling() {
		System.out.println("주유중 입니다.");
	}
	
	public void move() {
		System.out.println("부릉부릉");
	}
	
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("Name : " + this.getClass().getSimpleName());
		sb.append(", cc : " + cc);
		return sb.toString();
	}
}

 

 

abstract class HyundaiCar extends Car

package com.kh.ex04.poly_interface;

public abstract class HyundaiCar extends Car {

	public HyundaiCar(int cc) {
		super(cc);
	}
	

	abstract public void nickName();
	

	public void service() { 
		System.out.println("블루핸즈로 출발합니다.");
	}
}

 

 

class Avante extends HyundaiCar

package com.kh.ex04.poly_interface;

public class Avante extends HyundaiCar {

	public Avante() {
		super(1600); // 아반떼는 1600cc 이다.
	}
	
	@Override
	public void oilling() {
		System.out.println("휘발유를 주유중입니다.");
	}

	@Override
	public void nickName() {
		System.out.println("아방이");
	}

}

 

class Grandure extends HyundaiCar

package com.kh.ex04.poly_interface;

public class Grandure extends HyundaiCar {

	public Grandure() {
		super(3000); // 3000cc
	}
	
	@Override
	public void oilling() {
		System.out.println("휘발유를 주유중입니다.");
	}
	
	@Override
	public void move() {
		System.out.println("(조용한)부르르르르릉");
	}
	
	@Override
	public void nickName() {
		System.out.println("각그랜저");
	}
}

 

class Sonata extends HyundaiCar

package com.kh.ex04.poly_interface;

public class Sonata extends HyundaiCar{

	public Sonata() {
		super(2000); // 2000 CC
	}
	
	@Override
	public void oilling() {
		System.out.println("휘발유를 주유중입니다.");
	}
	
	@Override
	public void move() {
		System.out.println("부르르르르릉");
	}
	
	@Override
	public void nickName() {
		System.out.println("소나 타는 차"); // 실제 이름의 유례, 고 정주영 회장님의...
	}
}

 

 

 

interface OverseasType

package com.kh.ex04.poly_interface;

public interface OverseasType {
//	void origin();//생산지역 메소드
	public abstract void origin();//추상메소드 선언
	
}

표준적인 문법(인터페이스 생성 시)
 public final static String 을 사용하면 다음과 같은 String을 만들 수 있습니다.

 1. 클래스 (static : 그것을 사용하는 데 필요한 인스턴스가 없음)에 속하며,

2. 클래스의 모든 인스턴스와 클래스를 사용하는 다른 객체에서 사용할 수있는

    String 상수를 정의하려는 경우와 같이 변경되지 않습니다 (final).

 

 

interface ElectricType

package com.kh.ex04.poly_interface;

public interface ElectricType { 
	
	// public abstract나 public static final 이 생략된 문법
	//	String GAS_TYPE = "ELECTRIC";
	//	void charge(); // 충전가능

	
	public static final String GAS_TYPE = "ELECTRIC";//가스타입을 일렉트로닉으로 바꾸기
	public abstract void charge();//충전가능//추상메소드 선언
}

 

 

 

abstract class TeslaCar extends Car

package com.kh.ex04.poly_interface;

public abstract class TeslaCar extends Car{ // 전기차 브랜드

	protected double kWh = 0; // 전기차에서 배기량과 같은 충전 용량
	
	public TeslaCar(double kWh) {//기존의 국산차와 다르게 double kWh매개변수로 넣고
		super(0);//앞에서 cc규격이였던 super는 0으로 하고
		this.kWh = kWh;//kWh라는 전기차의 배기량규격을 this로 생성한다.
	} 
	
	@Override//생성
	public void move() {//조상 메소드
		System.out.println("거의 무음");
	}
	
	//추가로 buyBitcoin이라는 추상메소드 선언!
	// 테슬라차는 특별히 bit 코인으로 거래 가능!!
	public abstract void buyBitcoin();//abstract선언했기때문에 위에 클래스 이름에도 들어가야 함
	
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("Name : " + this.getClass().getSimpleName());
		sb.append(", Brand : Tesla");
		sb.append(", kWh : " + kWh);
		return sb.toString();
	}

}

 

 

 

class BMWM5 extends Car implements OverseasType

package com.kh.ex04.poly_interface;

public class BMWM5 extends Car implements OverseasType{//implements OverseasType추가해줌

	public BMWM5() {
		super(4395); // cc가 커지면 배기량 올라감 = 힘, 토크, 마력
	}
	
	@Override
	public void oilling() {
		System.out.println("고급 휘발유를 주유중입니다.");
		System.out.println("기름을 땅바닥에 뿌립니다.");
	}
	
	@Override
	public void move() {
		System.out.println("부와와와와와왕아아아앙앙(시끄럽게)");
	}

	@Override
	public void origin() {
		System.out.println("Made in german");
	}
}

 

 

 

class TeslaModel3 extends TeslaCar implements ElectricType, OverseasType

package com.kh.ex04.poly_interface;

public class TeslaModel3 extends TeslaCar implements ElectricType, OverseasType{
	// 생성한 인터페이스인 ElectricType와 OverseasType를 implements(구현) 시킨다.

	public TeslaModel3() {
		super(175);
	}

	@Override
	public void oilling() {
		charge();//오일링의 표준을 맞춰주기 위해서 charge();로 변경해줌
	}
	
	@Override
	public void buyBitcoin() {
		System.out.println("1 Bit coin으로 구매합니다.");
	}

	
	//하단의 origin와 charge는 생성되기 전에 클래스명의 TeslaModel3에서 빨간줄이 뜬다.
	//why? 구현시킨 인터페이스ElectricType와 OverseasType 내의 origin과 charge메소드가
	//abstract(추상) 으로 선언되어있기 때문에! 그래서 하단에서 오버라이드 해줘야 함
	
	@Override //생성
	public void origin() {
		System.out.println("Made in china");
	}

	@Override //생성
	public void charge() {
		System.out.println("전기차를 충전합니다.");
		System.out.println("1시간 기다려주세요.");
	}
}

 

 

 

Run

package com.kh.ex04.poly_interface;
//다형성....................................
public class _Run {

	public static void main(String[] args) {
		Car[] carArray = new Car[5]; //테슬라 추가해서 5로 변경하기
//		System.out.println(Arrays.toString(carArray));

//		carArray[0] = new Car(1000); // 추상클래스는 생성되지 않음!
		carArray[0] = new Avante(); 
		carArray[1] = new Sonata(); 
		carArray[2] = new Grandure(); 
		carArray[3] = new BMWM5();
		carArray[4] = new TeslaModel3();
		
		for(int i = 0; i<carArray.length; i++) {
//			((Avante)carArray[i]).oilling(); // java.lang.ClassCastException
			printCar(carArray[i]);
		}
	}
	
	private static void printCar(Car car) { // 인자가 다형성 속성을 사용중
		System.out.println(car.toString());
		
		car.move();//move는 해외차던 국산차던 다 똑같이 존재.

		//charge는 ElectricType만 존재함!
		if(car instanceof ElectricType) { // 전기// car의 instanceof가 ElectricType일때
			((ElectricType)car).charge();//car를 ElectricType으로 변경하고, charge로 호출한다.
		}else { // 기름 자동차// else일 경우
			car.oilling();//car에 oilling을 호출시킨다.
		}
		if(car instanceof HyundaiCar) { // 현대 브랜드인지
			((HyundaiCar)car).nickName(); // 추상클래스로 Type Casting이 가능하다!
			((HyundaiCar)car).service();
		}
		if(car instanceof TeslaCar) { // 테슬라 브랜드인지
			((TeslaCar)car).buyBitcoin();
		}
		if(car instanceof OverseasType) {//해외타입이니?
			((OverseasType)car).origin();//그러면 지역좀 알려줘~ 이런뜻?!
		}
		System.out.println("--------------------------------------");
	}
}

[출력부]

Name : Avante, cc : 1600
부릉부릉
휘발유를 주유중입니다.
아방이
블루핸즈로 출발합니다.
--------------------------------------
Name : Sonata, cc : 2000
부르르르르릉
휘발유를 주유중입니다.
소나 타는 차
블루핸즈로 출발합니다.
--------------------------------------
Name : Grandure, cc : 3000
(조용한)부르르르르릉
휘발유를 주유중입니다.
각그랜저
블루핸즈로 출발합니다.
--------------------------------------
Name : BMWM5, cc : 4395
부와와와와와왕아아아앙앙(시끄럽게)
고급 휘발유를 주유중입니다.
기름을 땅바닥에 뿌립니다.
Made in german
--------------------------------------
Name : TeslaModel3, Brand : Tesla, kWh : 175.0
거의 무음
전기차를 충전합니다.
1시간 기다려주세요.
1 Bit coin으로 구매합니다.
Made in china
--------------------------------------

 

 


"본 인터넷 사이트 내의 모든 이미지, 문구, 콘텐츠, 내용 등에 대한 저작권은 76beny에게 있습니다.

이를 무단으로 도용, 복사, 전재, 재배포, 2차 변형 등을 할 경우

민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."