Beny's Study

13_3. [강의] 다형성2 예제(추상클래스 이용) 본문

[JAVA]/09. 다형성

13_3. [강의] 다형성2 예제(추상클래스 이용)

76beny 2022. 5. 29. 00:38
 

 

super class _Car

package com.kh.ex03.poly_abstract;

public abstract class Car { // 부모 클래스,abstract 추상클래스로 만들어 버림
	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.ex03.poly_abstract;

public abstract class HyundaiCar extends Car {//HyundaiCar(브랜드)를 추상클래스로 하나 만들기
	
	public HyundaiCar(int cc) {
		super(cc);

	}
	
	//현대종류 차들이 공통적으로 각자 가지고 있었던 nickName을 추상메소드로 만들어버림!!!
	abstract public void nickName();//앞으로 nickName이렇게만 쓰라고 고정시키는것

	//일반메소드 : 공통적인 기능을 가질때 사용.
	//현대차는 블루핸즈에서 수리받을수 있다(가정)해서 service로 메소드 추가로 생성함.
	public void service() { 
		System.out.println("블루핸드로 출발합니다.");
	}

//	public static void main(String[] args) { // 생성 불가능함. why?
//		HyundaiCar Car = new HyundaiCar(13) {//추상클래스는 생성되지 않기 떄문이다!
//	}


}

추상클래스 특징

1.생성되지 않는다.
2.abstract 메소드를 가질 수 있다.
3. 일반 메소드나 멤버변수 선언이 자유롭다.
사용방법: 상속이나  Type으로 활용된다.

 

abstract public void nickName();

추상메소드 : 몸통을 가지지 않는다! 그리고 상속받은 클래스에서 강제로 생성한다.

 

Sonata extends HyundaiCar

package com.kh.ex03.poly_abstract;

public class Sonata extends HyundaiCar{
	//why? HyundaiCar.java에서 상속했기 때문에 바꾸기 (Car>HyundaiCar>Sonata)개념

	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("소나 타는 차"); 
	}
}

SonatanickName을 nickName으로 변경한다(예제 1과 다른점)
why? Sonata보다 상위클래스인 HyundaiCar에서 각 차들의 각각 설정된 닉네임을
abstract public void nickName();로 추상메소드로 만들었기 때문에!

 

Grandure extends HyundaiCar

package com.kh.ex03.poly_abstract;

public class Grandure extends HyundaiCar {//클래스 이름을 Car->HyundaiCar로 변경한다 
	//why? HyundaiCar.java에서 상속했기 때문에 바꾸기 (Car>HyundaiCar>Grandure)개념

	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("각그랜저");
	}
}

GrandurenickName을 nickName으로 변경한다(예제 1과 다른점)
why? Grandure보다 상위클래스인 HyundaiCar에서 각 차들의 각각 설정된 닉네임을
abstract public void nickName();로 추상메소드로 만들었기 때문에!

 

Avante extends HyundaiCar 

package com.kh.ex03.poly_abstract;

public class Avante extends HyundaiCar {//클래스 이름을 Car->HyundaiCar로 변경한다 
	//why? HyundaiCar.java에서 상속했기 때문에 바꾸기 (Car>HyundaiCar>Avante)개념

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

	@Override
	public void nickName() {//부모클래스의 메소드를 자식이 사용하기 위해 오버라이드!
		System.out.println("아방이");
	}

}

AvantenickName을 nickName으로 변경한다(예제 1과 다른점)
why? Avante보다 상위클래스인 HyundaiCar에서 각 차들의 각각 설정된 닉네임을
abstract public void nickName();로 추상메소드로 만들었기 때문에!

 

 

BMWM5 extends Car

package com.kh.ex03.poly_abstract;

public class BMWM5 extends Car{

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

	void doc3sa() { // 독삼사 = BMW, 벤츠, 아우디
		System.out.println("나는 독일에서 온 자동차야.");
	}
}

 

 

 

TeslaModel3 extends Car

package com.kh.ex03.poly_abstract;

public class TeslaModel3 extends Car {
	//다른 규격의 자동차모델 자식클래스를 생성했을경우! => 어떻게하는지 ex04에서 보자!

	// 전기차인데... CC?
	public TeslaModel3() {// 해외 전기차이기때문에 현대차랑 규격(연비단위) 틀림(가정한다)
		super(175); // kw/h 단위인데... cc?
	}

	@Override//생성
	public void oilling() { // 호환 안되는듯?// 전기차는 오일링이 아닌데 그냥 연습하는거라 가정후 입력 
		System.out.println("충전중인데... 오일링?");
	}
	
	@Override//생성
	public void move() {
		System.out.println("(조용히) 위이이이이이잉");
	}
}

 

 

 

Run

package com.kh.ex03.poly_abstract;

public class _Run {

	public static void main(String[] args) {
		Car[] carArray = new Car[4];// 4로 변경
		//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();

		for (int i = 0; i < carArray.length; i++) {
			//((Avante)carArray[i]).oilling(); // java.lang.ClassCastException(오류뜸)
			// why? 캐스팅 잘못해서(형변환 잘못해서?) => 형변환 함부로 하면 안되고 instanceof로 타입 체크하면서 변환해야함!
			//출력하면 인덱스 0은 같은 아반떼라 출력이 되는데 나머지는 아반떼랑 상속관계아니라서 출력안되고 오류
			printCar(carArray[i]);
		}
	}

	private static void printCar(Car car) { // 인자가 다형성 속성을 사용중
		System.out.println(car.toString());

		car.move(); 
		car.oilling();

		//ex02패키지의 Run 에서 instanceof뒤에 현대 차종류 별로 각각 되있던걸 새로 생성한 상위추상클래스인HyundaiCar 로 변경해줌.
		if (car instanceof HyundaiCar) {
			((HyundaiCar) car).nickName(); 
			((HyundaiCar) car).service();
		}
		if (car instanceof BMWM5) {
			((BMWM5) car).doc3sa();
		}
		System.out.println("--------------------------------------");
	}
}

car.move(); & car.oilling();

동적 바인딩 : 실행 전에 호출될 메소드를 정하지 않고,실행 후 실시간(동적)으로 메소드를 호출하는 방법

 

 (car instanceof HyundaiCar)

instanceof는 상속관계 확인해준다

 

((HyundaiCar) car).nickName();

추상클래스로 Type Casting이 가능하다!즉, HyundaiCar를 타입으로 씀!

((HyundaiCar) car).service();

현대차는 모두 블루핸즈로 출발합니다가 뜸(HyundaiCar추상클래스에 있던 메소드)

 

[출력부]

Name : Avante, cc : 1600
부릉부릉
휘발유를 주유중입니다.
아방이
블루핸드로 출발합니다.
--------------------------------------
Name : Sonata, cc : 2000
부르르르르릉
휘발유를 주유중입니다.
소나 타는 차
블루핸드로 출발합니다.
--------------------------------------
Name : Grandure, cc : 3000
(조용한)부르르르르릉
휘발유를 주유중입니다.
각그랜저
블루핸드로 출발합니다.
--------------------------------------
Name : BMWM5, cc : 4395
부와와와와와왕아아아앙앙(시끄럽게)
고급 휘발유를 주유중입니다.
기름을 땅바닥에 뿌립니다.
나는 독일에서 온 자동차야.
--------------------------------------

 

 


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

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

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