13_4. [강의] 다형성3 예제(추상클래스&인터페이스 이용)
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차 변형 등을 할 경우
민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."